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