政府網(wǎng)站建設(shè)需求調(diào)查表網(wǎng)站推廣方法大全
1.介紹:
Java 集合框架,又被稱為容器是定義在 java.util 包下的一組接口 interfaces 和其實(shí)現(xiàn)類 classes 。
其主要表現(xiàn)為將多個(gè)元素置于一個(gè)單元中,用于對(duì)這些元素進(jìn)行快速、便捷的存儲(chǔ)、檢索?、管理 ,即平時(shí)我們俗稱的增刪查改 CRUD 。
2.類和接口總覽
3.學(xué)習(xí)的意義?
- 使用成熟的集合框架,有助于我們便捷、快速的寫出高效、穩(wěn)定的代碼
- 學(xué)習(xí)背后的數(shù)據(jù)結(jié)構(gòu)知識(shí),有助于我們理解各個(gè)集合的優(yōu)缺點(diǎn)及使用場(chǎng)景
?
?4.常見面試題
HashMap 了解不,介紹一下,如果一個(gè)對(duì)象為 key 時(shí),hashCode 和 equals 方法的用法要注意什么?
先說(shuō)一下equals方法和hashcode的關(guān)系
- 如果兩個(gè)對(duì)象equals相等,那么這兩個(gè)對(duì)象的hashcode一定也相同
- 如果兩個(gè)對(duì)象的hashcode相同,不代表兩個(gè)對(duì)象就相同,只能說(shuō)明這兩個(gè)對(duì)象在散列存儲(chǔ)結(jié)構(gòu)中,存放于同一個(gè)位置(放在同一個(gè)籃子里)
在HashMap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認(rèn)為他們是相等的。若equals()不相等則認(rèn)為他們不相等。
所以想以對(duì)象作為HashMap的key,必須重寫該對(duì)象的hashCode和equals方法。確保hashCode相等的時(shí)候equals的值也是true。
Student st1 = new Student("wei","man");
Student st2 = new Student("wei","man");?
正常理解這兩個(gè)對(duì)象再存入到hashMap中應(yīng)該是相等的,但如果你不重寫 hashcode()方法的話,比較是其地址,不相等!
HashMap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認(rèn)為他們是相等 的。若equals()不相等則認(rèn)為他們不相等。如果只重hashcode()不重寫equals()方法,當(dāng)比較equals()時(shí)只是看他們是否為 同一對(duì)象(即進(jìn)行內(nèi)存地址的比較),所以必定要兩個(gè)方法一起重寫。HashMap用來(lái)判斷key是否相等的方法,其實(shí)是調(diào)用了HashSet判斷加入元素 是否相等。
HashSet 和 HashMap 的區(qū)別是什么?
1.hashset實(shí)現(xiàn)了set接口,它不允許集合中出現(xiàn)重復(fù)元素,當(dāng)我們提到hashset的時(shí)候,第一件事就是在將對(duì)象存儲(chǔ)在hashset之前,要確保重寫hashCode()方法和equals方法,這樣才能比較對(duì)象的值是否相等,確保集合中沒有存儲(chǔ)相同的對(duì)象,如果不重寫上述兩個(gè)方法,那么將使用下面方法默認(rèn)實(shí)現(xiàn):public boolean add(Object obj)方法用在Set添加元素時(shí),如果元素值重復(fù)時(shí)返回“false”,如果添加成功則返回"true".
2.hashmap實(shí)現(xiàn)了map接口,map接口對(duì)鍵值對(duì)進(jìn)行映射,map中不允許出現(xiàn)重復(fù)的鍵,map接口有倆個(gè)基本的實(shí)現(xiàn)treemap,hashmap,treemap保存了對(duì)象的排列次序,而hashmap不能,hashmap可以有空的鍵值對(duì),hashmap是非線程安全的,要想實(shí)現(xiàn)線程安全,那么需要調(diào)用collections類的靜態(tài)方法synchronizedMap()實(shí)現(xiàn)。? ? ??
HashMap 是線程安全的么?那需要線程安全需要用到什么?
精講
hashmap線程不安全 線程安全的替代方案有:
HashTable,Collections.synchronizedMap,ConcurrentHashMap
hashtable,在get,put方法加了synchronized,hashtable是通過(guò)synchronized來(lái)實(shí)現(xiàn)線程安全的。
synchronizedMap的使用:
//實(shí)例化一個(gè)HashMap對(duì)象,該對(duì)象是非線程安全的
Map map = new HashMap();
//實(shí)例化一個(gè)SynchronizedMap對(duì)象,該對(duì)象是線程安全的
//將非線程安全的map對(duì)象傳入到線程安全的SynchronizedMap對(duì)象中
SynchronizedMap synchronizedMap = new SynchronizedMap(map);
//底層通過(guò)synchronized保證了線程安全
synchronizedMap.put("author", "技術(shù)筆記");
Collections.synchronizedMap方法的實(shí)現(xiàn)很簡(jiǎn)單,該方法是一個(gè)靜態(tài)方法,封裝了裝飾器類SynchronizedMap的創(chuàng)建邏輯,使方法的調(diào)用者無(wú)需了解底層的具體實(shí)現(xiàn),從而簡(jiǎn)化了編程。Collections.synchronizedMap方法使用了裝飾器模式為線程不安全的HashMap提供了一個(gè)線程安全的裝飾器類SynchronizedMap,通過(guò)SynchronizedMap來(lái)間接的保證對(duì)HashMap的操作是線程安全,而SynchronizedMap底層也是通過(guò)synchronized關(guān)鍵字來(lái)保證操作的線程安全
ConcurrentHashMap,ConcurrentHashMap的put方法使用了cas+syncronized保證了添加鍵值對(duì)數(shù)據(jù)的原子性.ConcurrentHashMap也使用了volatile保證了共享變量的內(nèi)存可見性.
ArrayList 和 LinkedList 的區(qū)別是什么?
- arraylist是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的集合,linkedlist是基于鏈表實(shí)現(xiàn)的集合,
- 對(duì)于隨機(jī)訪問(wèn)的index下標(biāo)元素,get(查),set(改)操作,arraylist直接使用下標(biāo)找到元素,而linkedlist需要指針遍歷元素,arraylist要比linkedlist快.
- add(增),del(刪),arraylist在新增元素的時(shí)候可能進(jìn)行擴(kuò)容和復(fù)制數(shù)組,linkedlist只需要修改指針即可。? ? ??
- linkedlist不適合高效的隨機(jī)訪問(wèn)
有了解過(guò) HashMap 的具體實(shí)現(xiàn)么?
HashMap 和 ConcurrentHashMap 哪個(gè)效率更高?
判斷一個(gè)鏈表是否是一個(gè)回文鏈表。
hashCode 主要是用來(lái)做什么用的?
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用來(lái)在散列存儲(chǔ)結(jié)構(gòu)中確定對(duì)象的存儲(chǔ)地址的;
2、如果兩個(gè)對(duì)象相同,就是適用于equals(java.lang.Object) 方法,那么這兩個(gè)對(duì)象的hashCode一定要相同;
3、兩個(gè)對(duì)象的hashCode相同,并不一定表示兩個(gè)對(duì)象就相同,也就是不一定適用于equals(java.lang.Object) 方法,只能夠說(shuō)明這兩個(gè)對(duì)象在散列存儲(chǔ)結(jié)構(gòu)中,如Hashtable,他們“存放在同一個(gè)籃子里”。
1.hashcode是用來(lái)查找的,如果你學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)就應(yīng)該知道,在查找和排序這一章有
例如內(nèi)存中有這樣的位置
0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?
而我有個(gè)類,這個(gè)類有個(gè)字段叫ID,我要把這個(gè)類存放在以上8個(gè)位置之一,如果不用hashcode而任意存放,那么當(dāng)查找時(shí)就需要到這八個(gè)位置里挨個(gè)去找,或者用二分法一類的算法。
但如果用hashcode那就會(huì)使效率提高很多。
我們這個(gè)類中有個(gè)字段叫ID,那么我們就定義我們的hashcode為ID%8,然后把我們的類存放在取得得余數(shù)那個(gè)位置。比如我們的ID為9,9除8的余數(shù)為1,那么我們就把該類存在1這個(gè)位置,如果ID是13,求得的余數(shù)是5,那么我們就把該類放在5這個(gè)位置。這樣,以后在查找該類時(shí)就可以通過(guò)ID除 8求余數(shù)直接找到存放的位置了。2.但是如果兩個(gè)類有相同的hashcode怎么辦那(我們假設(shè)上面的類的ID不是唯一的),例如9除以8和17除以8的余數(shù)都是1,那么這是不是合法的,回答是:可以這樣。那么如何判斷呢?在這個(gè)時(shí)候就需要定義 equals了。
也就是說(shuō),我們先通過(guò) hashcode來(lái)判斷兩個(gè)類是否存放某個(gè)桶里,但這個(gè)桶里可能有很多類,那么我們就需要再通過(guò) equals 來(lái)在這個(gè)桶里找到我們要的類。
那么。重寫了equals(),為什么還要重寫hashCode()呢?
想想,你要在一個(gè)桶里找東西,你必須先要找到這個(gè)桶啊,你不通過(guò)重寫hashcode()來(lái)找到桶,光重寫equals()有什么用啊
?
5.接口
Collection :用來(lái)存儲(chǔ)管理一組對(duì)象 objects ,這些對(duì)象一般被成為元素 elements
?
- 1. Set : 元素不能重復(fù),背后隱含著查找/搜索的語(yǔ)義
- 2. SortedSet : 一組有序的不能重復(fù)的元素
- 3. List : 線性結(jié)構(gòu)
- 4. Queue : 隊(duì)列
- 5. Deque : 雙端隊(duì)列
- 6.Map : 鍵值對(duì),背后隱含著查找/搜索的語(yǔ)義
- 7.SortedMap : 一組有序的鍵值對(duì)
?
6.Collection 接口
Collection 常用方法
Collection 代碼示例:
package test1;import java.util.ArrayList;
import java.util.Collection;public class Test1 {public static void main(String[] args) {Collection<String> collection = new ArrayList<>();collection.add("h");collection.add("e");collection.add("l");collection.add("l");collection.add("o");for (String str : collection) {System.out.print(str);}System.out.println();System.out.println(collection.size());collection.clear();System.out.println(collection.size());}
}
?7.Map 接口
Map 常用方法說(shuō)明:
Map 代碼示例:
package test1;import java.util.HashMap;
import java.util.Map;public class Test2 {public static void main(String[] args) {Map<String, String> map = new HashMap<>();System.out.println(map.size());System.out.println(map.isEmpty());System.out.println(map.get("羅貫中"));System.out.println(map.getOrDefault("羅貫中", "空"));System.out.println(map.containsKey("羅貫中"));System.out.println(map.containsKey("曹雪芹"));map.put("羅貫中", "三國(guó)演義");map.put("曹雪芹", "紅樓夢(mèng)");System.out.println(map.size());System.out.println(map.isEmpty());System.out.println(map.get("羅貫中"));System.out.println(map.get("曹雪芹"));System.out.println(map.containsValue("紅樓夢(mèng)"));for (Map.Entry<String, String> entry : map.entrySet()) {System.out.print(entry.getKey() + " ");System.out.print(entry.getValue());System.out.println();}}
}
?
8.實(shí)現(xiàn)類
?
9.還要學(xué)習(xí)的知識(shí)點(diǎn):
- 1. Collection
- 2. List
- 3. ArrayList
- 4. LinkedList
- 5. Stack
- 6. Queue
- 7. PriorityQueue
- 8. Deque
- 9. Set
- 10. HashSet
- 11. TreeSet
- 12. Map
- 13. HashMap
- 14. TreeMap
- 15. Collections