国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Java]關(guān)于基本數(shù)據(jù)類型與引用類型賦值時的底層分析的小結(jié)(簡述)

這篇具有很好參考價值的文章主要介紹了[Java]關(guān)于基本數(shù)據(jù)類型與引用類型賦值時的底層分析的小結(jié)(簡述)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

【版權(quán)聲明】未經(jīng)博主同意,謝絕轉(zhuǎn)載?。ㄕ堊鹬卦瓌?chuàng),博主保留追究權(quán))
https://www.cnblogs.com/cnb-yuchen/p/17969159
出自【進(jìn)步*于辰的博客】

目錄
  • 1、關(guān)于賦值
    • 1.1 基本數(shù)據(jù)類型賦值
    • 1.2 String類型賦值
  • 2、關(guān)于String賦值
    • 2.1 情形一
    • 2.2 情形二
  • 3、關(guān)于String與char[]的比較
  • 4、不同類型引用分析
    • 4.1 int
    • 4.2 Integer
    • 4.3 int[]
    • 4.4 Integer[]
  • 5、最后

1、關(guān)于賦值

參考筆記一,P74.1。

一個小結(jié):
所有引用都存于棧,而對象存于堆。引用所指向的可能存于棧,也可能存于方法區(qū)常量池。

1.1 基本數(shù)據(jù)類型賦值

final int a中a是常量,在int a中a是變量。
示例:int a = 10;
a是變量,10是常量(a與10都存于棧)。令a = 20,是將a的值直接由10改為20。

1.2 String類型賦值

String s = "abc"中,s是引用(也是變量,存于棧),"abc"是字符串常量,存于方法區(qū)的字符串常量池。令s = "123",是將s由指向"abc"轉(zhuǎn)為指向"123",若"abc"沒有其他引用指向就會被回收。

2、關(guān)于String賦值

參考筆記一,P74.2。

2.1 情形一

以下兩種形式的定義的結(jié)果都相同,而底層分析略有不同。

形式一:
示例:

String s1 = "csdn", s2 = "csdn";
s2 = "2023";
sout s1;// 打?。篶sdn
sout s2;// 打印:2023

若方法區(qū)的字符串常量池中存在字符串常量“csdn”,則不會重新創(chuàng)建,直接將s1s2指向“csdn”
s2 = "2023",同樣先判斷是否存在"2023"。若不存在,則創(chuàng)建,然后將s2由指向"csdn"轉(zhuǎn)為指向"2023"。
因此,最終s1指向"csdn"s2指向"2023"。

形式二:
示例:

String s1 = "csdn", s2 = s1;
s2 = "2023";
sout s1;// 打印:csdn
sout s2;// 打?。?023

若存在“csdn”,則不會重新創(chuàng)建,直接將s1指向“csdn”,然后將s2指向s1的指向。
后續(xù)步驟同上,故結(jié)果相同。

這就是為何明明s2 = s1,而s2 = "2023",結(jié)果s2改變、s1不變的原因。

2.2 情形二

示例:

String s1 = "csdn", s2 = s1 + "2023", s3 = "csdn2023";
s2.equals(s3);// 結(jié)果:true

s2 = s1 + "2023",會先獲取s1的指向,是"csdn"。
然后為"csdn"復(fù)制一個副本,再轉(zhuǎn)為 StringBuffer,后執(zhí)行append("2023"),最后調(diào)用toString(),返回“csdn2023”
此時再判斷字符串常量池中是否存在字符串常量"csdn2023",若不存在,則創(chuàng)建,然后將s2指向csdn2023”。
因此,s2s3的結(jié)果相同。

3、關(guān)于String與char[]的比較

如果大家想要了解String類的底層,看這里 → String類。
參考筆記一,P74.3。

示例:

String s1 = "csdn";
char[] arr = {'c', 's', 'd', 'n'};
s1.equals(arr);// 結(jié)果:false-------A
s1.toString().equals(arr.toString());// 結(jié)果:false-------B
// 注:第一個toString()多余,第二個toString()是在底層調(diào)用
// 我這么寫是為了方便大家理解

String類重寫了equals(),在底層會先調(diào)用toString(),返回值后再判斷;而char[]不是具體類型,不存在重寫。當(dāng)然,仍會調(diào)用toString(),即示例中的A與B等效,但調(diào)用的是Object類的toString()(返回地址),故不等。

4、不同類型引用分析

參考筆記一,P36.5;筆記二,P38.1。

4.1 int

示例:

int a = 100, b = a;

a、b、100都存于棧,令a = 20,是直接將a的值改為20,b的值仍為100。

4.2 Integer

關(guān)于八位有符號二進(jìn)制的表示范圍,可查閱博文《關(guān)于二進(jìn)制的原碼、補(bǔ)碼和反碼,以及表示范圍、常見位運(yùn)算符和進(jìn)制轉(zhuǎn)換的理解與簡述》的第1.2項。

Integer 類的“自動裝箱”和“自動拆箱”機(jī)制是什么?

  1. 包裝類都具有自動裝箱和自動拆箱的功能(以代碼的角度上說,就是會在底層調(diào)用某個方法)。
  2. 為包裝類Integer賦值時,自動裝箱是底層調(diào)用了valueOf()。這里存在一個溢出問題。因為整型常量存儲于方法區(qū)的整型常量池,而整型常量池使用8位有符號二進(jìn)制表示整型。8位有符號二進(jìn)制的表示范圍是-128 ~ 127。若整型超出此此范圍,就是“溢出”。
  3. “溢出”規(guī)定:若整型在范圍內(nèi),valueOf()底層創(chuàng)建整型常量,存儲于整型常量池;否則創(chuàng)建 Integer 對象,存儲于堆。

示例:

關(guān)于valueOf(),可參考Integer類的第4.33項。

Integer i1 = 1;
Integer i2 = new Integer(1);
Integer i3 = Integer.valueOf(1);
i1 == i2;// false
i1 == i3;// true
i2 == i3;// false

Integer i4 = 128;
Integer i5 = new Integer(128);
Integer i6 = Integer.valueOf(128);
i4 == i5;// false
i4 == i6;// false
i5 == i6;// false

底層分析:

  • i1指向整型常量1;i2指向new Integer(1);由于1在表示范圍內(nèi),故valueOf(1)返回整型常量1,則i3也指向整型常量1。
  • 由于整型常量池僅能存儲-128 ~ 127的整型常量,故i4指向new Integer(128);i5指向new Integer(128);由于128超出表示范圍,故valueOf(128)返回new Integer(128)

擴(kuò)展一點(diǎn):

i1.equals(i2);// true
i1.equals(i3);// true
i2.equals(i3);// true

i4.equals(i5);// true
i4.equals(i6);// true
i5.equals(i6);// true

為何結(jié)果都為true?

關(guān)于equals(),可參考Integer類的第4.6項。

4.3 int[]

示例:

int[] arr1 = {1, 2, 3}, arr2 = arr1;

arr1arr2以及數(shù)組內(nèi)所有的值都存于棧,{1, 2, 3}存儲于堆。
arr1[0] = 10,是直接將1改為10,則arr1是{10, 2, 3};arr2與arr1指向相同,故arr2也是{10, 2, 3}

4.4 Integer[]

示例:

Integer[] arr1 = {1, 2, 3}, arr2 = arr1;

int[]不同的是,Integer[]內(nèi)的所有元素都不是直接的值,而是引用,并且是 Integer 引用,指向整型常量池或堆。
不過,無論指向哪里,由于arr2與arr1始終指向相同,因此,令arr1[0] = 10,則arr1是{10, 2, 3},arr2同樣是{10, 2, 3}

5、最后

本文中的例子是為了方便大家理解java基本數(shù)據(jù)類型和引用類型賦值時的底層而簡單舉例的,不一定有實用性。

PS:
大家在看完這篇文章后肯定想吐槽:“你說了這么多,示例結(jié)果還不是與我們平時使用時的結(jié)果無差別,有什么意義。”
哈哈......結(jié)果當(dāng)然相同了,因為我闡述的是底層分析。這些呢在平時工作中一般是用不到的,因此,目的是為了讓大家對java基本數(shù)據(jù)類型和引用類型賦值時的底層有進(jìn)一步的理解。

本文完結(jié)。文章來源地址http://www.zghlxwxcb.cn/news/detail-797279.html

到了這里,關(guān)于[Java]關(guān)于基本數(shù)據(jù)類型與引用類型賦值時的底層分析的小結(jié)(簡述)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第五章 基本引用類型(上)——Date、RegExp

    第五章 基本引用類型(上)——Date、RegExp

    ????????引用值(或者對象)是某個特定引用類型的實例。在ECMAScript中,引用類型是把數(shù)據(jù)和功能組織到一起的結(jié)構(gòu),經(jīng)常被人錯誤地稱作“類”。雖然從技術(shù)上講JavaScript是一門面向?qū)ο笳Z言,但ECMAScript缺少傳統(tǒng)的面向?qū)ο缶幊陶Z言所具備的某些基本結(jié)構(gòu),包括類和接口

    2024年01月17日
    瀏覽(23)
  • 關(guān)于Swift中閉包和OC中block對局部變量基本數(shù)據(jù)類型值的捕獲

    關(guān)于Swift中閉包和OC中block對局部變量基本數(shù)據(jù)類型值的捕獲

    翻了很多文章,發(fā)現(xiàn)關(guān)于Swift閉包關(guān)于上下文變量捕獲這塊,都沒有說的很詳細(xì),或者Swift2這樣的老版本已經(jīng)不適用了,問了GPT也是和自己實驗的結(jié)果不一樣,記錄下來。 首先,回顧一下OC中的block。 block對局部變量基本數(shù)據(jù)類型的捕獲,是在創(chuàng)建時捕獲了值,并保存副本在自

    2024年02月16日
    瀏覽(23)
  • Java--基本數(shù)據(jù)類型

    Java--基本數(shù)據(jù)類型

    在Java中,一共有8種基本類型,其中有4種整形,2種浮點(diǎn)類型,1種字符類型char(用于表示Unicode編碼的代碼單元)和一種表示真值bloolean類型。 1、整形 整形用于表示沒有小數(shù)部分的數(shù)值,允許是負(fù)數(shù)。Java提供了4種整形。 在通常情況下,int 類型最常用。但如果想要表示整個地

    2024年02月11日
    瀏覽(25)
  • Java基本數(shù)據(jù)類型

    Java是一種強(qiáng)類型語言,它有八種基本數(shù)據(jù)類型,分為三類:整型、浮點(diǎn)型和字符型。如何選擇適當(dāng)?shù)臄?shù)據(jù)類型是一個程序員需要考慮的重要問題。在本文中,我們將詳細(xì)介紹Java的基本數(shù)據(jù)類型,以及它們在程序中的應(yīng)用。 整型數(shù)據(jù)類型表示整數(shù)。Java有四種整型數(shù)據(jù)類型,分

    2023年04月09日
    瀏覽(22)
  • Java基礎(chǔ)篇_1.2——保留關(guān)鍵字、基本數(shù)據(jù)類型、基本數(shù)據(jù)類型之間的轉(zhuǎn)換

    Java基礎(chǔ)篇_1.2——保留關(guān)鍵字、基本數(shù)據(jù)類型、基本數(shù)據(jù)類型之間的轉(zhuǎn)換

    目錄 一、保留 二、Java的基本數(shù)據(jù)類型 三、引用數(shù)據(jù)類型 ?四、基本數(shù)據(jù)類型間的轉(zhuǎn)換 ?隱含強(qiáng)制類型轉(zhuǎn)換 數(shù)值之間的合法轉(zhuǎn)換 Java該語言是用 Unicode 字符集編寫的。 Java是預(yù)先定義的具有特別意義的標(biāo)識符,也被稱為Java保留字,Java不能用作變量名、方

    2024年02月14日
    瀏覽(29)
  • 【Java SE】基本數(shù)據(jù)類型

    【Java SE】基本數(shù)據(jù)類型

    大家好!我是保護(hù)小周?,本期為大家?guī)淼氖?Java的基本數(shù)據(jù)類型,內(nèi)容會與C語言的基本數(shù)據(jù)類型進(jìn)行基本的比較,數(shù)據(jù)類型提示,整型提升,以及簡單了解 String 類型 ,進(jìn)一步感受Java 的安全性。 C語言混不下去了,面向?qū)ο蟮木幊烫藒 目錄 一、常量 二、基本數(shù)據(jù)類

    2024年02月11日
    瀏覽(20)
  • java基本數(shù)據(jù)類型取值范圍

    在JAVA中一共有八種基本數(shù)據(jù)類型,他們分別是? byte、short、int、long、float、double、char、boolean? 整型? 其中byte、short、int、long都是表示整數(shù)的,只不過他們的取值范圍不一樣? byte的取值范圍為-128~127,占用1個字節(jié)(-2的7次方到2的7次方-1)? short的取值范圍為-32768~32767,占用

    2024年02月12日
    瀏覽(20)
  • 開心檔之Java 基本數(shù)據(jù)類型

    開心檔之Java 基本數(shù)據(jù)類型

    目錄 Java 基本數(shù)據(jù)類型 內(nèi)置數(shù)據(jù)類型 實例 實例 類型默認(rèn)值 實例 引用類型 Java 常量 自動類型轉(zhuǎn)換 自動類型轉(zhuǎn)換 實例 強(qiáng)制類型轉(zhuǎn)換 實例 隱含強(qiáng)制類型轉(zhuǎn)換 ? 變量就是申請內(nèi)存來存儲值。也就是說,當(dāng)創(chuàng)建變量的時候,需要在內(nèi)存中申請空間。 內(nèi)存管理系統(tǒng)根據(jù)變量的類

    2024年02月05日
    瀏覽(21)
  • Advanced .Net Debugging 4:基本調(diào)試任務(wù)(對象檢查:內(nèi)存、值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲)

    Advanced .Net Debugging 4:基本調(diào)試任務(wù)(對象檢查:內(nèi)存、值類型、引用類型、數(shù)組和異常的轉(zhuǎn)儲)

    一、介紹 這是我的《 Advanced .Net Debugging 》這個系列的第四篇文章。今天這篇文章的標(biāo)題雖然叫做“基本調(diào)試任務(wù)”,但是這章的內(nèi)容還是挺多的。由于內(nèi)容太多,故原書的第三章內(nèi)容我分兩篇文章來寫。上一篇我們了解了一些調(diào)試技巧,比如:單步調(diào)試、下斷點(diǎn)、過程調(diào)試

    2024年03月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包