Java集合框架複習之規則集Set-HashSet(三)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Set接口擴展了Collection接口,只是規定Set的實例不包含重複的元素(這個可以好好利用一下,做某些事情很方便)</span>


由於它會判斷添加的元素是否存在於集合中,用到equals方法,而是否相同取決於我們對具體類的定義,比如一個類,人,假如只要名字相同就是同一個人的話,我們就需要重寫equals方法,而一般重寫equals就需要重寫hashCode方法,爲了維持協定:

      

        如果x.equals(y)返回“true”,那麼x和y的hashCode()必須相等。
        如果x.equals(y)返回“false”,那麼x和y的hashCode()有可能相等,也有可能不等


規則集Set

1.散列集HashSet

可以用它的無參構造方法創建空的散列集,也可以由一個現有的集合創建散列集

注意,它的構造方法中可以指定初始容量與客座率,一般默認初始容量爲16,客座率爲0.75,也就是說默認可以存儲的元素個數爲16*0.75=12個,當元素個數打到12個時,容量就會翻倍,也就是32。

       對於客座率,較高的客座率會降低空間開銷(容量未發生變化前能存更多的元素),但是會增加查找時間,0.75只是時間開銷和空間開銷上一個很好的權衡點。


     散列集中的元素是沒有特定的順序的,如果要加上一個順序,可以使用LinkedHashSet

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class MyDemo {
	public static void main(String[] args){
		Set<String> set=new HashSet<String>();
		set.add("a");
		set.add("b");
		set.add("c");
		set.add("d");
		System.out.println(set);//注意直接輸出set的形式
<span style="white-space:pre">		</span>Iterator<String> iterator=set.iterator();
		while(iterator.hasNext()){
			System.out.print(iterator.next()+" ");
		}
	}
}
輸出結果:

[a, b, c, d]
a b c d 


特別注意以下這個結果,我們知道HashSet中的元素是沒有特定順序的,也就是不一定按你插入的順序輸出。但是上面的輸出結果卻是按照插入的順序輸出的,無論運行多少遍都是同樣的結果。


這個要說一下無序不代表隨機,元素在集合中的位置是由它的哈希碼決定的,Integer類中的hashCode方法返回它的int值,String類的hashCode方法中有一個哈希碼計算式子,也就是說每個固定的字符串擁有自己固定的哈希碼,當幾個特定的字符串添加到一個集合中,無論添加的順序是怎樣的,只要這幾個特定的字符串不變,輸出結果是一定的,比如上面的代碼中,如果更改a,b,c,d的插入順序 ,輸出結果不會發生變化,還是a b c d



再舉個極端例子,如果你自定義一個類,並且重寫了equals方法和hashCode方法,而且hashCode方法返回某個固定值,

那麼當你將幾個這個自定義類的對象插入HashSet時,輸出跟插入順序一樣。

<pre name="code" class="java">import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class MyDemo {
	public static void main(String[] args) {
		Set<MyInteger> set = new HashSet();
		set.add(new MyInteger(1));
		set.add(new MyInteger(4));
		set.add(new MyInteger(3));
		set.add(new MyInteger(2));

		System.out.println(set);
		Iterator<MyInteger> iterator = set.iterator();
		while (iterator.hasNext()) {
			System.out.print(iterator.next() + " ");
		}
	}
}

class MyInteger {
	private Integer mInt;

	public MyInteger(int i) {
		mInt = i;
	}

	public int hashCode() {
		return 1;
	}

	public int value() {
		return mInt;
	}

	public boolean equals(Object obj) {
		if (!(obj instanceof MyInteger))
			return false;
		return mInt.equals(((MyInteger) obj).value());
	}

	public String toString() {
		return mInt.toString();
	}
}



輸出結果:

[1,4,3,2]

1 4 3 2


Set 是Collection的一個實例,所以定義在Collection中的方法都可以用在規則集上


發佈了8 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章