點擊上方「五角錢的程式設計師」,選擇「設為星標」
✨一起學習、成長、溫情的熱愛生活✨
今天繼續來講面試,已經出了很多java一面真題系列文章了,之後也會整理成一個系列,歡迎持續關注哦。
話說幹了這麼多年的開發,只知道會用,怎麼用,用什麼,隱約也知道了為什麼用,但為啥JAVA總像一個猶抱琵琶半遮面的女子,總讓人看不透,看不膩?應該就是基礎不紮實了。所以面試的時候卻經常會被問到,我們根據面經來進行補短板,查漏補缺。下面開始今天的乾貨內容吧,走起,記得點讚,點擊在看哦。
自動裝箱和拆箱從Java 1.5開始引入,目的是將原始類型值轉自動地轉換成對應的對象。自動裝箱與拆箱的機制可以讓我們在Java的變量賦值或者是方法調用等情況下使用原始類型或者對象類型更加簡單直接。如果你在Java1.5下進行過編程的話,你一定不會陌生這一點,你不能直接地向集合(Collections)中放入原始類型值,因為集合只接收對象。通常這種情況下你的做法是,將這些原始類型的值轉換成對象,然後將這些轉換的對象放入集合中。使用Integer,Double,Boolean等這些類我們可以將原始類型值轉換成對應的對象,但是從某些程度可能使得代碼不是那麼簡潔精煉。為了讓代碼簡練,Java 1.5引入了具有在原始類型和對象類型自動轉換的裝箱和拆箱機制。但是自動裝箱和拆箱並非完美,在使用時需要有一些注意事項,如果沒有搞明白自動裝箱和拆箱,可能會引起難以察覺的bug。1、包裝類型Java語言是一個面向對象的語言,但是Java中的基本數據類型卻是不面向對象的,這在實際使用時存在很多的不便,為了解決這個不足,在設計類時為每個基本數據類型設計了一個對應的類進行代表,這樣八個和基本數據類型對應的類統稱為包裝類(Wrapper Class)。包裝類均位於java.lang包,包裝類和基本數據類型的對應關係如下表所示Integer i = new Integer(10);
自動裝箱就是Java自動將原始類型值轉換成對應的對象,比如將int的變量轉換成Integer對象,這個過程叫做裝箱,反之將Integer對象轉換成int類型值,這個過程叫做拆箱。因為這裡的裝箱和拆箱是自動進行的非人為轉換,所以就稱作為自動裝箱和拆箱。
在Java SE5中,為了減少開發人員的工作,Java提供了自動拆箱與自動裝箱功能。自動裝箱: 就是將基本數據類型自動轉換成對應的包裝類。自動拆箱:就是將包裝類自動轉換成對應的基本數據類型。Integer i =10; //自動裝箱
int b= i; //自動拆箱
public static void main(String[]args){
Integer integer=1; //裝箱
int i=integer; //拆箱
}
public static void main(String[]args){
Integer integer=Integer.valueOf(1);
int i=integer.intValue();
}
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i ++){
li.add(i);
}
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2){
li.add(Integer.valueOf(i));
}
Integer a=1;
System.out.println(a==1?"等於":"不等於");
Boolean bool=false;
System.out.println(bool?"真":"假");
Integer a=1;
System.out.println(a.intValue()==1?"等於":"不等於");
Boolean bool=false;
System.out.println(bool.booleanValue?"真":"假");
Integer i = 10;
Integer j = 20;
System.out.println(i+j);
Integer i = Integer.valueOf(10);
Integer j = Integer.valueOf(20);
System.out.println(i.intValue() + j.intValue());
boolean flag = true;
Integer i = 0;
int j = 1;
int k = flag ? i : j;
boolean flag = true;
Integer i = Integer.valueOf(0);
int j = 1;
int k = flag ? i.intValue() : j;
//自動拆箱
public int getNum1(Integer num) {
return num;
}
//自動裝箱
public Integer getNum2(int num) {
return num;
}
public static void main(String... strings) {
Integer integer1 = 3;
Integer integer2 = 3;
if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");
Integer integer3 = 300;
Integer integer4 = 300;
if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
}
integer1 == integer2
integer3 != integer4
Integer i1 =59;
int i2 = 59;
Integer i3 = Integer.valueOf(59);
Integer i4 = new Integer(59);
System.out.println(i1 == i2); true:包裝類和基本類型比較時,包裝類自動拆箱為基本類型
System.out.println(i1 == i3); true:數值59 在-128到127之間,上文所說的緩存,因此為true,若數值不在-128到127之間則為false
System.out.println(i1 == i4); false:引用類型比較地址值,地址值不同
System.out.println(i2 == i3); true:i1的源碼是i3,i2和i3比較結果和i2與i1比較結果相同,包裝類和基本類型比較時自動拆箱
System.out.println(i2 == i4); true:包裝類和基本類型比較時自動拆箱
System.out.println(i3 == i4);同i1 == i4
上圖l = l +1;l+1中l自動拆箱了,所以和是原始類型,後面賦值,和又自動裝箱了。不過通過上圖發現,好像循環次數少的時候,jvm處理的很快,是不是不用優化了?答案是不是,因為你的程序不止一個人在使用,當很多人調用的時候,積塔成沙,就會很消耗性能。我們減少這種拆箱和裝箱,看看優化的效果:
優化後,l + 1裡l進行拆箱,發現少了一次自動裝箱,對性能影響這麼大,還覺得減少自動拆箱和自動裝箱過程沒用嗎?優化從點滴做起。
所有巧合的是要麼是上天註定要麼是一個人偷偷的在努力。
參考連結:https://www.cnblogs.com/cn-chy-com/p/10816565.html
https://www.cnblogs.com/lsohvaen001/p/7823067.html