標籤:改變 不可變 變數 編程 檢查 環境 清除 定時 重用
1.物件導向和面向過程的區別?
物件導向編程以提供對象的形式,對用戶端程式員提供方法,屏蔽內部實現,對用戶端程式員來說是透明的?,方法與資料之間進行封裝。對事物進行對象化,更符合人類的認知
面向過程編程主要是提供各種方法來供人使用,方法與資料之間沒有必然聯絡。?
2.物件導向的四個基本特性(抽象、封裝、繼承,多態)
繼承:子類對父類的繼承,很大程度上提高了代碼的重用性?
封裝:將資料與方法進行綁定,使得外界不能直接對資料進行操作?
多態:運行時多態和編譯時間多態?
運行時多態:通過引用所指的具體對象的方法,執行自己的方法。?
編譯時間多態:方法的重載?
3.Overload和Override的區別
重寫是對於父子類而言,是子類對父類的方法的重寫?
重載是對同一類而言,同一個類中同名方法根據參數的不同產生不同的行為?
4.構造器Constructor是否可被override
不可以被重寫?
5.存取控制符public,protected,private,以及預設的區別
public :all?
protected:?同一個包下或者子類可以訪問
private:同一類?
預設:包存取權限控制,同包?
6.是否可以繼承String類
不可以,String是final類?
7.String和StringBuffer、StringBuilder的區別?
String是不可變字串,StringBuilder和StringBuffer是可變的,StringBuilder不是安全執行緒的StringBuffer是安全執行緒的。
8.hashCode和equals方法的關係
當兩個對象equals方法返回true時,兩個方法的hashcode值就要相等否則將會產生效率問題
9.抽象類別和介面的區別
抽象類別中可以包含成員變數和成員方法以及抽象方法
介面中只能包含常量和抽象方法
10.自動裝箱與拆箱
將基本類型資料與參考型別資料進行轉換,是jdk1.5以後的特性
11.什麼是泛型、為什麼要使用以及泛型擦除
泛型的本質是參數化型別,泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,以提高代碼的重用率。在沒加入泛型前,參數都是object類型,容易引發ClassCastException。泛型是編譯器認可的,但虛擬機器並不認識,因此在編譯期,編譯器會將泛型轉換為原始類型擦除是將泛型型別以其父類代替,如String 變成了Object等。其實在使用的時候還是進行帶強制類型的轉化,只不過這是比較安全的轉換,因為在編譯階段已經確保了資料的一致性。
12.Java中的集合類及關係圖
Collection:List,Set,Queue
Map:HashMap,HashTable
13.HashMap實現原理(看原始碼)HashTable實現原理(看原始碼)(看了大概)
14.HashMap和HashTable區別
HashMap是線程不安全的,但效率比HashTable高,HashMap允許有空值而HashTable不允許有空值
15.HashTable如何?安全執行緒(看原始碼,對可能引起安全執行緒問題的方法加了同步鎖)ArrayList和vector區別(看原始碼)(看了部分)
16.ArrayList和LinkedList區別及使用情境
ArrayList是基於數組的實現的,隨機訪問快,隨機訪問可達到O(1),增刪元素消耗較大
LinkedList是基於鏈表實現的,增刪元素塊快,但訪問元素需要遍曆鏈表
17.Collection和Collections的區別
Collection是集合介面而Collections是集合的工具類,提供一系列基於Collection的操作
18.Concurrenthashmap實現原理(看原始碼,鎖部分理解有障礙,有待學習)
http://www.cnblogs.com/ITtangtang/p/3948786.html
通過分析Hashtable就知道,synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨佔,ConcurrentHashMap允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以並發進行。
有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖。這裡“按順序”是很重要的,否則極有可能出現死結,在ConcurrentHashMap內部,段數組是final的,並且其成員變數實際上也是final的,但是,僅僅是將數組聲明為final的並不保證數群組成員也是final的,這需要實現上的保證。這可以確保不會出現死結,因為獲得鎖的順序是固定的。
19.Error、Exception區別
Error一般是重大錯誤,屬於不可控的,大多是虛擬機器上的問題,遇到這樣的問題大多是讓程式終止
Exception是指異常,異常的出現協助程式員更好的發現潛在的問題,更好的編程。遇到Exception解決辦法是捕獲異常讓程式繼續運行下去
20.Unchecked Exception和Checked Exception,各列舉幾個
//Unchecked Exception包括Error和RuntimeException
//堆疊溢位,記憶體不足等error
運行時異常:null 指標異常,數組越界,除數為零等
Checked Exception需要被try-catch異常處理塊包圍進行異常處理
21.java代理,jdk和cglib的動態代理
代理是一種設計模式,通過代理可以調用委託的具體方法,代理的作用:對其他對象提供一種代理以控制對這個對象的訪問。
在某些情況下,一個對象不想或者不能直接引用另一個對象,而代理對象可以在用戶端和目標對象之間起到中介的作用。
代理模式的思想是為了提供額外的處理或者不同的操作而在實際對象與調用者之間插入一個代理對象。這些額外的操作通常需要與實際對象進行通訊。
JDK的動態代理是通過介面的方式,而cglib動態代理的方式則是採用在運行時改變類的位元組碼的方式。
22.多線程的實現方式
繼承Thread類,實現Runnable介面,線程池
23.線程的狀態轉換
可運行->運行態->阻塞
阻塞->可運行
運行->可運行
24.如何停止一個線程
Thread中內建的stop方法,但是該方法可能導致線程的死結,所以不建議使用。
使用退出標誌來結束線程
使用中斷,當中斷標誌為true時退出線程(如果線程在調用 Object 類的 wait()、wait(long) 或 wait(long, int) 方法,或者該類的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法過程中受阻,則其中斷狀態將被清除,它還將收到一個 InterruptedException。
)所以不能單純地依靠isIntrrupted方法退出線程
25.什麼是安全執行緒
在多線程的環境下訪問同一個代碼塊不會產生不同的結果,編寫安全執行緒的代碼依靠線程的同步。
26.如何保證安全執行緒
先來看為什麼會出現線程不安全問題:
JVM有主記憶體(Main Memory)和工作記憶體(Working Memory),主記憶體就是平時所說的java堆記憶體,存放程式中所有的類執行個體、待用資料等變數,是線程共用的,而工作記憶體中存放的是從主記憶體中拷貝過來的變數以及存取方法所取得的局部變數,是每個線程獨立所有的,其他線程不能訪問。
通過鎖機制來實現安全執行緒,synchronize同步鎖,lock鎖
27.synchronized和Lock的區別
Synchronized在效率上可能比不上lock,但代碼也要注重一個方面就是可讀性,Synchronized可讀性較高,且不用自己釋放鎖,而lock則需要自己主動釋放鎖。
Lock可以解決忙等問題。因為synchronized加鎖後如遇到阻塞或者sleep方法等不會主動釋放鎖,那麼其他線程只能選擇等待。
Lock中的lock方法當拿不到鎖時會一直等待,而trylock則不是
1)Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現;
2)synchronized在發生異常時,會自動釋放線程佔有的鎖,因此不會導致死結現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死結現象,因此使用Lock時需要在finally塊中釋放鎖;
3)Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;
4)通過Lock可以知道有沒有成功擷取鎖,而synchronized卻無法辦到。
5)Lock可以提高多個線程進行讀操作的效率
28.多線程如何進行資訊互動
Wait方法讓線程處於等待狀態,並且釋放鎖,直到該對象的notify方法或notifyAll方法才會使得該處於等待的線程喚醒。
29.sleep和wait的區別(考察的方向是是否會釋放鎖)
Sleep方法不會釋放鎖,而wait方法則會釋放鎖
30.多線程與死結
多線程訪問順序不當產生的死結
31.如何產生死結
1.資源不足
2.線程運行順序不當
3.資源分派不當
32.什麼叫守護線程,用什麼方法實現守護線程
當前台線程運行結束,守護線程相應結束,守護線程用來給其他線程提供服務的。
在運行前設定setDaemon為true
33.Java線程池技術及原理
線程池通過預先建立一系列的線程,通過請求隊列將任務交給線程,然後通過結果隊列處理結果
線程池技術提高了線程的複用,但增加了死結的風險,消耗了記憶體,請求過載以及線程泄露
34.java並發包concurrent及常用的類
concurrent類是用於並發編程的
35.volatile的使用
如果這些單一資料型別聲明為volatile,對它們的操作就會變成原子層級的
當變數的值由自身的上一個決定時,如n=n+1、n++等,volatile關鍵字將失效,只有當變數的值和自身上一個值無關時對該變數的操作才是原子層級的,如n = m + 1,這個就是原層級的。所以在使用volatile關鍵時一定要謹慎,如果自己沒有把握,可以使用synchronized來代替volatile。
java知識總結上