Integer和int及String的總結

2021-09-05 01:09:25 字數 4591 閱讀 3471

一.integer和int

首先說下自動拆裝箱,基本資料型別轉換為包裝型別的過程叫裝箱,反之則是拆箱,其中最特殊也是面試經常遇到的是integer,下面總結說明,話不多說,show the code,先猜一下下面這6個題的答案:

1         integer a1=new integer(10);

2 integer b1=new integer(10);

3 system.out.println("1:"+(a1==b1));//1

4

5 integer a2=128;

6 integer b2=128;

7 system.out.println("2:"+(a2==b2));//2

8

9 integer a3=5;

10 integer b3=5;

11 system.out.println("3:"+(a3==b3));//3

12

13 int a4=3;

14 integer b4=new integer(3);

15 system.out.println("4:"+(a4==b4));//4

16

17 integer a5=new integer(40);

18 integer b5=new integer(40);

19 integer c5=new integer(0);

20 system.out.println("5.1:"+(a5==b5));

21 system.out.println("5.2:"+(a5==b5+c5));

22

23 integer a6=30;

24 integer b6=new integer(30);

25 system.out.println("6:"+(a6==b6));//6

讓我們看下對應的答案,要養成良好的習慣,先猜完在看答案 >o<

---------------我------是-----答-----案-----分----割-----線------------------

1:false

2:false

3:true

4:true

5.1:false

5.2:true

6:false

看了答案之後是不是有點意外,如果你答錯了,請繼續往下看,下面的具體分析可能會對你有所幫助,但是如果你都答對了並且已經很清楚原因了,那麼請你也繼續往下看,因為有可能我的分析有不對的地方,還要請你指正出來,不廢話了,開始分析:

1.

1         integer a1=new integer(10);

2 integer b1=new integer(10);

3 system.out.println("1:"+(a1==b1));//1 false

這個答案為false可能你猜到了,因為包裝類屬於引用型別,使用new是在堆中建立了乙個物件,而且此處用的比較方法時「==」,比較的是記憶體位址,所以兩個物件的記憶體不一樣很正常,如果改為equels比較,結果就為true;

2.

1         integer a2=128;

2 integer b2=128;

3 system.out.println("2:"+(a2==b2));//2 false

這個是自動轉換,jvm會自動轉換,實際就等同與integer a=new integer(128),然後就和上道題一樣的解釋了,明白了吧。

3.

1         integer a3=5;

2 integer b3=5;

3 system.out.println("3:"+(a3==b3));//3 true

看到答案是不是感覺懵x了,上面不是說的好好的,按照上面的解釋,答案就是false啊,但實際卻為true,別著急,我來解釋,這個就比較特殊了,涉及到jvm的包裝型別的快取機制了,如果integer要裝箱,會先判斷值,如果是在-128到127之間,則不會new integer(x),而是直接從快取中(常量池)獲取的,所以上述的兩個值都是取至快取中的同乙個值,所以引用位址是一樣的,答案為true,網上關於這一塊將的比較詳細,如果有想更細緻的研究,可以搜尋網上的文件,還有原始碼參考,我就不在ctrl c v了。

4.

1         int a4=3;

2 integer b4=new integer(3);

3 system.out.println("4:"+(a4==b4));//4 true

說到這個,還有點故事,有一次**面試,面試官問了我乙個這樣的問題,當時的我真的是靠懵,但是不知道是我沒聽清,還是面試官沒說明白,說把上述的3換成128,答案就是false,為此,我自己親自驗證,然後又網上搜尋,最後確定這個說法是錯誤的,不管把值換成多少,答案都是true;當integer和int做「==」比較時,會自動的拆箱,把integer轉換為int型別,然後在值比較。

5.

1         integer a5=new integer(40);

2 integer b5=new integer(40);

3 integer c5=new integer(0);

4 system.out.println("5.1:"+(a5==b5)); false

5 system.out.println("5.2:"+(a5==b5+c5)); true

如果前面的都看了,這個5.1的答案你可能猜對了,但是這個5.2的答案看著是不是又懵x了,別著急,我再來解釋下5.2,當integer型別做運算時,會自動拆箱,把integer型別轉換為int型別,如果是用「==」做比較,則比較的是值,所以答案是true。

6.

1         integer a6=30;

2 integer b6=new integer(30);

3 system.out.println("6:"+(a6==b6));//6 false

看完前面的種種情況之後,相信你會猜對這個題的答案了,不僅是猜,而且也能解釋個一二了,我就再解釋下吧(解釋的有點多........),integer b6=30;會直接從常量池中取,而不會在堆中new integer(30),所以兩個引用的位址不一樣,用「==」比較時答案就為false。

1         int a7=30;

2 integer b7=30;

3 system.out.println("7:"+(a7==b7));//7

----------答--------案--------在--------此---------

不用懷疑自己,這個相信你已經會很自信的用自己的知識解釋答案了,是的,答案為true,我沒有給各位看官下套套。。。。。。只是讓大家更堅信自己了~

二.string的常量池

剛才上面說到integer的常量池了,大家肯定不禁想到string的常量池了,是不是正好可以建立關聯記憶了,是的,我也忍不住想總結一下了,那就囉唆幾句吧。

先拋個磚......

問:這個會建立幾個「abc」?

答:不知道。

這個答案實在是高啊,我也不知道會建立幾個,扯淡吧;其實正確的答案是乙個或者是兩個,因為這個得看常量池,如果常量池中已經存在「abc」這個字串了,則會在堆中建立一次,

如果常量池中沒有「abc」,則會在堆中new乙個「abc」,然後在常量池中再建立乙個「abc」,

這個就是標準的解釋。

以後如果碰到這種類似的題都可以按照這種解釋,不管是 還是上面new的方式,jvm都會先檢查常量池中是否有該字串,如果有,則 這種方式就不會再建立新的字串了,如果是 這種方式,則也會先判斷常量池,如果常量池中已經存在,則會只在堆中建立一次;所有的這類題目都可以按照這種思路解釋,如果出題的話,可以挖出很多大坑,希望大家以後要小心,下面出個題趁熱打鐵給大家練練手吧,請看題:

1         string m="abc";

2 string n=new string("abc");

3 system.out.println("1:"+(m==n));//1 false

4 string s="abc";

5 system.out.println("2:"+(m==s));//2 true

然後由於聯想記憶法,我又想到了string、stringbuffer和stringbuilder的知識了,啊......好煩躁,真想忍不住的在給大家囉唆幾句,想想還是算了吧,真的是沒完沒了t.t

上述的總結中,如果有不一樣的觀點,或錯誤,歡迎大神給予指正哦~

Integer 和int的區別

1.int是基本的資料型別,直接存數值 2.integer是int的封裝類 integer 是物件,用乙個引用指向這個物件 integer 是乙個類,是int的擴充套件,定義了很多的轉換方法。3.int和integer都可以表示某乙個數值 4.int和integer不能夠互用,因為他們兩種不同的資料...

int和Integer的區別

今天有個學弟問了我乙個面試題 integer a 128 integer b 128 system.out.println a b 輸出什麼?為什麼?說來慚愧,我的直覺告訴我會輸出flase,但突然間還想不出來為什麼。所以寫了個例子研究了下 public static void main strin...

Integer和int的比較

package com.mawei.www public class integertest 和 equals的差異 private static void mytest01 確認有效範圍 private static void mytest02 混合比較 private static void m...