Java面试之Java基础上册(含答案)
- JAVA中的幾種基本數據類型是什么,各自占用多少字節。
int 32bit short 16bit
long 64bit byte 8bit
char 16bit float 32bit
double 64bit boolean 1bit
============================================================
-
String類能被繼承嗎,為什么?
public final class Stringimplements java.io.Serializable, Comparable, CharSequence
String 被final修飾了,所有不能被繼承。
1.final修飾的對象不能被修改;
2.final修飾的類不能被繼承;
3.final修飾的方法不能被重寫;
============================================================
- String,Stringbuffer,StringBuilder的區別。
1.可變與不可變
String類中使用字符數組保存字符串,如下就是,因為有“final”修飾符,所以可以知道string對象是不可變的。
private final char value[];
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,如下就是,可知這兩種對象都是可變的。
char[] value;
2.是否多線程安全
String中的對象是不可變的,也就可以理解為常量,顯然線程安全。
AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。看如下源碼
最后,如果程序不是多線程的,那么使用StringBuilder效率高于StringBuffer。
============================================================
4 . ArrayList和LinkedList有什么區別。
ArrayList和Vector使用了數組的實現,
LinkedList使用了循環雙向鏈表數據結構。 場景使用不同
對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。
2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不支持高效的隨機元素訪問。
4.ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間
可以這樣說:當操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。
============================================================
- 講講類的實例化順序,比如父類靜態數據,構造函數,字段,子類靜態數據,構造函數,字段,當new的時候,他們的執行順序。
類的實例化順序:先靜態再父子
父類靜態數據->子類靜態數據->父類字段->子類字段->父類構造函數->子類構造函數
============================================================
- Map區別
用過哪些Map類,都有什么區別,HashMap是線程安全的嗎,并發下使用的Map是什么,他們內部原理分別是什么,比如存儲方式,hashcode,擴容,默認容量等。
最常用的Map實現類有:HashMap,ConcurrentHashMap(jdk1.8),LinkedHashMap,TreeMap,HashTable;
其中最頻繁的是HashMap和ConcurrentHashMap,他們的主要區別是HashMap是非線程安全的。ConcurrentHashMap是線程安全的。
并發下可以使用ConcurrentHashMap和HashTable,他們的主要區別是:
1.ConcurrentHashMap的hash計算公式:(key.hascode()^ (key.hascode()>>> 16)) & 0x7FFFFFFF
HashTable的hash計算公式:key.hascode()& 0x7FFFFFFF
2.HashTable存儲方式都是鏈表+數組,數組里面放的是當前hash的第一個數據,鏈表里面放的是hash沖突的數據
ConcurrentHashMap是數組+鏈表+紅黑樹
3.默認容量都是16,負載因子是0.75。就是當hashmap填充了75%的busket是就會擴容,最小的可能性是(16*0.75),一般為原內存的2倍
4 .線程安全的保證:HashTable是在每個操作方法上面加了synchronized來達到線程安全,ConcurrentHashMap線程是使用CAS(compore and swap)來保證線程安全的
============================================================
- JAVA8的ConcurrentHashMap為什么放棄了分段鎖,有什么問題嗎,如果你來設計,你如何設計。
jdk8 放棄了分段鎖而是用了Node鎖,減低鎖的粒度,提高性能,并使用CAS操作來確保Node的一些操作的原子性,取代了鎖。
但是ConcurrentHashMap的一些操作使用了synchronized鎖,而不是ReentrantLock,雖然說jdk8的synchronized的性能進行了優化,但是我覺得還是使用ReentrantLock鎖能更多的提高性能
============================================================
- 有沒順序的 Map 實現類,如果有,他們是怎么保證有序的 。 順序的 Map 實現類:LinkedHashMap,TreeMap
LinkedHashMap 是基于元素進入集合的順序或者被訪問的先后順序排序,TreeMap 則是基于元素的固有順序 (由 Comparator 或者 Comparable 確定)。
============================================================
- 抽象類和接口的區別,類可以繼承多個類么,接口可以繼承多個接口么,類可以實現多個接口么。抽象類和接口的區別:
1.抽象類可以有自己的實現方法,接口在jdk8以后也可以有自己的實現方法(default)
2.抽象類的抽象方法是由非抽象類的子類實現,接口的抽象方法有接口的實現類實現
3.接口不能有私有的方法跟對象,抽象類可以有自己的私有的方法跟對象
類不可以繼承多個類,接口可以繼承多個接口,類可以實現多個接口
============================================================
- 繼承和聚合的區別在哪。
繼承:指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關系;在Java中此類關系通過關鍵字extends明確標識,在設計時一般沒有爭議性;
聚合:聚合是關聯關系的一種特例,他體現的是整體與部分、擁有的關系,即has-a的關系,此時整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享;比如計算機與CPU、公司與員工的關系等;表現在代碼層面,和關聯關系是一致的,只能從語義級別來區分;
============================================================
- 講講你理解的nio。他和bio的區別是啥,談談reactor模型。
BIO:同步阻塞式IO,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
NIO:同步非阻塞式IO,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
reactor模型:反應器模式(事件驅動模式):當一個主體發生改變時,所有的屬體都得到通知,類似于觀察者模式。
============================================================
- 反射的原理,反射創建類實例的三種方式是什么。
反射的原理:如果知道一個類的名稱/或者它的一個實例對象, 就能把這個類的所有方法和變量的信息(方法名,變量名,方法,修飾符,類型,方法參數等等所有信息)找出來。
反射創建類實例的三種方式:
1.Class.forName(“com.A”);
2.new A().getClass();
3.A.class;
============================================================
- 反射中,Class.forName和ClassLoader區別。
class.forName()除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。
classLoader只干一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。
============================================================
- 描述動態代理的幾種實現方式,分別說出相應的優缺點。
動態代理有兩種實現方式,分別是:jdk動態代理和cglib動態代理
jdk動態代理的前提是目標類必須實現一個接口,代理對象跟目標類實現一個接口,從而避過虛擬機的校驗。
cglib動態代理是繼承并重寫目標類,所以目標類和方法不能被聲明成final。
============================================================
- 動態代理與cglib實現的區別。
動態代理有兩種實現方式,分別是:jdk動態代理和cglib動態代理
jdk動態代理的前提是目標類必須實現一個接口,代理對象跟目標類實現一個接口,從而避過虛擬機的校驗。
cglib動態代理是繼承并重寫目標類,所以目標類和方法不能被聲明成final。
小編分類整理了許多java進階學習材料和BAT面試題,需要資料的請轉發此文章后再私聊小編回復【java】就能領取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領取海量學習資料進行學習。
總結
以上是生活随笔為你收集整理的Java面试之Java基础上册(含答案)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个有趣的个性签名!
- 下一篇: Java面试之Java基础下册(含答案)