指南Java面试常问问题及答案
Java 面試常問問題及答案(非常詳細)
一:java 基礎
1.簡述 string 對象,StringBuffer、StringBuilder 區分
string 是 final 的,內部用一個 final 類型的 char 數組存儲數據,它的拼接效率比較低,實際上是通過建立一個 StringBuffer,讓后臺調用 append(),最后再將 StringBuffer toSting(),每次操作 Sting 都會重新建立新的對象來保存新的值.這樣原來的對象就沒用了,就要被垃圾回收.這也是要影響性能的。
StringBuffer 也是 final,線程安全的,中采用一個 char 數組來保存需要 append 的字符串,char 數組有一個初始大小,當 append 的字符串長度超過當前 char 數組容量時,則對 char 數組進行動態擴展,也即重新申請一段更大的內存空間,然后將當前 char 數組拷貝到新的位置,因為重新分配內存并拷貝的開銷比較大,所以每次重新申請內存空間都是采用申請大于當前需要的內存空間的方式,這里是 2 倍。
StringBuilder,線程不安全。
2.多態的原理
多態就是:允許基類的指針或引用指向派生類的對象,而在具體訪問時實現方法的動態綁定。
原理是 java 的后期綁定。
3.簡要描述面向對象編程的思想
抽象:通過特定的實例抽取出共同的特征以后形成的概念的過程,它強調主要特征和忽略次要特征。
封裝:把對象的屬性和方法結合成一個獨立的整體,隱藏實現細節,并提供對外訪問的接口。
繼承:從已知的一個類中派生出新的一個類,叫子類。子類實現了父類所有非私有化屬性和方法,
并能根據自己的實際需求擴展出新的行為。
多態:多個不同的對象對同一消息作出響應,同一消息根據不同的對象而采用各種不同的行為方法。
4.反射的原理
java 虛擬機運行時內存有個叫方法區,主要作用是存儲被裝載的類的類型信息。每裝載一個類的時候,java 就會創建一個該類的 Class 對象實例。我們就可以通過這個實例,來訪問這個類的信息。
5.代理的作用和實現
代理模式的作用是:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
java 的靜態代理和動態代理(略)
6.hashcode 和 equals 的用法
Java 對于 eqauls 方法和 hashCode 方法是這樣規定的:
如果兩個對象相同,那么它們的 hashCode 值一定要相同;
如果兩個對象的 hashCode 相同,它們并不一定相同(上面說的對象相同指的是用 eqauls 方法比較。)
一般在覆蓋 equals()方法的同時也要覆蓋 hashCode()方法,否則,就會違反 Object.hashCode 的通用約定,從而導致該類無法與所有基于散列值(hash)集合類(HashMap、HashSet 和 Hashtable)結合在一起正常運行。
7.set,map,list 的區別(盡量詳細)
map:
hashmap:鏈地址法,大概思路:通過取 key 的 hashCode 值、高位運算、取模運算計算位置,插入位置是通過 hascode 和 eques 方法判斷 key 是否一致
①.判斷鍵值對數組 table[i]是否為空或為 null,否則執行 resize()進行擴容;
②.根據鍵值 key 計算 hash 值得到插入的數組索引 i,如果 table[i]==null,直接新建節點添加,轉向⑥,如果 table[i]不為空,轉向③;
③.判斷 table[i]的首個元素是否和 key 一樣,如果相同直接覆蓋 value,否則轉向④,這里的相同指的是 hashCode 以及 equals;
④.判斷 table[i] 是否為 treeNode,即 table[i] 是否是紅黑樹,如果是紅黑樹,則直接在樹中插入鍵值對,否則轉向⑤;
⑤.遍歷 table[i],判斷鏈表長度是否大于 8,大于 8 的話把鏈表轉換為紅黑樹,在紅黑樹中執行插入操作,否則進行鏈表的插入操作;遍歷過程中若發現 key 已經存在直接覆蓋 value 即可;
⑥.插入成功后,判斷實際存在的鍵值對數量 size 是否超多了最大容量 threshold,如果超過,進行擴容。
treemap:TreeMap 實現 SortedMap 接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用 Iterator 遍歷 TreeMap 時,得到的記錄是排過序的。如果使用排序的映射,建議使用 TreeMap。在使用 TreeMap 時,key 必須實現 Comparable 接口或者在構造 TreeMap 傳入自定義的 Comparator,否則會在運行時拋出 java.lang.ClassCastException 類型的異常。
linkedHashMap:保存了記錄的插入順序,在用 Iterator 遍歷 LinkedHashMap 時,先得到的記錄肯定是先插入的,也可以在構造時帶參數,按照訪問次序排序。
HashTable:因為內部是采用 synchronized 來保證線程安全的
CocurrentHashMap:利用鎖分段技術增加了鎖的數目,從而使爭奪同一把鎖的線程的數目得到控制。
set:
HashSet:內部 new 了一個 hashMap,添加時 key 放數據,value 放一個內部定義的 final 的 Object 對象
LinkedHashSet:內部 new 了一個 linkHashMap,添加時 key 放數據,value 放一個內部定義的 final 的 Object 對象,遍歷時有序
TreeSet:內部 new 了一個 TreeMap,添加時 key 放數據,value 放一個內部定義的 final 的 Object 對象.
list:
arraylist 和 linkedList(略)
copywriteList:CopyOnWriteArrayList 適合使用在讀操作遠遠大于寫操作的場景
總結
以上是生活随笔為你收集整理的指南Java面试常问问题及答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信支付-免充值立减与折扣(上篇)
- 下一篇: 2021-2027全球与中国汽车CMOS