[ 轉載 ] Java基礎

1.String a = 「123」; String b = 「123」; a==b的結果是什麼? 這包含了內存,String存儲方式等諸多知識點。
ans:
一樣序列的字符串直接量爲一個實例,因此其實引用變量a和b實際上是指向同一個實例,地址也就相同。引用變量比較的是地址,因此第一個打印出來爲true。java

2.HashMap裏的hashcode方法和equal方法何時須要重寫?若是不重寫會有什麼後果?對此你們能夠進一步瞭解HashMap(甚至ConcurrentHashMap)的底層實現。
ans:
HashMap是底層實現時數組加鏈表。
A.當put元素時:
1.首先根據put元素的key獲取hashcode,而後根據hashcode算出數組的下標位置,若是下標位置沒有元素,直接放入元素便可。
2.若是該下標位置有元素(即根據put元素的key算出的hashcode同樣即重複了),則須要已有元素和put元素的key對象比較equals方法,若是equals不同,則說明能夠放入進map中。這裏因爲hashcode同樣,因此得出的數組下標位置相同。因此會在該數組位置建立一個鏈表,後put進入的元素到放鏈表頭,原來的元素向後移動。
B.當get元素時:
根據元素的key獲取hashcode,而後根據hashcode獲取數組下標位置,若是隻有一個元素則直接取出。若是該位置一個鏈表,則須要調用equals方法遍歷鏈表中的全部元素與當前的元素比較,獲得真正想要的對象。
能夠看出若是根據hashcdoe算出的數組位置儘可能的均勻分佈,則能夠避免遍歷鏈表的狀況,以提升性能。
因此要求重寫hashmap時,也要重寫equals方法。以保證他們是相同的比較邏輯。數組

3.ArrayList和LinkedList底層實現有什麼差異?它們各自適用於哪些場合?對此你們也能夠了解下相關底層代碼。
ans:
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。數據結構

2.對於隨機訪問get和set,ArrayList優於LinkedList,由於ArrayList能夠隨機定位,而LinkedList要移動指針一步一步的移動到節點處。(參考數組與鏈表來思考)多線程

3.對於新增和刪除操做add和remove,LinedList比較佔優點,只須要對指針進行修改便可,而ArrayList要移動數據來填補被刪除的對象的空間。在ArrayList的中間插入或刪除一個元素意味着這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。併發

4.對ArrayList和LinkedList而言,在列表末尾增長一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增長一項,指向所添加的元素,偶爾可能會致使對數組從新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。jvm

5.LinkedList不支持高效的隨機元素訪問。性能

6.ArrayList的空間浪費主要體如今在list列表的結尾預留必定的容量空間,而LinkedList的空間花費則體如今它的每個元素都須要消耗至關的空間。優化

能夠這樣說:當操做是在一列數據的後面添加數據而不是在前面或中間,而且須要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操做是在一列數據的前面或中間添加或刪除數據,而且按照順序訪問其中的元素時,就應該使用LinkedList了。.net

4.volatile關鍵字有什麼做用?由此展開,你們能夠了解下線程內存和堆內存的差異。volatile關鍵字解析。
ans:
volatile線程

用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改後的最新的值。volatile很容易被誤用,用來進行原子性操做。

若是要深刻了解volatile關鍵字的做用,就必須先來了解一下JVM在運行時候的內存分配過程。在 java 垃圾回收整理一文中,描述了jvm運行時刻內存的分配。其中有一個內存區域是jvm虛擬機棧,每個線程運行時都有一個線程棧,線程棧保存了線程運行時候變量值信息。當線程訪問某一個對象時候值的時候,首先經過對象的引用找到對應在堆內存的變量的值,而後把堆內存變量的具體值load到線程本地內存中,創建一個變量副本,以後線程就再也不和對象在堆內存變量值有任何關係,而是直接修改副本變量的值,在修改完以後的某一個時刻(線程退出以前),自動把線程變量副本的值回寫到對象在堆中變量。這樣在堆中的對象的值就產生變化了。下面一幅圖描述這寫交互!


/**
* Created by wuyupku on 2019-04-08 11:15
*
* @Beijing CHINA
*/
class VolatileTest extends Thread {

boolean flag = false;
int i = 0;

public void run() {
while (!flag) {
i++;
}
}
}


public class VolatileDemo {
public static void main(String[] args) throws Exception {
VolatileTest vt = new VolatileTest();
vt.start();
Thread.sleep(2000);
vt.flag = true;
System.out.println("stope" + vt.i);
}
}

線程一直進行,未能正常退出程序.

首先建立 VolatileTest vt = new VolatileTest();
而後啓動線程 vt.start();
暫停主線程2秒(Main) Thread.sleep(2000);
這時的vt線程已經開始執行,進行i++;
主線程暫停2秒結束之後將 vt.flag = true;
打印語句 System.out.println(「stope」 + vt.i); 在此同時因爲vt.flag被設置爲true,因此vt線程在進行下一次while判斷 while (!flag) 返回假 結束循環vt線程方法結束退出!
主線程結束
上面的敘述看似並無什麼問題,「彷佛」徹底正確。那就讓咱們把程序運行起來看看效果吧,執行mian方法。2秒鐘之後控制檯打印stope1182150156。

問題出現了,爲何我在主線程(main)中設置了vt.flag = true; 而vt線程在進行判斷flag的時候拿到的仍然是false?
那麼按照咱們上面所講的 「JVM在運行時候的內存分配過程」 就很好解釋上面的問題了。

首先 vt線程在運行的時候會把 變量 flag 與 i (代碼3,4行)從「主內存」 拷貝到 線程棧內存(上圖的線程工做內存)

而後 vt線程開始執行while循環

7 while (!flag) {
8 i++;
9 }
1
2
3
while (!flag)進行判斷的flag 是在線程工做內存當中獲取,而不是從 「主內存」中獲取。

i++; 將線程內存中的i++; 加完之後將結果寫回至 「主內存」,如此重複。

而後再說說主線程的執行過程。

vt.flag = true;

主線程將vt.flag的值一樣從主內存中拷貝到本身的線程工做內存 而後修改flag=true. 而後再將新值回到主內存。

這就解釋了爲何在主線程(main)中設置了vt.flag = true; 而vt線程在進行判斷flag的時候拿到的仍然是false。那就是由於vt線程每次判斷flag標記的時候是從它本身的「工做內存中」取值,而並不是從主內存中取值!

這也是JVM爲了提供性能而作的優化。那咱們如何能讓vt線程每次判斷flag的時候都強制它去主內存中取值呢。這就是volatile關鍵字的做用。

/**
* Created by wuyupku on 2019-04-08 11:15
*
* @Beijing CHINA
*/
class VolatileTest extends Thread {

volatile boolean flag = false;
int i = 0;

public void run() {
while (!flag) {
i++;
}
}
}

public class VolatileDemo {
public static void main(String[] args) throws Exception {
VolatileTest vt = new VolatileTest();
vt.start();
Thread.sleep(2000);
vt.flag = true;
System.out.println("stope" + vt.i);
}
}

在flag前面加上volatile關鍵字,強制線程每次讀取該值的時候都去「主內存」中取值。程序已經正常退出了。

5.CompletableFuture,這個是JDK1.8裏的新特性,經過它怎麼實現多線程併發控制?6.JVM裏,new出來的對象是在哪一個區?再深刻一下,問下如何查看和優化JVM虛擬機內存。7.Java的靜態代理和動態代理有什麼差異?最好結合底層代碼來講。 ———————————————— 版權聲明:本文爲CSDN博主「葆寧」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/weixin_43258908/article/details/89077988

相關文章
相關標籤/搜索