Java之EnumSet原始碼分析

2021-08-29 05:29:24 字數 1522 閱讀 3855

1.定義:

2.與其他集合類區別:

3.enumset作為集合類基本操作方法實現原理(位運算):

說明

3.1 add方法

public boolean add(e e)
ordinal()為每個列舉項的序號,從0開始,按宣告順序排列,如[red,blue,yellow,black]對應[0,1,2,3]1l << ((enum<?>)e).ordinal()(為了方便,這裡稱之為列舉值)則表示1*2^(e.ordinal()),color.red的ordianl()0,對應列舉值1*2^0=1,其實就是第ordinal()+1位(從右往左數,個位為第1位)為1其它位為0的十進位制數,對應十進位制數為00000001(這裡假設是8bit,實際是long型32bit);

則每個列舉項表示如下:

列舉項序號

1l << ((enum<?>)e).ordinal()列舉值

color.red

0000000011

color.blue

1000000102

color.yellow

2000001004

color.black

3000010008

elements |=就是對新增的不同元素的列舉值進行求和,相同元素相或保持不變

3.2 remove方法

public boolean remove(object e)
按照之前的列舉值相加的想法,remove就是從總列舉值中減去待刪除元素的列舉值,因為是位運算,沒有直接相減,使用位操作elements &= ~(1l << ((enum<?>)e).ordinal());

完成相減操作

3.3 contains方法

public boolean contains(object e)
contains方法就更好理解,每個列舉項的列舉值的值都不一樣,且相互之間進行相與操作為,使用總列舉值要查詢的列舉項的列舉值進行相與操作,如果為,說明不存在該列舉項,否則存在

Java原始碼分析之ArrayList

自我學習原始碼,也借鑑了網上其他的資料,有寫的不準確的地方,請輕噴,謝謝 1 繼承自abstractlist類 2 實現了randomaccess介面,randomaccess介面是list 實現所使用的標記介面,用來表明其支援快速 通常是固 定時間 隨機訪問。此介面的主要目的是允許一般的演算法更改...

Java原始碼閱讀之Vector

vector與arraylist區別 protected object elementdata protected int elementcount protected int capacityincrement private static final int max array size int...

Java集合之LinkedList原始碼解析

linkedlist 非執行緒安全的可重複元素順序列表 繼承abstractsequentiallist 其父類為abstractlist 骨架實現,該類要求子類必須重寫listiterator int index 方法 abstract list已提供骨架實現 實現了cloneable,實現淺轉殖...