摘要:的不可變性眾所周知,是常量,不可變,這一點(diǎn)很重要。那中,包裝類(lèi)的一個(gè)特質(zhì)就是值操作時(shí)體現(xiàn)對(duì)應(yīng)的基本類(lèi)型的特質(zhì)。同樣的,等這些包裝類(lèi)和在這種情況下的表現(xiàn)是相同的。那么無(wú)論你對(duì)傳入?yún)?shù)做了什么操作,都不會(huì)影響原來(lái)的值。
1. String的不可變性
眾所周知,String是常量,不可變,這一點(diǎn)很重要。
其底層的實(shí)現(xiàn)是char[]:
/** The value is used for character storage. */ private final char value[];
而且,它是final的。
看兩個(gè)構(gòu)造函數(shù):
/** * Initializes a newly created {@code String} object so that it represents * the same sequence of characters as the argument; in other words, the * newly created string is a copy of the argument string. Unless an * explicit copy of {@code original} is needed, use of this constructor is * unnecessary since Strings are immutable. * * @param original * A {@code String} */ public String(String original) { this.value = original.value; this.hash = original.hash; } /** * Allocates a new {@code String} so that it represents the sequence of * characters currently contained in the character array argument. The * contents of the character array are copied; subsequent modification of * the character array does not affect the newly created string. * * @param value * The initial value of the string */ public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }
其內(nèi)部的很多方法,也是會(huì)新生成一個(gè)char[]來(lái)構(gòu)造一個(gè)新的String對(duì)象返回。
例如replace:
/** * Returns a new string resulting from replacing all occurrences of *oldChar
in this string withnewChar
. */ public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i < len) { if (val[i] == oldChar) { break; } } if (i < len) { char buf[] = new char[len]; for (int j = 0; j < i; j++) { buf[j] = val[j]; } while (i < len) { char c = val[i]; buf[i] = (c == oldChar) ? newChar : c; i++; } return new String(buf, true); } } return this; }
doc中寫(xiě)的很明白,這個(gè)方法,會(huì)新生成一個(gè)String對(duì)象返回。
所以類(lèi)似
str = str.replace("a","b"); str = str.substring(2); str = str.toLowerCase();
都會(huì)生成新的對(duì)象。原來(lái)的對(duì)象還是存在的,只是沒(méi)有引用指向它,等待被垃圾回收。
2.傳遞String類(lèi)型參數(shù)看一個(gè)例子:
public class StringTest { public static void main(String[] args) { StringTest stringTest = new StringTest(); String string = "abc"; stringTest.replace(string); System.out.println(string); Integer i = 1; stringTest.add(i); System.out.println(i); } public void replace(String string) { string = string.replace("a", "b"); string = string.toUpperCase(); System.out.println("inner:" + string); } public void add(Integer integer) { integer++; System.out.println("inner:" + integer); } }
Stirng內(nèi)部實(shí)現(xiàn)時(shí),是用char[] 來(lái)存儲(chǔ)字符串的,所以String相當(dāng)于char[]的包裝類(lèi)。那java中,包裝類(lèi)的一個(gè)特質(zhì)就是值操作時(shí)體現(xiàn)對(duì)應(yīng)的基本類(lèi)型的特質(zhì)。同樣的,Integer、Float等這些包裝類(lèi)和String在這種情況下的表現(xiàn)是相同的。
分析一下,主要是還是由于包裝類(lèi)內(nèi)部實(shí)現(xiàn)方式導(dǎo)致的。
包裝類(lèi)內(nèi)部存儲(chǔ)結(jié)構(gòu)是final的原生類(lèi)型,或原生類(lèi)型數(shù)組,是不可變的。之后所做的操作都會(huì)新生成一個(gè)對(duì)象來(lái)返回。那么無(wú)論你對(duì)傳入?yún)?shù)做了什么操作,都不會(huì)影響原來(lái)的值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65679.html
摘要:看個(gè)問(wèn)題此時(shí)的值是什么呢帶著這樣的疑問(wèn),開(kāi)始今天的話題的那些事。問(wèn)題分析為什么會(huì)有這個(gè)問(wèn)題呢上周在項(xiàng)目中,會(huì)對(duì)頁(yè)面標(biāo)簽綁定些事件,會(huì)用到內(nèi)容。總結(jié)寫(xiě)在最后,對(duì)于的事情還不完整,歡迎補(bǔ)充補(bǔ)充。 看個(gè)問(wèn)題test,此時(shí)href的值是什么呢?帶著這樣的疑問(wèn),開(kāi)始今天的話題‘href的那些事’。 問(wèn)題分析 為什么會(huì)有這個(gè)問(wèn)題呢?上周在項(xiàng)目中,msui會(huì)對(duì)頁(yè)面a標(biāo)簽綁定些事件,會(huì)用到href內(nèi)容...
摘要:隱式類(lèi)型轉(zhuǎn)換類(lèi)型轉(zhuǎn)類(lèi)型先定義一個(gè)類(lèi)型的變量只要類(lèi)型跟類(lèi)型還是類(lèi)型用號(hào),其他類(lèi)型都會(huì)被轉(zhuǎn)為字符串輸出結(jié)果字符串類(lèi)型轉(zhuǎn)類(lèi)型或者類(lèi)型定義類(lèi)型的變量與類(lèi)型的變量前端從測(cè)試結(jié)果可以看出,類(lèi)型在跟數(shù)字類(lèi)型做乘除減運(yùn)算時(shí),得到的是數(shù)字類(lèi)型的值,但是類(lèi)型必 隱式類(lèi)型轉(zhuǎn)換 number類(lèi)型轉(zhuǎn)string類(lèi)型 //先定義一個(gè)number類(lèi)型的變量 //只要string類(lèi)型跟boolean類(lèi)型還是numbe...
摘要:關(guān)于如何限速,有兩個(gè)比較出名的算法,漏桶算法與令牌桶算法,這里對(duì)其簡(jiǎn)單介紹一下,最后再實(shí)踐在我發(fā)郵件的中以下是發(fā)送郵件的,已限制為一分鐘兩次,你可以通過(guò)修改進(jìn)行試驗(yàn)。 前段時(shí)間,我使用了 jwt 來(lái)實(shí)現(xiàn)郵箱驗(yàn)證碼的校驗(yàn)與用戶(hù)認(rèn)證與登錄,還特別寫(xiě)了一篇文章作為總結(jié)。 在那篇文章中,提到了一個(gè)點(diǎn),如何限速。 在短信驗(yàn)證碼和郵箱驗(yàn)證碼,如果不限速,被惡意攻擊造成大量的 QPS,不僅拖垮了服務(wù)...
摘要:為了提高程序運(yùn)行的效率,在軟件發(fā)布后,檢查默認(rèn)是被關(guān)閉的。注意不能保證原子性,不能代替,且其會(huì)阻止編譯器對(duì)代碼的優(yōu)化。以下方法用來(lái)判斷一個(gè)字符串中是否包含中文字符。 前言 面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問(wèn)題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開(kāi)來(lái),那么這就是你的優(yōu)勢(shì),本系列將講述一些java面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 主要內(nèi)容 assert有什么作...
摘要:小程序的登錄跟平時(shí)自己這種登錄驗(yàn)證還不太一樣,多了一個(gè)角色,那就是微信服務(wù)器。的有效期默認(rèn)是小時(shí),當(dāng)用戶(hù)一直在使用小程序的話會(huì)自動(dòng)刷新,這個(gè)是由微信這邊來(lái)維護(hù)的。 最近團(tuán)隊(duì)在開(kāi)發(fā)一款小程序,都是新手,一邊看文檔,一邊開(kāi)發(fā)。在開(kāi)發(fā)中會(huì)遇到各種問(wèn)題,今天把小程序登錄這塊的流程整理下,做個(gè)記錄。 小程序的登錄跟平時(shí)自己APP這種登錄驗(yàn)證還不太一樣,多了一個(gè)角色,那就是微信服務(wù)器。 showI...
閱讀 2093·2023-04-25 17:57
閱讀 1293·2021-11-24 09:39
閱讀 2492·2019-08-29 16:39
閱讀 3321·2019-08-29 13:44
閱讀 3137·2019-08-29 13:14
閱讀 2328·2019-08-26 11:36
閱讀 3823·2019-08-26 11:00
閱讀 955·2019-08-26 10:14