如何理解在数据类型中元素不能修改?
如何理解在數據類型中元素不能修改?
我所理解的元素修改是:
不能對已經賦值或者初始化的數據類型進行元素的修改,這里的修改不是指片面意思上的輸錯了數值,將光標移到對應位置,按下刪除鍵,再進行數據的修改等操作,也不是指對對象的重新賦值。
重新賦值:初始化完成后又進行重新賦值
修改:創建后對象后對某些元素進行添加、刪除等操作
- 例如Python中字符串不能被改變,word=[‘abcdefgh’],如果運行word[0] = 'm’會導致錯誤==‘str’ object does not support item assignment.==
關于字符串原碼詳細的信息,可以查看https://zhuanlan.zhihu.com/p/120980114
變長可變對象 - 例如 List,創建后還能添加、刪除元素
變長不可變對象 - 例如 String,Tuple, 創建后,不再支持添加、刪除等操作
- List(列表)可以完成大多數集合類的數據結構實現,元素類型可以不相同,列表的元素可以修改。。
- Tuple(元組)與列表類似,但是元組的元素不能修改。
在Java語言中,菜鳥教程中解析了String類不可改變的實例。簡單來說:String類利用了final修飾的char類型數組存儲字符。字符串的本質是字符數組,value屬性用來存放字符串中的字符,final屬性修飾,是不可被修改的。
以下內容來源https://www.cnblogs.com/Java-JJ/p/12625888.html
String不可變但不代表引用不可以變
String str = “Hello”;
str = str + " World";
System.out.println(“str=” + str);
結果:
str=Hello World
解析:
實際上,原來String的內容是不變的,只是str由原來指向"Hello"的內存地址轉為指向"Hello World"的內存地址而已,也就是說多開辟了一塊內存區域給"Hello World"字符串。
通過反射是可以修改所謂的“不可變”對象
// 創建字符串"Hello World", 并賦給引用s
String s = “Hello World”;
System.out.println("s = " + s); // Hello World
// 獲取String類中的value字段
Field valueFieldOfString = String.class.getDeclaredField(“value”);
// 改變value屬性的訪問權限
valueFieldOfString.setAccessible(true);
// 獲取s對象上的value屬性的值
char[] value = (char[]) valueFieldOfString.get(s);
// 改變value所引用的數組中的第5個字符
value[5] = ‘_’;
System.out.println("s = " + s); // Hello_World
結果:
s = Hello World
s = Hello_World
解析:
用反射可以訪問私有成員, 然后反射出String對象中的value屬性, 進而改變通過獲得的value引用改變數組的結構。但是一般我們不會這么做,這里只是簡單提一下有這個東西。
是否可以繼承 String 類
String 類是 final 類,不可以被繼承。
重新賦值的“背后”
- 對于String類對象重新賦值
執行代碼:
public class Text01 {public static void main(String[] args) {String s = "Google";System.out.println("s = " + s);s = "Runobb";System.out.println("s = " + s);} }得到的結果:
s = Google s = Runobb兩次輸出字符串string的結果看似是改變了,但是第一次賦值的“Google”還存放在內存中。
原因在于實例中的 s 只是一個 String 對象的引用,并不是對象本身,當執行 s = “Runoob”; 創建了一個新的對象 “Runoob”,而原來的 “Google” 還存在于內存中。
Java虛擬機中,棧(stack)中分配的是基本數據類型和自定義對象的引用。堆(heap)中分配的是對象,創建new的對象。方法區中存放的是類的信息、static變量、常量。當執行 s = "Runoob"時,對象 s 指向棧中新的引用“Runoob”。所以s的結果看似改變,實則是和棧中另外的值手牽手了,而舊相好"Google"還在棧中原來的地方靜靜等待著。所以說String對象是不可變的,"Google"還在原來的地方,沒有任何改變。
以上是自己在學習過程中對于數據類型的元素是否可以被修改的理解,如果哪里有錯誤,還請提醒一下。
總結
以上是生活随笔為你收集整理的如何理解在数据类型中元素不能修改?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网--单词倒排(Java)
- 下一篇: Leetcode--238. 除自身以外