摘要:什么是不可變對象如果一個(gè)對象,在它創(chuàng)建完成后,不能在改變它的狀態(tài),那么這個(gè)對象就是不可變的。而在中,是封裝的數(shù)組,是在這個(gè)數(shù)組中的起始位置,是所占的字符的個(gè)數(shù)。
這是之前在網(wǎng)上看到的一個(gè)問題,我就是總結(jié)一下。
什么是不可變對象:
如果一個(gè)對象,在它創(chuàng)建完成后,不能在改變它的狀態(tài),那么這個(gè)對象就是不可變的。不能改變這個(gè)對象的狀態(tài)就是:不改變對象內(nèi)的成員變量,包括基本數(shù)據(jù)類型的值不能改變,引用類型的變量不能指向其他的對象,引用類型指向的對象的狀態(tài)也不能改變。
String類是一個(gè)final類,是不能被繼承的
區(qū)分對象和對象的引用
public class Person { public static void main(String[] args) { String s = "abcd"; System.out.println("s = "+s); s = "123456"; System.out.println("s = "+s); } }
這里的s看上去被改變了,但是s卻是String對象的引用,它指向了一個(gè)具體的對象,而s的改變其實(shí)就是它所指向的對象發(fā)生了改變。
private final char value[];
//String是將輸入的字符串封裝為字符數(shù)組value[]就是這個(gè)數(shù)組的長度
private int hash;
//是對象的哈西值的緩存
以上是JDK 1.7中的String源代碼,由以上代碼可以看出
String其實(shí)就是對字符數(shù)組的封裝,在java中數(shù)組也是對象,value也只是一個(gè)引用,它指向了一個(gè)真正的數(shù)組對象。而在JDK 1.6中, value是String封裝的數(shù)組,offset是String在這個(gè)value數(shù)組中的起始位置,count是String所占的字符的個(gè)數(shù)。也可以得出這個(gè)結(jié)論的
并且我們發(fā)現(xiàn)value,offset,count都是private final,并且類中也沒有提供get()和set()方法。這點(diǎn)也可以看出String是無法修改的.
謝謝:http://www.importnew.com/16817.html提供的文章
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66183.html
摘要:性能當(dāng)字符串是不可變時(shí),字符串常量池才有意義。字符串常量池的出現(xiàn),可以減少創(chuàng)建相同字面量的字符串,讓不同的引用指向池中同一個(gè)字符串,為運(yùn)行時(shí)節(jié)約很多的堆內(nèi)存。 在學(xué)習(xí)Java的過程中,我們會(huì)被告知 String 被設(shè)計(jì)成不可變的類型。為什么 String 會(huì)被 Java 開發(fā)者有如此特殊的對待?他們的設(shè)計(jì)意圖和設(shè)計(jì)理念到底是什么?因此,我?guī)е韵氯齻€(gè)問題,對 String 進(jìn)行剖析: ...
摘要:我們都知道中的類的設(shè)計(jì)是不可變的,來看下類的源碼。其值也就是對字符數(shù)組的封裝,即,其值被定義成的,說明不能通過外界修改,即不可變。真的不可變嗎來看下面這個(gè)例子。所以說,這里的字符串并不是可變,只是變更了字符串引用。 我們都知道 Java 中的 String 類的設(shè)計(jì)是不可變的,來看下 String 類的源碼。 public final class String implemen...
摘要:但是通過構(gòu)造函數(shù)的并不是。通過構(gòu)造函數(shù)創(chuàng)建的變量在機(jī)制上與其他對象一致,都是在上創(chuàng)建新的對象,然后把引用賦給變量。此外,的方法和等方法實(shí)現(xiàn)均是調(diào)用了構(gòu)造函數(shù)創(chuàng)建了新的對象,所以他們返回的也都是存在于上的新對象。 String經(jīng)常在一個(gè)語言中或多或少都有些特殊地位。在Java亦不例外。今天先來討論,String是不可變的。 String是引用類型,String變量儲(chǔ)存一個(gè)地址,地址指向內(nèi)...
摘要:所有變量的類型在編譯時(shí)已知在程序運(yùn)行之前,因此編譯器也可以推導(dǎo)出所有表達(dá)式的類型。像變量的類型一樣,這些聲明是重要的文檔,對代碼讀者很有用,并由編譯器進(jìn)行靜態(tài)檢查。對象類型的值對象類型的值是由其類型標(biāo)記的圓。 大綱 1.編程語言中的數(shù)據(jù)類型2.靜態(tài)與動(dòng)態(tài)數(shù)據(jù)類型3.類型檢查4.易變性和不變性5.快照圖6.復(fù)雜的數(shù)據(jù)類型:數(shù)組和集合7.有用的不可變類型8.空引用9.總結(jié) 編程語言中的數(shù)據(jù)...
摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時(shí)又保留了解釋型語言可移植的特點(diǎn)。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...
閱讀 2006·2021-11-24 10:45
閱讀 1862·2021-10-09 09:43
閱讀 1303·2021-09-22 15:38
閱讀 1230·2021-08-18 10:19
閱讀 2849·2019-08-30 15:55
閱讀 3070·2019-08-30 12:45
閱讀 2975·2019-08-30 11:25
閱讀 365·2019-08-29 11:30