綜合複習(一)——集合

集合特點:

1,用於存儲對象的容器。
2,集合的長度是可變的。
3,集合中不可以存儲基本數據類型值。

集合框架:

集合容器因爲內部的數據結構不同,有多種具體容器。
不斷的向上抽取,就形成了集合框架。

集合的框架結構圖

在這裏插入圖片描述

集合之間的區別

在這裏插入圖片描述
List、Set、Map的區別
1.List允許存重複對象,有序的,可以插入多個null元素
2.Set不允許重複對象,無序的,只允許一個null元素
3.Map是鍵值對存儲數據,鍵是唯一的,可以有相同的值

ArrayList、LinkedList、Vector的區別
1.ArrayList非線程安全,非同步的; 動態數組的數據結構(實現了可變的數組),數據增長默認是一半,隨機獲取元素要高於LinkedList
2.LinkedList鏈表的數據結構保存的,增加刪除的效率要高於LikedList
3.Vector線程安全的,同步的;數據增長默認是一倍

HashMap與HashTable的區別
1.HashMap線程非安全,非同步的;允許null key和null value;HashMap初始容量16

2.HashTable線程安全,同步的;不允許null key和null value;Hashtable初始容量11

List:
|–Vector:內部是數組數據結構,是同步的。增刪,查詢都很慢!
|–ArrayList:內部是數組數據結構,是不同步的。替代了Vector。查詢的速度快。
|–LinkedList:內部是鏈表數據結構,是不同步的。增刪元素的速度很快。

Set:元素不可以重複,是無序。
Set接口中的方法和Collection一致。

|–HashSet: 內部數據結構是哈希表 ,是不同步的。
如何保證該集合的元素唯一性呢?
是通過對象的hashCode和equals方法來完成對象唯一性的。
如果對象的hashCode值不同,那麼不用判斷equals方法,就直接存儲到哈希表中。
如果對象的hashCode值相同,那麼要再次判斷對象的equals方法是否爲true。
如果爲true,視爲相同元素,不存。如果爲false,那麼視爲不同元素,就進行存儲。

記住:
如果元素要存儲到HashSet集合中,必須覆蓋hashCode方法和equals方法。
一般情況下,如果定義的類會產生很多對象,比如人,學生,書,通常都需要覆蓋equals,hashCode方法。
建立對象判斷是否相同的依據。
|–TreeSet:可以對Set集合中的元素進行排序。是不同步的。
判斷元素唯一性的方式:就是根據比較方法的返回結果是否是0,是0,就是相同元素,不存。

TreeSet對元素進行排序的方式一:
讓元素自身具備比較功能,元素就需要實現Comparable接口。覆蓋compareTo方法。

如果不要按照對象中具備的自然順序進行排序。如果對象中不具備自然順序。怎麼辦?
可以使用TreeSet集合第二種排序方式二:
讓集合自身具備比較功能,定義一個類實現Comparator接口,覆蓋compare方法。
將該類對象作爲參數傳遞給TreeSet集合的構造函數。

if(this.hashCode()== obj.hashCode() && this.equals(obj))

哈希表確定元素是否相同
1,判斷的是兩個元素的哈希值是否相同。
如果相同,在判斷兩個對象的內容是否相同。

2,判斷哈希值相同,其實判斷的是對象的hashCode的方法。判斷內容相同,用的是equals方法。

HashCode的特性

(1)HashCode的存在主要是用於查找的快捷性,如Hashtable,HashMap等,HashCode經常用於確定對象的存儲地址;

(2)如果兩個對象相同, equals方法一定返回true,並且這兩個對象的HashCode一定相同;

(3)兩個對象的HashCode相同,並不一定表示兩個對象就相同,即equals()不一定爲true,只能夠說明這兩個對象在一個散列存儲結構中。

(4)如果對象的equals方法被重寫,那麼對象的HashCode也儘量重寫。

HashCode作用

Java中的集合有兩類,一類是List,再有一類是Set。前者集合內的元素是有序的,元素可以重複;後者元素無序,但元素不可重複。

equals方法可用於保證元素不重複,但如果每增加一個元素就檢查一次,若集合中現在已經有1000個元素,那麼第1001個元素加入集合時,就要調用1000次equals方法。這顯然會大大降低效率。 於是,Java採用了哈希表的原理。

哈希算法也稱爲散列算法,是將數據依特定算法直接指定到一個地址上。

這樣一來,當集合要添加新的元素時,先調用這個元素的HashCode方法,就一下子能定位到它應該放置的物理位置上。

(1)如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;

(2)如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了;

(3)不相同的話,也就是發生了Hash key相同導致衝突的情況,那麼就在這個Hash key的地方產生一個鏈表,將所有產生相同HashCode的對象放到這個單鏈表上去,串在一起(很少出現)。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。

如何理解HashCode的作用:

從Object角度看,JVM每new一個Object,它都會將這個Object丟到一個Hash表中去,這樣的話,下次做Object的比較或者取這個對象的時候(讀取過程),它會根據對象的HashCode再從Hash表中取這個對象。這樣做的目的是提高取對象的效率。若HashCode相同再去調用equal。

HashCode實踐

HashCode是用於查找使用的,而equals是用於比較兩個對象是否相等的。

(1)例如內存中有這樣的位置 :

0 1 2 3 4 5 6 7
而我有個類,這個類有個字段叫ID,我要把這個類存放在以上8個位置之一,如果不用HashCode而任意存放,那麼當查找時就需要到這八個位置裏挨個去找,或者用二分法一類的算法。
但以上問題如果用HashCode就會使效率提高很多。 定義我們的HashCode爲ID%8,比如我們的ID爲9,9除8的餘數爲1,那麼我們就把該類存在1這個位置,如果ID是13,求得的餘數是5,那麼我們就把該類放在5這個位置。依此類推。

(2)但是如果兩個類有相同的HashCode,例如9除以8和17除以8的餘數都是1,也就是說,我們先通過 HashCode來判斷兩個類是否存放某個桶裏,但這個桶裏可能有很多類,那麼我們就需要再通過equals在這個桶裏找到我們要的類

如果還有哪裏不足,請評論補充謝謝!!

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