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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第 1-2 课:你不知道的基础数据类型和包装类 + 面试题

發(fā)布時間:2025/3/11 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第 1-2 课:你不知道的基础数据类型和包装类 + 面试题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

Java 基礎數(shù)據(jù)按類型可以分為四大類:布爾型、整數(shù)型、浮點型、字符型,這四大類包含 8 種基礎數(shù)據(jù)類型。

  • 布爾型:boolean
  • 整數(shù)型:byte、short、int、long
  • 浮點型:float、double
  • 字符型:char

八種基礎類型取值如下:

數(shù)據(jù)類型代表含義默認值取值包裝類
boolean布爾型false0(false) 到 1(true)Boolean
byte字節(jié)型(byte)0-128 到 127Byte
char字符型'\u0000'(空)'\u0000' 到 '\uFFFF'Character
short短整數(shù)型(short)0-215 到 215-1Short
int整數(shù)型0-231 到 231-1Integer
long長整數(shù)型0L-263 到 263-1Long
float單浮點型0.0f1.4e-45 到 3.4e+38Float
double雙浮點型0.0d4.9e-324 到 1.798e+308Double

除 chat 的包裝類 Character 和 int 的包裝類 Integer 之外,其他基礎數(shù)據(jù)類型的包裝類只需要首字母大寫即可。包裝類的作用和特點,本文下半部分詳細講解。

我們可以在代碼中,查看某種類型的取值范圍,代碼如下:

public static void main(String[] args) {// Byte 取值:-128 ~ 127System.out.println(String.format("Byte 取值:%d ~ %d", Byte.MIN_VALUE, Byte.MAX_VALUE));// Int 取值:-2147483648 ~ 2147483647System.out.println(String.format("Int 取值:%d ~ %d", Integer.MIN_VALUE, Integer.MAX_VALUE)); }

包裝類型

我們知道 8 種基本數(shù)據(jù)類型都有其對應的包裝類,因為 Java 的設計思想是萬物既對象,有很多時候我們需要以對象的形式操作某項功能,比如說獲取哈希值(hashCode)或獲取類(getClass)等。
那包裝類特性有哪些?

1. 功能豐富

包裝類本質(zhì)上是一個對象,對象就包含有屬性和方法,比如 hashCode、getClass 、max、min 等。

2. 可定義泛型類型參數(shù)

包裝類可以定義泛型,而基礎類型不行。

比如使用 Integer 定義泛型,代碼:

List<Integer> list = new ArrayList<>();

如果使用 int 定義就會報錯,代碼:

List list = new ArrayList<>(); // 編譯器代碼報錯

3. 序列化

因為包裝類都實現(xiàn)了 Serializable 接口,所以包裝類天然支持序列化和反序列化。比如 Integer 的類圖如下:

4. 類型轉(zhuǎn)換

包裝類提供了類型轉(zhuǎn)換的方法,可以很方便的實現(xiàn)類型之間的轉(zhuǎn)換,比如 Integer 類型轉(zhuǎn)換代碼:

String age = "18"; int ageInt = Integer.parseInt(age) + 2; // 輸出結(jié)果:20 System.out.println(ageInt);

5. 高頻區(qū)間的數(shù)據(jù)緩存

此特性為包裝類很重要的用途之一,用于高頻區(qū)間的數(shù)據(jù)緩存,以 Integer 為例來說,在數(shù)值區(qū)間為 -128~127 時,會直接復用已有對象,在這區(qū)間之外的數(shù)字才會在堆上產(chǎn)生。

我們使用 == 對 Integer 進行驗證,代碼如下:

public static void main(String[] args) {// Integer 高頻區(qū)緩存范圍 -128~127Integer num1 = 127;Integer num2 = 127;// Integer 取值 127 == 結(jié)果為 true(值127 num1==num2 => true)System.out.println("值127 num1==num2 => " + (num1 == num2));Integer num3 = 128;Integer num4 = 128;// Integer 取值 128 == 結(jié)果為 false(值128 num3==num4 => false)System.out.println("值128 num3==num4 => " + (num3 == num4));}

從上面的代碼很明顯可以看出,Integer 為 127 時復用了已有對象,當值為 128 時,重新在堆上生成了新對象。

為什么會產(chǎn)生高頻區(qū)域數(shù)據(jù)緩存?我們查看源碼就能發(fā)現(xiàn)“線索”,源碼版本 JDK 8,源碼如下:

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); }

由此可見,高頻區(qū)域的數(shù)值會直接使用已有對象,非高頻區(qū)域的數(shù)值會重新 new 一個新的對象。

各包裝類高頻區(qū)域的取值范圍:

  • Boolean:使用靜態(tài) final 定義,就會返回靜態(tài)值;
  • Byte:緩存區(qū) -128~127,全部緩存;
  • Short:緩存區(qū) -128~127,部分緩存;
  • Character:緩存區(qū) 0~127,部分緩存;
  • Long:緩存區(qū) -128~127,部分緩存;
  • Integer:緩存區(qū) -128~127,部分緩存。

包裝類的注意事項

  • int 的默認值是 0,而 Integer 的默認值是 null。

  • 推薦所有包裝類對象之間的值比較使用 equlas() 方法,因為包裝類的非高頻區(qū)數(shù)據(jù)會在堆上產(chǎn)生,而高頻區(qū)又會復用已有對象,這樣會導致同樣的代碼,因為取值的不同,而產(chǎn)生兩種截然不同的結(jié)果。代碼示例:

public static void main(String[] args) {// Integer 高頻區(qū)緩存范圍 -128~127Integer num1 = 127;Integer num2 = 127;// Integer 取值 127 == 結(jié)果為 true(值127 num1==num2 => true)System.out.println("值127 num1==num2 => " + (num1 == num2));Integer num3 = 128;Integer num4 = 128;// Integer 取值 128 == 結(jié)果為 false(值128 num3==num4 => false)System.out.println("值128 num3==num4 => " + (num3 == num4));// Integer 取值 128 equals 結(jié)果為 true(值128 num3.equals(num4) => true)System.out.println("值128 num3.equals(num4) => " + num3.equals(num4)); }
  • Float 和 Double 不會有緩存,其他包裝類都有緩存。

  • Integer 是唯一一個可以修改緩存范圍的包裝類,在 VM optons 加入?yún)?shù):

-XX:AutoBoxCacheMax=666 即修改緩存最大值為 666 。

示例代碼如下:

public static void main(String[] args) {Integer num1 = -128;Integer num2 = -128;System.out.println("值為-128 => " + (num1 == num2));Integer num3 = 666;Integer num4 = 666;System.out.println("值為666 => " + (num3 == num4));Integer num5 = 667;Integer num6 = 667;System.out.println("值為667 => " + (num5 == num6)); }

執(zhí)行結(jié)果如下:

值為-128 => true 值為666 => true 值為667 => false

由此可見將 Integer 最大緩存修改為 666 之后,667 不會被緩存,而 -128~666 之間的數(shù)都被緩存了。

相關(guān)面試題

1. 以下 Integer 代碼輸出的結(jié)果是?

Integer age = 10; Integer age2 = 10; Integer age3 = 133; Integer age4 = 133; System.out.println((age == age2) + "," + (age3 == age4));

答:true,false

2. 以下 Double 代碼輸出的結(jié)果是?

Double num = 10d; Double num2 = 10d; Double num3 = 133d; Double num4 = 133d; System.out.println((num == num2) + "," + (num3 == num4));

答:false,false

3. 以下程序輸出結(jié)果是?

int i = 100; Integer j = new Integer(100); System.out.println(i == j); System.out.println(j.equals(i));

A:true,true
B:true,false
C:false,true
D:false,false

答:A

題目分析:有人認為這和 Integer 高速緩存有關(guān)系,但你發(fā)現(xiàn)把值改為 10000 結(jié)果也是 true,true,這是因為 Integer 和 int 比較時,會自動拆箱為 int 相當于兩個 int 比較,值一定是 true,true。

4. 以下程序執(zhí)行的結(jié)果是?

final int iMax = Integer.MAX_VALUE; System.out.println(iMax + 1);

A:2147483648
B:-2147483648
C:程序報錯
D:以上都不是
答:B
題目解析:這是因為整數(shù)在內(nèi)存中使用的是補碼的形式表示,最高位是符號位 0 表示正數(shù),1 表示負數(shù),當執(zhí)行 +1 時,最高位就變成了 1,結(jié)果就成了 -2147483648。

5. 以下程序執(zhí)行的結(jié)果是?

Set<Short> set = new HashSet<>(); for (short i = 0; i < 5; i++) {set.add(i);set.remove(i - 1); } System.out.println(set.size());

A:1
B:0
C:5
D:以上都不是

答:5

題目解析:Short 類型 -1 之后轉(zhuǎn)換成了 Int 類型,remove() 的時候在集合中找不到 Int 類型的數(shù)據(jù),所以就沒有刪除任何元素,執(zhí)行的結(jié)果就是 5。

6. short s=2;s=s+1; 會報錯嗎?short s=2;s+=1; 會報錯嗎?

答:s=s+1 會報錯,s+=1 不會報錯,因為 s=s+1 會導致 short 類型升級為 int 類型,所以會報錯,而 s+=1 還是原來的 short 類型,所以不會報錯。

7. float f=3.4; 會報錯嗎?為什么?

答:會報錯,因為值 3.4 是 double 類型,float 類型級別小于 double 類型,所以會報錯。如下圖所示:

8. 為什么需要包裝類?

答:需要包裝類的原因有兩個。

① Java 的設計思想是萬物既對象,包裝類體現(xiàn)了面向?qū)ο蟮脑O計理念;
② 包裝類包含了很多屬性和方法,比基礎數(shù)據(jù)類型功能多,比如提供的獲取哈希值(hashCode)或獲取類(getClass)的方法等。

9. 基礎類 int 和包裝類 Integer,在 -128~127 之間都會復用已有的緩存對象,這種說法正確嗎?

答:不正確,只有包裝類高頻區(qū)域數(shù)據(jù)才有緩存。

10. 包裝類 Double 和 Integer 一樣都有高頻區(qū)域數(shù)據(jù)緩存,這種說法正確嗎?

答:不正確,基礎數(shù)據(jù)類型的包裝類只有 Double 和 Float 沒有高頻區(qū)域的緩存。

11. 包裝類的值比較要使用什么方法?

答:包裝類因為有高頻區(qū)域數(shù)據(jù)緩存,所以推薦使用 equals() 方法進行值比較。

12. 包裝類有哪些功能?

答:包裝類提供的功能有以下幾個。

  • 功能豐富:包裝類包含了有 hashCode、getClass 、max、min 等方法;
  • 可定義泛型類型參數(shù):例如 List<Integer> list = new ArrayList<>(); ;
  • 序列化:包裝類實現(xiàn)了 Serializable 接口,所以包裝類天然支持序列化和反序列化;
  • 類型轉(zhuǎn)換:包裝類提供了方便的類型轉(zhuǎn)換方法,比如 Integer 的 parseInt() 方法;
  • 高頻區(qū)域數(shù)據(jù)緩存:高頻區(qū)域可使用已有的緩存對象。

詳見正文“包裝類型”部分內(nèi)容。

13. 泛型可以為基礎類型嗎?為什么?

答:泛型不能使用基礎數(shù)據(jù)類型。泛型在 JVM(Java虛擬機)編譯的時候會類型檫除,比如代碼 List<Integer> list 在 JVM 編譯的時候會轉(zhuǎn)換為 List list ,因為泛型是在 JDK 5 時提供的,而 JVM 的類型檫除是為了兼容以前代碼的一個折中方案,類型檫除之后就變成了 Object,而 Object 不能存儲基礎數(shù)據(jù)類型,但可以使用基礎數(shù)據(jù)類型對應的包裝類,所以像 List<int> list 這樣的代碼是不被允許的,編譯器階段會檢查報錯,而 List<Integer> list 是被允許的。

14. 選擇包裝類還是基礎類的原則有哪些?

答:我們知道正確的使用包裝類,可以提供程序的執(zhí)行效率,可以使用已有的緩存,一般情況下選擇基本數(shù)據(jù)類型還是包裝類原則有以下幾個。

① 所有 POJO 類屬性必須使用包裝類;
② RPC 方法返回值和參數(shù)必須使用包裝類;
③ 所有局部變量推薦使用基礎數(shù)據(jù)類型。

15. 基礎數(shù)據(jù)類型在 JVM 中一定存儲在棧中嗎?為什么?

答:基礎數(shù)據(jù)類型不一定存儲在棧中,因為基礎類型的存儲位置取決于聲明的作用域,來看具體的解釋。

  • 當基礎數(shù)據(jù)類型為局部變量的時候,比如在方法中聲明的變量,則存放在方法棧中的,當方法結(jié)束系統(tǒng)會釋放方法棧,在該方法中的變量也會隨著棧的銷毀而結(jié)束,這也是局部變量只能在方法中使用的原因;
  • 當基礎數(shù)據(jù)類型為全局變量的時候,比如類中的聲明的變量,則存儲在堆上,因為全局變量不會隨著某個方法的執(zhí)行結(jié)束而銷毀。

16. 以下程序執(zhí)行的結(jié)果是?

Integer i1 = new Integer(10); Integer i2 = new Integer(10); Integer i3 = Integer.valueOf(10); Integer i4 = Integer.valueOf(10); System.out.println(i1 == i2); System.out.println(i2 == i3); System.out.println(i3 == i4);

A:false,false,false
B:false,false,true
C:false,true,true
D:true,false,false

答:B

題目解析:new Integer(10) 每次都會創(chuàng)建一個新對象,Integer.valueOf(10) 則會使用緩存池中的對象。

17. 3*0.1==0.3 返回值是多少?

答:返回值為:false。

題目解析:因為有些浮點數(shù)不能完全精確的表示出來,如下代碼:

System.out.println(3 * 0.1);

返回的結(jié)果是:0.30000000000000004。

總結(jié)

以上是生活随笔為你收集整理的第 1-2 课:你不知道的基础数据类型和包装类 + 面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 午夜影视av| 中文天堂在线视频 | 日韩av手机在线观看 | 成人a网站 | 又污又黄的视频 | 麻豆电影网站 | 欧美亚洲一区二区三区 | 日韩电影网站 | 美妇湿透娇羞紧窄迎合 | 国产乱码一区二区三区 | 久久久久久久久亚洲 | 亚洲激情久久 | 美女扒开尿口让男人爽 | 日本一区二区在线免费 | 天天干天天色天天 | 最近2019中文字幕大全第二页 | 夜夜伊人 | 黄页网站免费观看 | 久久爱成人| 涩涩在线播放 | 91精品国产综合久久国产大片 | 中文字幕在线观看一区二区 | 日本黄色性视频 | aaa一区二区| 亚洲欧美一区二区三区情侣bbw | 日韩欧美精品在线视频 | www.在线观看视频 | 国产卡一卡二在线 | av香港经典三级级 在线 | 久久大奶 | 动漫美女隐私无遮挡 | 中文字幕一区二区三区免费看 | 超碰国产一区二区三区 | 日本不卡久久 | 国产a大片| 99国产精品无码 | 深夜在线视频 | 欧美黄色一级片视频 | av青青草 | 毛片av免费| 4438x亚洲 | 在线观看自拍 | 亚洲精品久久久中文字幕痴女 | 日本欧美韩国国产精品 | 88av视频 | 神马午夜精品 | 亚洲精品乱码久久久久久蜜桃图片 | 久久精品视频无码 | 青青青草视频在线观看 | 欧美一区欧美二区 | 精品人妻一区二区三区四区 | 手机在线观看av片 | 欧美激情在线看 | 国产成人免费在线视频 | 在线观看免费看片 | 精品视频免费 | 开心综合网| 日韩成人欧美 | 草草在线观看 | 国产一级二级三级精品 | 女同性做受全过程动图 | 三级全黄做爰龚玥菲在线 | 影音先锋男人资源网站 | 中文字幕无码乱码人妻日韩精品 | 欧美日韩一区二区在线观看 | 制服丝袜在线第一页 | 黄色羞羞网站 | 国产一区二区三区色淫影院 | 男人的天堂在线视频 | 制服丝袜在线视频 | 超碰在线97国产 | 五十路母| 亚洲影院一区二区三区 | 99色影院 | 国产午夜网站 | 在线伊人| 72种无遮挡啪啪的姿势 | 国产做受网站 | 亚洲国产精品99久久 | 亚洲一区精品视频在线观看 | 欧美日韩电影一区二区三区 | 11一12免费毛片 | 91漂亮少妇露脸在线播放 | 日韩不卡在线视频 | 国产在线一区二区视频 | 色视频在线免费观看 | 国产学生美女无遮拦高潮视频 | 久久影视网| 欧美日韩精品一区二区三区蜜桃 | 免费黄色一级视频 | 日韩爱爱爱 | 亚洲一区二区在线看 | 欧美一区二区性久久久 | 亚洲男人的天堂在线 | 亚洲一区二区三区观看 | 亚洲国产成人精品无码区99 | 亚洲香蕉 | 国产又粗又大又爽视频 | 黄色网址av|