更新時間:2020-06-10 15:26:43 來源:動力節點 瀏覽2163次
1、JAVA中的幾種基本數據類型是什么,各自占用多少字節。
2、String類能被繼承嗎,為什么
不能。在Java中,只要是被定義為final的類,也可以說是被final修飾的類,就是不能被繼承的。
3、String,Stringbuffer,StringBuilder的區別。
4、ArrayList和LinkedList有什么區別。
簡單的區別:
(1)ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。(LinkedList是雙向鏈表,有next也有previous)
(2)對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
(3)對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
深度的區別:
(1)對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。
(2)在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
(3)LinkedList不支持高效的隨機元素訪問。
(4)ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間
5、講講類的實例化順序。
問題:比如父類靜態數據,構造函數,字段,子類靜態數據,構造函數,字段,當new的時候,他們的執行順序。
答案:類加載器實例化時進行的操作步驟(加載–>連接->初始化)。父類靜態變量、父類靜態代碼塊、子類靜態變量、子類靜態代碼塊、父類非靜態變量(父類實例成員變量)、父類構造函數、子類非靜態變量(子類實例成員變量)、子類構造函數。
6、用過哪些Map類,都有什么區別。
問題:比如HashMap是線程安全的嗎,并發下使用的Map是什么,他們內部原理分別是什么,比如存儲方式,hashcode,擴容,默認容量等。答案:不安全,并發下使用ConcurrentHashMap。
7、JAVA8的ConcurrentHashMap為什么放棄了分段鎖?
原因:通過JDK的源碼和官方文檔看來,他們認為的棄用分段鎖的原因由以下幾點:1、加入多個分段鎖浪費內存空間。2、生產環境中,map在放入時競爭同一個鎖的概率非常小,分段鎖反而會造成更新等操作的長時間等待。3、為了提高GC的效率
既然棄用了分段鎖,那么一定由新的線程安全方案,我們來看看源碼是怎么解決線程安全的呢?CAS
首先通過hash找到對應鏈表過后,查看是否是第一個object,如果是,直接用cas原則插入,無需加鎖,然后如果不是鏈表第一個object,則直接用鏈表第一個object加鎖,這里加的鎖是synchronized,雖然效率不如ReentrantLock,但節約了空間,這里會一直用第一個object為鎖,直到重新計算map大小,比如擴容或者操作了第一個object為止。
8、ConcurrentHashMap(JDK1.8)為什么要使用synchronized而不是如ReentranLock這樣的可重入鎖?
可以從下面幾個方面講述:鎖的粒度首先鎖的粒度并沒有變粗,甚至變得更細了。每當擴容一次,ConcurrentHashMap的并發度就擴大一倍。Hash沖突JDK1.7中,ConcurrentHashMap從過二次hash的方式(Segment->HashEntry)能夠快速的找到查找的元素。在1.8中通過鏈表加紅黑樹的形式彌補了put、get時的性能差距。擴容JDK1.8中,在ConcurrentHashmap進行擴容時,其他線程可以通過檢測數組中的節點決定是否對這條鏈表(紅黑樹)進行擴容,減小了擴容的粒度,提高了擴容的效率。
為什么是synchronized,而不是可重入鎖
減少內存開銷假設使用可重入鎖來獲得同步支持,那么每個節點都需要通過繼承AQS來獲得同步支持。但并不是每個節點都需要獲得同步支持的,只有鏈表的頭節點(紅黑樹的根節點)需要同步,這無疑帶來了巨大內存浪費。
獲得JVM的支持可重入鎖畢竟是API這個級別的,后續的性能優化空間很小。synchronized則是JVM直接支持的,JVM能夠在運行時作出相應的優化措施:鎖粗化、鎖消除、鎖自旋等等。這就使得synchronized能夠隨著JDK版本的升級而不改動代碼的前提下獲得性能上的提升。
9、有沒有有順序的Map實現類,如果有,他們是怎么保證有序的。
Hashmap和Hashtable都不是有序的。TreeMap和LinkedHashmap都是有序的。(TreeMap默認是key升序,LinkedHashmap默認是數據插入順序)TreeMap是基于比較器Comparator來實現有序的。LinkedHashmap是基于鏈表來實現數據插入有序的。
10、抽象類和接口的區別,類可以繼承多個類么,接口可以繼承多個接口么,類可以實現多個接口么。
區別:1、抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。2、抽象類要被子類繼承,接口要被類實現。3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現4、接口里定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。5、抽象類里的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那么該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那么該類也只能為抽象類。6、抽象方法只能申明,不能實現。abstract void abc();不能寫成abstract void abc(){}。7、抽象類里可以沒有抽象方法8、如果一個類里有抽象方法,那么這個類只能是抽象類9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。10、接口可繼承接口,并可多繼承接口,但類只能單根繼承。
類不能繼承多個類接口可以繼承多個接口類可以實現多個接口
以上就是動力節點java培訓機構的小編針對“Java基礎部分組成27個知識點”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習