Java集合框架复习之规则集Set-HashSet(三)

Set接口扩展了Collection接口,只是规定Set的实例不包含重复的元素(这个可以好好利用一下,做某些事情很方便)


由于它会判断添加的元素是否存在于集合中,用到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 set=new HashSet();
		set.add("a");
		set.add("b");
		set.add("c");
		set.add("d");
		System.out.println(set);//注意直接输出set的形式
		Iterator 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时,输出跟插入顺序一样。

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 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 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中的方法都可以用在规则集上


你可能感兴趣的:(Java,Java,Collection,hashCode,equals,HashSet)