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)