1. JAVA中的幾種基本數(shù)據(jù)類型是什么庞钢,各自占用多少字節(jié)爆存。
int? ? ? ? 32bit? short? 16bit
long? ? 64bit? byte? ? 8bit
char? ? 16bit? float? 32bit
double? 64bit? boolean 1bit
============================================================
2. String類能被繼承嗎肚菠,為什么?
public final class String
? ? implements java.io.Serializable, Comparable<String>, CharSequence
String 被final修飾了罩旋,所有不能被繼承无虚。
1.final修飾的對象不能被修改;
2.final修飾的類不能被繼承晤碘;
3.final修飾的方法不能被重寫褂微;
============================================================
3. String,Stringbuffer园爷,StringBuilder的區(qū)別宠蚂。
1.可變與不可變
String類中使用字符數(shù)組保存字符串,如下就是童社,因為有“final”修飾符求厕,所以可以知道string對象是不可變的。
private final char value[];
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類扰楼,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串呀癣,如下就是,可知這兩種對象都是可變的灭抑。
char[] value;
2.是否多線程安全
String中的對象是不可變的十艾,也就可以理解為常量,顯然線程安全腾节。
AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作荤牍,如expandCapacity案腺、append、insert康吵、indexOf等公共方法劈榨。
StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的晦嵌⊥保看如下源碼
最后,如果程序不是多線程的惭载,那么使用StringBuilder效率高于StringBuffer旱函。
============================================================
4 . ArrayList和LinkedList有什么區(qū)別。
ArrayList和Vector使用了數(shù)組的實現(xiàn)描滔,
LinkedList使用了循環(huán)雙向鏈表數(shù)據(jù)結(jié)構(gòu)棒妨。 場景使用不同
對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的含长。對ArrayList而言券腔,主要是在內(nèi)部數(shù)組中增加一項伏穆,指向所添加的元素,偶爾可能會導致對數(shù)組重新進行分配纷纫;而對LinkedList而言枕扫,這個開銷是統(tǒng)一的,分配一個內(nèi)部Entry對象辱魁。
2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動铡原;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不支持高效的隨機元素訪問商叹。
4.ArrayList的空間浪費主要體現(xiàn)在在list列表的結(jié)尾預留一定的容量空間燕刻,而LinkedList的空間花費則體現(xiàn)在它的每一個元素都需要消耗相當?shù)目臻g
? ? ? 可以這樣說:當操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時,就應(yīng)該使用LinkedList了剖笙。
============================================================
5. 講講類的實例化順序卵洗,比如父類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù)弥咪,字段过蹂,子類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù)聚至,字段酷勺,當new的時候,他們的執(zhí)行順序扳躬。
類的實例化順序:先靜態(tài)再父子
父類靜態(tài)數(shù)據(jù)->子類靜態(tài)數(shù)據(jù)->父類字段->子類字段->父類構(gòu)造函數(shù)->子類構(gòu)造函數(shù)
============================================================
6. Map區(qū)別
用過哪些Map類脆诉,都有什么區(qū)別,HashMap是線程安全的嗎,并發(fā)下使用的Map是什么贷币,他們內(nèi)部原理分別是什么击胜,比如存儲方式,hashcode役纹,擴容偶摔,默認容量等。
最常用的Map實現(xiàn)類有:HashMap促脉,ConcurrentHashMap(jdk1.8)辰斋,LinkedHashMap,TreeMap,HashTable瘸味;
其中最頻繁的是HashMap和ConcurrentHashMap宫仗,他們的主要區(qū)別是HashMap是非線程安全的。ConcurrentHashMap是線程安全的硫戈。
并發(fā)下可以使用ConcurrentHashMap和HashTable锰什,他們的主要區(qū)別是:
1.ConcurrentHashMap的hash計算公式:(key.hascode()^ (key.hascode()>>> 16)) & 0x7FFFFFFF
? HashTable的hash計算公式:key.hascode()& 0x7FFFFFFF
2.HashTable存儲方式都是鏈表+數(shù)組,數(shù)組里面放的是當前hash的第一個數(shù)據(jù),鏈表里面放的是hash沖突的數(shù)據(jù)
ConcurrentHashMap是數(shù)組+鏈表+紅黑樹
3.默認容量都是16汁胆,負載因子是0.75梭姓。就是當hashmap填充了75%的busket是就會擴容,最小的可能性是(16*0.75)嫩码,一般為原內(nèi)存的2倍
4 .線程安全的保證:HashTable是在每個操作方法上面加了synchronized來達到線程安全誉尖,ConcurrentHashMap線程是使用CAS(compore and swap)來保證線程安全的
============================================================
7. JAVA8的ConcurrentHashMap為什么放棄了分段鎖,有什么問題嗎铸题,如果你來設(shè)計铡恕,你如何設(shè)計。
jdk8 放棄了分段鎖而是用了Node鎖丢间,減低鎖的粒度探熔,提高性能,并使用CAS操作來確保Node的一些操作的原子性烘挫,取代了鎖诀艰。
但是ConcurrentHashMap的一些操作使用了synchronized鎖,而不是ReentrantLock,雖然說jdk8的synchronized的性能進行了優(yōu)化饮六,但是我覺得還是使用ReentrantLock鎖能更多的提高性能
============================================================
8.? 有沒順序的 Map 實現(xiàn)類其垄,如果有,他們是怎么保證有序的 卤橄。 順序的 Map 實現(xiàn)類:LinkedHashMap,TreeMap
LinkedHashMap 是基于元素進入集合的順序或者被訪問的先后順序排序绿满,TreeMap 則是基于元素的固有順序 (由 Comparator 或者 Comparable 確定)。
============================================================
9. 抽象類和接口的區(qū)別窟扑,類可以繼承多個類么喇颁,接口可以繼承多個接口么,類可以實現(xiàn)多個接口么。抽象類和接口的區(qū)別:
1.抽象類可以有自己的實現(xiàn)方法辜膝,接口在jdk8以后也可以有自己的實現(xiàn)方法(default)
2.抽象類的抽象方法是由非抽象類的子類實現(xiàn)无牵,接口的抽象方法有接口的實現(xiàn)類實現(xiàn)
3.接口不能有私有的方法跟對象,抽象類可以有自己的私有的方法跟對象
類不可以繼承多個類厂抖,接口可以繼承多個接口,類可以實現(xiàn)多個接口
============================================================
10. 繼承和聚合的區(qū)別在哪克懊。
繼承:指的是一個類(稱為子類忱辅、子接口)繼承另外的一個類(稱為父類、父接口)的功能谭溉,并可以增加它自己的新功能的能力墙懂,繼承是類與類或者接口與接口之間最常見的關(guān)系;在Java中此類關(guān)系通過關(guān)鍵字extends明確標識扮念,在設(shè)計時一般沒有爭議性损搬;
聚合:聚合是關(guān)聯(lián)關(guān)系的一種特例,他體現(xiàn)的是整體與部分、擁有的關(guān)系巧勤,即has-a的關(guān)系嵌灰,此時整體與部分之間是可分離的,他們可以具有各自的生命周期颅悉,部分可以屬于多個整體對象沽瞭,也可以為多個整體對象共享;比如計算機與CPU剩瓶、公司與員工的關(guān)系等驹溃;表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的延曙,只能從語義級別來區(qū)分豌鹤;
============================================================
11. 講講你理解的nio。他和bio的區(qū)別是啥枝缔,談?wù)剅eactor模型布疙。
BIO:同步阻塞式IO,服務(wù)器實現(xiàn)模式為一個連接一個線程魂仍,即客戶端有連接請求時服務(wù)器端就需要啟動一個線程進行處理拐辽,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善擦酌。
NIO:同步非阻塞式IO俱诸,服務(wù)器實現(xiàn)模式為一個請求一個線程,即客戶端發(fā)送的連接請求都會注冊到多路復用器上赊舶,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理睁搭。
reactor模型:反應(yīng)器模式(事件驅(qū)動模式):當一個主體發(fā)生改變時,所有的屬體都得到通知笼平,類似于觀察者模式园骆。
============================================================
12. 反射的原理,反射創(chuàng)建類實例的三種方式是什么寓调。
反射的原理:如果知道一個類的名稱/或者它的一個實例對象锌唾, 就能把這個類的所有方法和變量的信息(方法名,變量名夺英,方法晌涕,修飾符,類型痛悯,方法參數(shù)等等所有信息)找出來余黎。
反射創(chuàng)建類實例的三種方式:
1.Class.forName("com.A");
2.new A().getClass();
3.A.class;
============================================================
13. 反射中,Class.forName和ClassLoader區(qū)別载萌。
class.forName()除了將類的.class文件加載到j(luò)vm中之外惧财,還會對類進行解釋巡扇,執(zhí)行類中的static塊。
classLoader只干一件事情垮衷,就是將.class文件加載到j(luò)vm中厅翔,不會執(zhí)行static中的內(nèi)容,只有在newInstance才會去執(zhí)行static塊。
============================================================
14.? 描述動態(tài)代理的幾種實現(xiàn)方式帘靡,分別說出相應(yīng)的優(yōu)缺點知给。
動態(tài)代理有兩種實現(xiàn)方式,分別是:jdk動態(tài)代理和cglib動態(tài)代理
jdk動態(tài)代理的前提是目標類必須實現(xiàn)一個接口描姚,代理對象跟目標類實現(xiàn)一個接口涩赢,從而避過虛擬機的校驗。
cglib動態(tài)代理是繼承并重寫目標類轩勘,所以目標類和方法不能被聲明成final筒扒。
============================================================
15. 動態(tài)代理與cglib實現(xiàn)的區(qū)別。
動態(tài)代理有兩種實現(xiàn)方式绊寻,分別是:jdk動態(tài)代理和cglib動態(tài)代理
jdk動態(tài)代理的前提是目標類必須實現(xiàn)一個接口花墩,代理對象跟目標類實現(xiàn)一個接口,從而避過虛擬機的校驗澄步。
cglib動態(tài)代理是繼承并重寫目標類冰蘑,所以目標類和方法不能被聲明成final。
小編分類整理了許多java進階學習材料和BAT面試題村缸,需要資料的請轉(zhuǎn)發(fā)此文章后再私聊小編回復【java】就能領(lǐng)取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍祠肥。也可以加群:712263501領(lǐng)取海量學習資料進行學習。