Java面試系列03:Java基礎之集合基礎

1. ==和equls區別:

基本類型:

**==**是比較他們的值。

引用類型:

==是比較他們的地址。

默認的equals方法(從Object 類繼承的)

return this==object;

可以重寫equals方法

2.String,StringBuffer與StringBuilder的區別?

String 字符串常量
String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因爲每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。
StringBuffer 字符串變量(線程安全)
每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。看源碼發現:線程安全是因爲使用synchronized 同步方法
StringBuilder 字符串變量(非線程安全)

3.Collection:單列集合類的根接口(Collections是針對集合類的一個幫助類)

List:
List接口的主要實現類有java.util.ArrayList和java.util.LinkedList
java.util.ArrayList:
ArrayList是實現了基於動態數組的數據結構,ArrayList併發add()可能出現數組下標越界異常。
和ArrayList不同,Vector中的操作是線程安全的。
java.util.LinkedList:
ArrayList採用數組實現的,查找效率比LinkedList高。
LinkedList採用雙向鏈表實現的,插入和刪除的效率比ArrayList要高。

Set:
存入的元素不出現重複。Set接口的主要實現類有java.util.HashSet
java.util.HashSet:
HashSet 是根據對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。
保證元素唯一性的方式依賴於: hashCode 與 equals 方法。
當調用add()方法向集合中存入對象的時候,先比較此對象與原有對象的哈希值有沒有一樣的,如果都不一樣就直接存入;
如果有與之相同的哈希值,則要繼續比較這兩個對象是否爲同一個對象,此時就要調用對象的equals()方法了。
總之,只有HashCode的值相同時,纔會調用equals()方法。

Iterator接口:
Iterator主要用於迭代訪問(即遍歷)Collection中的元素,因此Iterator對象也被稱爲迭代器。

				/*
				泛型
				即“參數化類型”。
				就是將類型由原來的具體的類型參數化,
				類似於方法中的變量參數,
				此時類型也定義成參數形式(可以稱之爲類型形參),
				然後在使用/調用時傳入具體的類型(類型實參)。
				*/
				//使用迭代器 遍歷   每個集合對象都有自己的迭代器
        		Iterator<String> it = coll.iterator();
        		//  泛型指的是 迭代出 元素的數據類型
        		while(it.hasNext()){ //判斷是否有迭代元素
            			String s = it.next();//獲取迭代出的元素
            			System.out.println(s);
        		}

4.Map:雙列集合。

Map常用子類:HashMap、HashTable、LinkedHashMap
HashMap
存儲數據採用的哈希表結構,元素的存取順序不能保證一致。
Java 用自定義類作爲 HashMap 的鍵需要重寫 hashCode ( ) 和 equals ( ) 兩個方法。
由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
當給HashMap中存放自定義對象時,如果自定義對象作爲key存在,這時要保證對象唯一,必須複寫對象的hashCode和equals方法(如果忘記,請回顧HashSet存放自定義對象)。
如果要保證map中存放的key和取出的順序一致,可以使用 java.util.LinkedHashMap 集合來存放。
對於HashMap來說,鍵和值是可以爲null的,map.put(null, “4”)還會覆蓋map.put(null, “2”)這個操作。
線程不安全。key和value都可以爲空(鍵最多隻有一個爲空)
實現:
如果發生hash衝突,HashMap會將同一個桶中的數據(hashCode相同)以鏈表的形式存儲,但是如果發生hash衝突的概率比較高,就會導致同一個桶中的鏈表長度過長,遍歷效率降低,所以在JDK1.8中如果鏈表長度到達閥值(默認是8),就會將鏈表轉換成紅黑二叉樹。紅黑樹最長路徑不超過最短路徑的兩倍。
HashTable
線程安全,key和value都不可以爲空
LinkedHashMap:
HashMap下有個子類LinkedHashMap,存儲數據採用的哈希表結構+鏈表結構。
通過鏈表結構可以保證元素的存取順序一致;
通過哈希表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
HashMap中的連接只是同一個桶中的元素連接,而LinkedHashMap是將所有桶中的節點串聯成一個雙向鏈表。
Map遍歷:
方法一:遍歷鍵的Set集合 map.keySet();

//獲取所有的鍵 獲取鍵集(是Set集合)
		Set<String> keys = map.keySet();
		// 遍歷鍵集 得到 每一個鍵
		for (String key : keys) {
			//key 就是鍵
			//獲取對應值
			String value = map.get(key);
			System.out.println(key+"的CP是:"+value);
		}

方法二:entrySet

// 獲取 所有的 entry對象 entrySet
			Set<Entry<String,String>> entrySet = map.entrySet();
			// 遍歷得到每一個entry對象
			for (Entry<String, String> entry : entrySet) {
				// 解析
				String key = entry.getKey();
				String value = entry.getValue();
				System.out.println(key+":"+value);
			}

5.集合總結

List以特定索引來存取元素,可以有重複元素。
Set不能存放重複元素(用對象的equals()方法來區分元素是否重複)。
Map保存鍵值對(key-value pair)映射,映射關係可以是一對一或多對一。
Set和Map容器都有基於哈希存儲和排序樹的兩種實現版本,基於哈希存儲的版本理論存取時間複雜度爲O(1)

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