国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java中 判斷集合中的元素相等的依據(jù) 詳細(xì)解析

2019-11-11 06:46:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們經(jīng)常使用的集合如ArrayList,LinkedList,Vector, **你在調(diào)用contains()方法的時(shí)候, 或者是你在根據(jù)對(duì)象移除元素 remove(Object o) 你知道他們是如何判斷集合中的元素是否 是相等的嗎**? 接下來(lái)我們跟著源碼去詳細(xì)探究一下 數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)不同判斷的依據(jù)就不同,我們先來(lái)看一下List類的判斷依據(jù).

先簡(jiǎn)單的了解一下 List類 : 有序,可以有重復(fù)元素。

ArrayList 底層是一個(gè)對(duì)象數(shù)組 PRivate transient Object[] elementData; LinkedList 屬于鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu),底層用的是一個(gè)Node類的節(jié)點(diǎn),包括指針域和數(shù)據(jù)域.

private static class Node { E item; Node next; Node prev;

Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; }}

ArrayList LinkedList他們都是線程不同步的 Vector非常類似ArrayList,但是Vector是同步的。, ArrayList LinkedList多線程訪問會(huì)拋出 ConcurrentModificationException。如果想使他們線程同步的可以使用 Collections.synchronizedList 方法將該集合“包裝”起來(lái)

回歸正題

我們想知道他們?nèi)绾闻袛嗉显厥欠裣嗟?我們應(yīng)該想到的是contains(Object o)方法,接下來(lái)我們看一下contains(Object o)方法

public boolean contains(Object o) { return indexOf(o) >= 0; }

他的方法內(nèi)部調(diào)用了indexOf(o)這個(gè)方法,我們繼續(xù)追蹤看一下indexOf(o)方法

public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; }

看到這里我們應(yīng)該能明白了 先判斷要查找的元素是否為空,不為空的話就調(diào)用equals方法.由此我們得到一個(gè)結(jié)論 List類中判斷元素是否相等依賴的是equals方法.

set類 : 無(wú)序,不允許重復(fù)

HashSet : 此實(shí)現(xiàn)不是同步的 我們知道HashSet它不允許出現(xiàn)重復(fù)元素,他是如何保證元素唯一的呢,我們應(yīng)該首先想到的是看他的add()方法 如下

public boolean add(E e) { return map.put(e, PRESENT)==null; } 這里出現(xiàn)了一個(gè)map我們找找看看他是什么

我們?cè)谏厦婵吹搅怂亩x

private transient HashMap<E,Object> map;

現(xiàn)在我們知道了HashSet的內(nèi)部其實(shí)是一個(gè)HashMap來(lái)維護(hù)的,眾所周知HashMap的鍵是不允許有相同的,不用說(shuō)HashMap的鍵就是HashSet的值,接下來(lái)我們只需要知道HashMap的鍵是如何保證唯一的就行了

我們就要追蹤HashMap的添加元素方法 put(K key, V value)

public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordaccess(this); return oldValue; } }

雖然有點(diǎn)麻煩我們只需要仔細(xì)看看 一定可以看明白 抓住最重要的一句

e.hash == hash && ((k = e.key) == key || key.equals(k))

現(xiàn)在我們也知道了HashSet 和HaspMap 保證元素唯一的辦法是 先比較兩個(gè)元素的哈希值,如果哈希值相等,在比較元素的地址是否相同,或者調(diào)用兩個(gè)元素的equals方法如果哈希值不同,就根本不用在比較了.


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜宾县| 湖南省| 肇源县| 原平市| 新化县| 贵溪市| 沙田区| 鄂州市| 和政县| 凤城市| 清流县| 德阳市| 漳浦县| 昆明市| 安西县| 桑日县| 宁安市| 定西市| 弋阳县| 玉溪市| 海伦市| 吉木乃县| 榆中县| 永丰县| 特克斯县| 喀喇沁旗| 武隆县| 黑山县| 新巴尔虎右旗| 乐昌市| 盐源县| 鄯善县| 文化| 南涧| 神木县| 文登市| 霍城县| 阜阳市| 双峰县| 泗水县| 田林县|