日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何理解在数据类型中元素不能修改?

發(fā)布時間:2024/7/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何理解在数据类型中元素不能修改? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何理解在數(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)建后,不再支持添加、刪除等操作

word = 'abcdefgh' word[0] = 'm' print(word)

  • List(列表)可以完成大多數(shù)集合類的數(shù)據(jù)結(jié)構(gòu)實現(xiàn),元素類型可以不相同,列表的元素可以修改。。
a = [0,1,2,3,4,5,6,7,8,9] a[2:5] = [11,11,11] print(a)

  • Tuple(元組)與列表類似,但是元組的元素不能修改
tuple = ('abc',123,3.14,'kim') tuple[0] = 'love'print(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。