Java中HashSet的解讀
來源:易賢網(wǎng) 閱讀:1991 次 日期:2015-04-10 14:39:23
溫馨提示:易賢網(wǎng)小編為您整理了“Java中HashSet的解讀”,方便廣大網(wǎng)友查閱!

一. HashSet源代碼

HashSet 的實(shí)現(xiàn)

對于 HashSet 而言,它是基于 HashMap 實(shí)現(xiàn)的,HashSet 底層采用 HashMap 來保存所有元素,因此 HashSet 的實(shí)現(xiàn)比較簡單,查看 HashSet 的源代碼,可以看到如下代碼: Java代碼

public class HashSet<E> extends AbstractSet<E>

implements Set<E>, Cloneable, java.io.Serializable {

// 使用 HashMap 的 key 保存 HashSet 中所有元素 private transient HashMap<E,Object> map;

// 定義一個(gè)虛擬的 Object 對象作為 HashMap 的 value private static final Object PRESENT = new Object(); ...

// 初始化 HashSet,底層會初始化一個(gè) HashMap public HashSet() {

map = new HashMap<E,Object>(); }

// 以指定的 initialCapacity、loadFactor 創(chuàng)建 HashSet // 其實(shí)就是以相應(yīng)的參數(shù)創(chuàng)建 HashMap

public HashSet(int initialCapacity, float loadFactor) {

map = new HashMap<E,Object>(initialCapacity, loadFactor); }

public HashSet(int initialCapacity) {

map = new HashMap<E,Object>(initialCapacity); }

HashSet(int initialCapacity, float loadFactor, boolean dummy) {

map = new LinkedHashMap<E,Object>(initialCapacity , loadFactor); }

// 調(diào)用 map 的 keySet 來返回所有的 key public Iterator<E> iterator()

{

return map.keySet().iterator(); }

// 調(diào)用 HashMap 的 size() 方法返回 Entry 的數(shù)量,就得到該 Set 里元素的個(gè)數(shù)

public int size() {

return map.size(); }

// 調(diào)用 HashMap 的 isEmpty() 判斷該 HashSet 是否為空, // 當(dāng) HashMap 為空時(shí),對應(yīng)的 HashSet 也為空 public boolean isEmpty() {

return map.isEmpty(); }

// 調(diào)用 HashMap 的 containsKey 判斷是否包含指定 key // HashSet 的所有元素就是通過 HashMap 的 key 來保存的 public boolean contains(Object o) {

return map.containsKey(o); }

// 將指定元素放入 HashSet 中,也就是將該元素作為 key 放入 HashMap public boolean add(E e) {

return map.put(e, PRESENT) == null; }

// 調(diào)用 HashMap 的 remove 方法刪除指定 Entry,也就刪除了 HashSet 中對應(yīng)的元素

public boolean remove(Object o) {

return map.remove(o)==PRESENT; }

// 調(diào)用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素

public void clear() {

map.clear(); } ... }

由上面源程序可以看出,HashSet 的實(shí)現(xiàn)其實(shí)只是封裝了一個(gè) HashMap 對象來存儲所有的集合元素,所有放入 HashSet 中的集合元素實(shí)際上由 HashMap 的 key 來保存,而 HashMap 的 value 則存儲了一個(gè) PRESENT,它是一個(gè)靜態(tài)的 Object 對象。

HashSet 的絕大部分方法都是通過調(diào)用 HashMap 的方法來實(shí)現(xiàn)的,因此 HashSet 和 HashMap 兩個(gè)集合在實(shí)現(xiàn)本質(zhì)上是相同的。

二.HashSet<E>對象

HashSet<E>創(chuàng)建的對象稱為集合:

HashSet<string> s= HashSet<string>;

那么s就是一個(gè)可以存儲 string 類型數(shù)據(jù)的集合,s 可以調(diào)用add(String s)方法將string類型的數(shù)據(jù)添加到集合中。添加到集合中的數(shù)據(jù)稱為集合的元素。集合不允許有相同的元素,也就是說,如果b已經(jīng)是集合中的元素,那么在執(zhí)行set.add(b)操作是無效的。 三.HashSet<E>中的方法詳解

① public boolean add(E o) —— 向集合添加參數(shù)指定的元素。(如果此集合中還

不包含指定元素,則添加指定元素。)

參數(shù):

o - 將添加到此集合中的元素。 返回:

如果該集合還不包含指定元素,則返回 true。

② public void clear() ——清空集合,使集合不含有任何元素。

③ public boolean contains(Object o) —— 判斷參數(shù)指定的數(shù)據(jù)是否屬于集合。()

參數(shù):

o - 其在此集合中的存在已得到測試的元素。

返回:

如果此集合不包含指定元素,則返回 true。

④ public boolean isEmpty()—— 判斷集合是否為空。

返回:

如果此集合不包含任何元素,則返回 true。

⑤ public boolean remove(Object o) ——集合刪除參數(shù)指定的元素。

參數(shù):

o - 如果存在于此集合中則需要將其移除的對象。

返回:

如果集合包含指定元素,則返回 true。

⑥ public int size () —— 返回集合中元素的個(gè)數(shù)。

返回:

此集合中的元素的數(shù)量(集合的容量)。

⑦ Object [ ] toArray() —— 將集合元素存放到數(shù)組中,并返回這個(gè)數(shù)組。

⑧ boolean containsAll (HashSet set) —— 判斷當(dāng)前集合是否包含參數(shù)指定的集合。

⑨ public Object clone () —— 得到當(dāng)前集合的一個(gè)克隆對象,該對象中元素的改

變不會影響到當(dāng)前集合中的元素,反之亦然。 返回:

此集合的淺表復(fù)制。

三.代碼:

import java.util.HashSet;

class Student{ String name; int score;

Student(String name, int score){ this.name = name; this.score = score; } }

public class TestHashSet{

public static void main(String[] args) {

Student zh = new Student("張三",77); Student li = new Student("李四",68); Student wa = new Student("王五",67);

HashSet<Student> set = new HashSet<Student>(); HashSet<Student> subset = new HashSet<Student>();

System.out.println("Before add(zh):"+set.add(zh)); set.add(zh);

System.out.println("After add(zh):"+set.add(zh)); //add方法的實(shí)現(xiàn) set.add(wa); set.add(li);

subset.add(wa); subset.add(li);

System.out.println("Is subset empty? "+subset.isEmpty()); //isempty方法的實(shí)現(xiàn)

if (set.contains(wa)){

System.out.println("集合set中含有:"+wa.name); //contains方法的實(shí)現(xiàn) }

if(set.containsAll(subset)){

System.out.println("集合set包含集合subset"); }

int number = subset.size(); //size方法的實(shí)現(xiàn) System.out.println("集合subset中有"+number+"個(gè)元素:");

Object s[] = subset.toArray(); //toArray 方法的實(shí)現(xiàn)

for(int i=0; i<s.length; i++){

System.out.printf("姓名:%s,分?jǐn)?shù):%d ", ((Student)s[i]).name,((Student)s[i]).score); }

subset.remove(wa); //remove方法的實(shí)現(xiàn) System.out.println("After implement remove on subset");

System.out.println("集合subset中有"+subset.size()+"個(gè)元素:");

Object a[] = subset.toArray();

for(int i=0; i<a.length; i++){

System.out.printf("姓名:%s,分?jǐn)?shù):%d ", ((Student)a[i]).name,((Student)a[i]).score); } } }

四.運(yùn)行結(jié)果

Before add(zh):true After add(zh):false Is subset empty? false 集合set中含有:王五 集合set包含集合subset 集合subset中有2個(gè)元素: 姓名:李四,分?jǐn)?shù):68 姓名:王五,分?jǐn)?shù):67

After implement remove on subset 集合subset中有1個(gè)元素: 姓名:李四,分?jǐn)?shù):68

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
上一篇:java獲取ip地址
易賢網(wǎng)手機(jī)網(wǎng)站地址:Java中HashSet的解讀
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)