成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

String那些事

gghyoo / 3510人閱讀

摘要:的不可變性眾所周知,是常量,不可變,這一點(diǎn)很重要。那中,包裝類的一個特質(zhì)就是值操作時體現(xiàn)對應(yīng)的基本類型的特質(zhì)。同樣的,等這些包裝類和在這種情況下的表現(xiàn)是相同的。那么無論你對傳入?yún)?shù)做了什么操作,都不會影響原來的值。

1. String的不可變性

眾所周知,String是常量,不可變,這一點(diǎn)很重要。
其底層的實(shí)現(xiàn)是char[]

    /** The value is used for character storage. */
    private final char value[];

而且,它是final的。

看兩個構(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)部的很多方法,也是會新生成一個char[]來構(gòu)造一個新的String對象返回。
例如replace:

    /**
     * Returns a new string resulting from replacing all occurrences of
     * oldChar in this string with newChar.
     */
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中寫的很明白,這個方法,會新生成一個String對象返回。

所以類似

str = str.replace("a","b");
str = str.substring(2);
str = str.toLowerCase();

都會生成新的對象。原來的對象還是存在的,只是沒有引用指向它,等待被垃圾回收。

2.傳遞String類型參數(shù)

看一個例子:

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)時,是用char[] 來存儲字符串的,所以String相當(dāng)于char[]的包裝類。那java中,包裝類的一個特質(zhì)就是值操作時體現(xiàn)對應(yīng)的基本類型的特質(zhì)。同樣的,Integer、Float等這些包裝類和String在這種情況下的表現(xiàn)是相同的。

分析一下,主要是還是由于包裝類內(nèi)部實(shí)現(xiàn)方式導(dǎo)致的。
包裝類內(nèi)部存儲結(jié)構(gòu)是final的原生類型,或原生類型數(shù)組,是不可變的。之后所做的操作都會新生成一個對象來返回。那么無論你對傳入?yún)?shù)做了什么操作,都不會影響原來的值。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65679.html

相關(guān)文章

  • href的那些

    摘要:看個問題此時的值是什么呢帶著這樣的疑問,開始今天的話題的那些事。問題分析為什么會有這個問題呢上周在項(xiàng)目中,會對頁面標(biāo)簽綁定些事件,會用到內(nèi)容??偨Y(jié)寫在最后,對于的事情還不完整,歡迎補(bǔ)充補(bǔ)充。 看個問題test,此時href的值是什么呢?帶著這樣的疑問,開始今天的話題‘href的那些事’。 問題分析 為什么會有這個問題呢?上周在項(xiàng)目中,msui會對頁面a標(biāo)簽綁定些事件,會用到href內(nèi)容...

    rose 評論0 收藏0
  • 淺談隱式類型轉(zhuǎn)換與顯示類型轉(zhuǎn)換的那些

    摘要:隱式類型轉(zhuǎn)換類型轉(zhuǎn)類型先定義一個類型的變量只要類型跟類型還是類型用號,其他類型都會被轉(zhuǎn)為字符串輸出結(jié)果字符串類型轉(zhuǎn)類型或者類型定義類型的變量與類型的變量前端從測試結(jié)果可以看出,類型在跟數(shù)字類型做乘除減運(yùn)算時,得到的是數(shù)字類型的值,但是類型必 隱式類型轉(zhuǎn)換 number類型轉(zhuǎn)string類型 //先定義一個number類型的變量 //只要string類型跟boolean類型還是numbe...

    atinosun 評論0 收藏0
  • [登錄那些] 郵件發(fā)送,限流,漏桶與令牌桶

    摘要:關(guān)于如何限速,有兩個比較出名的算法,漏桶算法與令牌桶算法,這里對其簡單介紹一下,最后再實(shí)踐在我發(fā)郵件的中以下是發(fā)送郵件的,已限制為一分鐘兩次,你可以通過修改進(jìn)行試驗(yàn)。 前段時間,我使用了 jwt 來實(shí)現(xiàn)郵箱驗(yàn)證碼的校驗(yàn)與用戶認(rèn)證與登錄,還特別寫了一篇文章作為總結(jié)。 在那篇文章中,提到了一個點(diǎn),如何限速。 在短信驗(yàn)證碼和郵箱驗(yàn)證碼,如果不限速,被惡意攻擊造成大量的 QPS,不僅拖垮了服務(wù)...

    wpw 評論0 收藏0
  • 【面試】Java基礎(chǔ)的那些-Thr

    摘要:為了提高程序運(yùn)行的效率,在軟件發(fā)布后,檢查默認(rèn)是被關(guān)閉的。注意不能保證原子性,不能代替,且其會阻止編譯器對代碼的優(yōu)化。以下方法用來判斷一個字符串中是否包含中文字符。 前言 面試中對于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應(yīng)的知識點(diǎn)擴(kuò)展開來,那么這就是你的優(yōu)勢,本系列將講述一些java面試中的事,不會很詳細(xì),但是應(yīng)該比較全面吧。 主要內(nèi)容 assert有什么作...

    ShowerSun 評論0 收藏0
  • 微信小程序登錄那些

    摘要:小程序的登錄跟平時自己這種登錄驗(yàn)證還不太一樣,多了一個角色,那就是微信服務(wù)器。的有效期默認(rèn)是小時,當(dāng)用戶一直在使用小程序的話會自動刷新,這個是由微信這邊來維護(hù)的。 最近團(tuán)隊(duì)在開發(fā)一款小程序,都是新手,一邊看文檔,一邊開發(fā)。在開發(fā)中會遇到各種問題,今天把小程序登錄這塊的流程整理下,做個記錄。 小程序的登錄跟平時自己APP這種登錄驗(yàn)證還不太一樣,多了一個角色,那就是微信服務(wù)器。 showI...

    kid143 評論0 收藏0

發(fā)表評論

0條評論

gghyoo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<