Java面試題散列知識點

父類的靜態方法能否被子類重寫,爲什麼?

靜態方法只與類相關,不與具體實現相關。並且static方法不是後期綁定的,它在編譯期就綁定了。所有引用到該方法的對象(父類的對象也好子類的對象也好)所指向的都是同一塊內存中的數據,也就是該靜態方法。父類的靜態方法不能被子類繼承,更談不上重寫;

接口回調實現過程:

定義一個回調函數;
給事件發送方傳入接口,在需要的地方調用未實現方法;在事件接收方實例化接口並處理結果。
當事件發生時,會通知回調函數進行處理。

泛型原理:

Java的泛型是僞泛型。使用泛型的時候加上的類型參數,會在編譯器在編譯的時候去掉。這個過程就稱爲類型擦除。泛型只在編譯期有效。

創建對象方式:

1.採用new 2.通過反射 3.採用clone 4.通過序列化機制

Object中有哪些公共方法?
equals()
clone()
getClass()
wait()
notify(),notifyAll()
toString()
finalize()
反射中,Class.forName和classloader的區別

class.forName()前者除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。
classLoader只幹一件事情,就是將.class文件加載到jvm中,不會執行static中的內容

throw與throws的比較

1、throws出現在方法函數頭;而throw出現在函數體。
2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常對象。
throw new NumberFormatException();
void function() throws NumberFormatException{}

爲什麼Java被稱作是“平臺無關的編程語言”?

Java虛擬機有自己完善的硬體架構,如 處理器 、 堆棧 、 寄存器 等,還具有相應的 指令 系統。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼( 字節碼 ),就可以在多種平臺上不加修改地運行。

JDK和JRE的區別是什麼?

JRE(java運行環境)包括java虛擬機和applet;
Jdk(java開發工具包)包括JRE和編譯器等。可以開發、編譯執行java程序。

static修飾方法能否被覆蓋?

static方法不能被覆蓋,因爲方法覆蓋是運行時動態綁定的,而static方法是編譯時靜態綁定的。static變量在Java中是屬於類的,它在所有的實例中的值是一樣的。

爲什麼Static方法用非static變量會報錯?

Static編譯時加載,此時非static變量還沒有被創建。

finalize() 方法

finalize是Object類的一個方法。GC回收對象前調用finalize()方法。

爲什麼內部類調用的外部變量必須是final修飾的?

方法中的局部變量,方法結束後這個變量就要釋放掉。然而內部類的某個方法還沒有執行完,這個時候他所引用的外部變量已經找不到了。如果定義爲final,java會將這個變量複製一份作爲成員變量內置於內部類中。爲了解決:局部變量的生命週期與局部內部類的對象的生命週期的不一致性問題

迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接調用集合的
remove(Object Obj)刪除,可以通過迭代器的remove()方法刪除。

Array可以包含基本類型和對象類型,ArrayList只能包含對象類型,如果要存基本數據類型,也要用它們的包裝類才能通過。

Compareble和comparetor接口:

Comparetor:需實現compare(o1,o2)和equals
Compareble:需實現compareto(o)方法
返回int值,負數,0,正數 表示小於,等於大於

System.gc()和Runtime.gc() 這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決於JVM的。

異常處理完成以後,Exception對象會發生什麼變化?

答:Exception對象會在下一個垃圾回收過程中被回收掉。

內部類的產生依賴於外部類,持有外部類的引用是類名.this

Vector會將它的容量翻倍,ArrayList只增加50%的大小

淺拷貝和深拷貝

引用的拷貝
private static void copyReferenceObject(){
Person p = new Person(23, "zhang");
Person p1 = p;
System.out.println(p);
System.out.println(p1);
}
這裏打印的結果:
com.yaolong.clone.Person@3654919e
com.yaolong.clone.Person@3654919e
可以看到,打印的結果是一樣的,也就是說,二者的引用是同一個對象,並沒有創建出一個新的對象。

淺拷貝
淺拷貝是按位拷貝對象,它會創建一個新對象,這個對象有着原始對象屬性值的一份精確拷貝。如果屬性是基本類型,拷貝的就是基本類型的值;如果屬性是內存地址(引用類型),拷貝的就是內存地址

深拷貝
深拷貝會拷貝所有的屬性,並拷貝屬性指向的動態分配的內存。當對象和它所引用的對象一起拷貝時即發生深拷貝。

Session與Cookie分別是什麼

Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。

Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當於程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

Session與Cookie的區別與聯繫

1、Cookie和Session都是會話技術,Cookie是運行在客戶端,Session是運行在服務器端。

2、Cookie有大小限制以及瀏覽器在存cookie的個數也有限制,Session是沒有大小限制和服務器的內存大小有關。

3、Cookie有安全隱患,通過攔截或本地文件找得到你的cookie後可以進行攻擊。

4、Session是保存在服務器端上會存在一段時間纔會消失,如果session過多會增加服務器的壓力。

Java對象的生命週期

1.創建階段(Created)
爲對象分配內存空間,屬性初始化
2.應用階段(In Use)
對象至少被一個強引用持有着。
3.不可見階段(Invisible)
當一個對象處於不可見階段時,說明程序本身不再持有該對象的任何強引用,雖然該這些引用仍然是存在着的。
簡單說就是程序的執行已經超出了該對象的作用域了。
4.不可達階段(Unreachable)
指該對象不再被任何強引用所持有。
5.收集階段(Collected)
當垃圾回收器發現該對象已經處於“不可達階段”並且垃圾回收器已經對該對象的內存空間重新分配做好準備時,則對象進入了“收集階段”。
6.終結階段
當對象執行完finalize()方法後,則該對象進入終結階段。
7.對象空間重新分配階段
垃圾回收器對該對象的所佔用的內存空間進行回收或者再分配了,則該對象徹底消失了

靜態類的主要特性:

1:僅包含靜態成員。
2:無法實例化。
3:是密封的。
4:不能包含實例構造函數。

非靜態內部類能訪問外部類的一切屬性;靜態內部類只能訪問外部類的靜態屬性。

foreach與正常for循環效率對比

for循環在遍歷集合時使用下標來定位集合中的元素,foreach來遍歷集合時,集合必須實現Iterator接口,foreach就是使用Iterator接口來實現對集合的遍歷的。foreach遍歷集合是根據一個元素獲取下一個元素遍歷的。

所以for循環遍歷ArrayList,底層是數組,地址下標是連續的,效率比foreach高。
for循環遍歷LinkedList,地址下標不連續,效率比foreach低。

Java1.7與1.8新特性

1.7
1.switch中可以使用字串
2.運用List<String> tempList = new ArrayList<>(); 即泛型實例化類型自動推斷
3.數據運算安全性加強;

1.8
引入Lambda 表達式

IPC通信的幾種方式:

管道、信號、信號量、共享內存、消息隊列、套接字。

靜態變量在什麼時候加載?編譯期還是運行期?靜態代碼塊加載的時機呢?

答案:當類加載器將類加載到JVM中的時候就會創建靜態變量,這跟對象是否創建無關。靜態變量加載的時候就會分配內存空間。靜態代碼塊的代碼只會在類第一次初始化的時候執行一次。一個類可以有多個靜態代碼塊,它並不是類的成員,也沒有返回值,並且不能直接調用。它們通常被用初始化靜態變量。

如果原地,不使用第三個變量交換兩個變量的值

例如:int a=5,b=10;
第一種:兩數的和減去b得到a的值,賦給b;兩數的和再減b(此時實際是a的值),賦給a;

a=a+b; b=a-b; a=a-b;

第二種,用異或

a^=b;
b^=a;
a^=b;
java i+1<i怎麼出現

當用一個char、int、long等表示了一個該類型範圍內的最大數,再增加1就會越界。比如:

        int a = Integer.MAX_VALUE;
        System.out.println(a);
        int b = a+1;
        System.out.println(b);

打印出來分別是 2147483647和-2147483648,即爲2的31次方-1到-2的31次方。

i - 1 > i同理,-2^31 - 1 = 2^31 - 1。

堆是什麼樣的結構?

堆的存儲是靠數組來存儲。結構是二叉樹一樣的結構。


將不使用的引用對象置於null會加速回收嗎?

不會。JVM會智能地判斷對象是否應該被回收,置於null對其沒有影響。

HashMap和Hashtable的區別

1.兩者最主要的區別在於Hashtable是線程安全,而HashMap則非線程安全
2.HashMap可以使用null作爲key,而Hashtable則不允許null作爲key
3.兩者計算hash的方法不同

實例化數組後,能不能改變數組長度呢
不能,數組一旦實例化,它的長度就是固定的

String str=”aaa”,與String str=new String(“aaa”)一樣嗎?

不一樣的。因爲內存分配的方式不一樣。
第一種,創建的”aaa”是常量,jvm都將其分配在常量池中。
第二種創建的是一個對象,jvm將其值分配在堆內存中。

抽象類必須要有抽象方法嗎

不是必須。抽象類可以沒有抽象方法。

HashSet和TreeSet有什麼區別?

HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是O(1)。
另一方面,TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。因此,add(),remove(),contains()方法的時間複雜度是O(logn)。

泛型有什麼作用?

能夠進行編譯期間類型檢查,避免不必要的類型錯誤,加強安全性驗證。

什麼是樂觀鎖和悲觀鎖

樂觀鎖:樂觀鎖認爲競爭不總是會發生,因此它不需要持有鎖
悲觀鎖:悲觀鎖認爲競爭總是會發生,因此每次對某資源進行操作時,都會持有一個獨佔的鎖,就像synchronized

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章