Core Java 簡單談?wù)凥ashSet(推薦)
同學(xué)們在看這個(gè)問題的時(shí)候,我先提出者兩個(gè)問題,然后大家?guī)е鴨栴}看這個(gè)文章會理解的更好。
1、HashSet為什么添加元素時(shí)不能添加重復(fù)元素?
2、HashSet是否添加null元素?
打開源碼, 我們看到如下代碼,我們看到HashSet也有一個(gè)HashMap做為屬性,HashSet()的構(gòu)造方法就是將這個(gè)map實(shí)例化。如果大家對HashMap還不了解話,可以看我的這篇博文。還要注意有一個(gè)靜態(tài)final的對象PRESENT,這個(gè)是干什么用的,咱們繼續(xù)往下看。
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
然后我們再打開其add方法,其就是將元素e放到HashMap中,然后將靜態(tài)final對象PRESENT作為value放到里邊,如果添加成功,那么HashMap返回null,然后也就是添加成功了,上一篇博文也講到了,咱們再講一次作為復(fù)習(xí)。如果將element放到HashMap里邊,首先判斷其hashCode,如果hashCode沒有找到,就根據(jù)hashCode計(jì)算index放到對應(yīng)的bucket中,如果hashCode相同的話,那么再根據(jù)key的是否equals作為第二判斷,放到相應(yīng)的linked list里邊了。
/**
* Adds the specified element to this set if it is not already present.
* More formally, adds the specified element <tt>e</tt> to this set if
* this set contains no element <tt>e2</tt> such that
* <tt>(e==null ? e2==null : e.equals(e2))</tt>.
* If this set already contains the element, the call leaves the set
* unchanged and returns <tt>false</tt>.
*
* @param e element to be added to this set
* @return <tt>true</tt> if this set did not already contain the specified
* element
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
當(dāng)然第二個(gè)問題同學(xué)們是否也想到了,因?yàn)閔ashMap是支持key為null的,所以HashSet也是可以添加key為null的元素的。HashMap用的地方這么多,大家知道它很重要了吧?!
以上這篇Core Java 簡單談?wù)凥ashSet(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
RocketMQ實(shí)現(xiàn)消息分發(fā)的步驟
RocketMQ 實(shí)現(xiàn)消息分發(fā)的核心機(jī)制是通過 Topic、Queue 和 Consumer Group 的配合實(shí)現(xiàn)的,下面給大家介紹RocketMQ實(shí)現(xiàn)消息分發(fā)的步驟,感興趣的朋友一起看看吧2024-03-03
Java處理科學(xué)計(jì)數(shù)法數(shù)字方式
這篇文章主要介紹了Java處理科學(xué)計(jì)數(shù)法數(shù)字方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Springcloud-nacos實(shí)現(xiàn)配置和注冊中心的方法
這篇文章主要介紹了Springcloud-nacos實(shí)現(xiàn)配置和注冊中心的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
mybatis自定義類型處理器TypehHandler示例詳解
我們在寫mapper映射器的配置文件時(shí),不經(jīng)意間已經(jīng)用到類型轉(zhuǎn)換,不過是mybatis幫我們完成的,下面這篇文章主要給大家介紹了關(guān)于mybatis自定義類型處理器TypehHandler的相關(guān)資料,需要的朋友可以參考下2018-09-09
java定時(shí)任務(wù)實(shí)現(xiàn)的4種方式小結(jié)
這篇文章主要介紹了java定時(shí)任務(wù)實(shí)現(xiàn)的4種方式小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
spring自定義注解實(shí)現(xiàn)攔截器的實(shí)現(xiàn)方法
本篇文章主要介紹了spring自定義注解實(shí)現(xiàn)攔截器的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08

