注:刚开始学习java,写文章为了加深印象,同时也希望能对别的初学者有一定帮助,主要内容来源是李刚的《疯狂Java讲义》。
HashSet类 实现了Set接口,若使用Set集合时,一般就使用HashSet类来实现。
HashSet类按Hash算法来实现元素的存储,那什么是Hash算法呢?
Hash算法:http://blog.csdn.net/tanggao1314/
HashSet特点:
1、无序
2、元素可以为 null
import java.util.HashSet;
public class HashSetDemo1
{
public static void main(String[] args)
{
HashSet packet1 = new HashSet();
HashSet packet2 = new HashSet();
packet1.add("Lipstick");
packet1.add("Eyebrow pencil");
packet1.add("books");
packet1.add("food");
packet1.add("BB");
System.out.println("packet1 : "+packet1);
System.out.println("packet2 : "+packet2);
}
}//输出结果为:packet1 :[BB,books,Eyebrow pencil,Lipstick,food]
// packet2 :[]
3、不同步
当向HashSet集合存入某个元素:
1 首先调用该元素的hashCode()方法,得到对应hashCode值
2 根据hashCode值决定存储位置。如果两个元素通过其自身的equals()方法比较为真,但其hashCode值不相等,HashSet会把它们放在不同的位置上。
如果两个元素的hashCode值相等,equals()方法比较为假:由于hashCode值相同,试图将他们放在一个位置上,但是又不行,实际上是在这个位置上用链式结构保存多个对象,访问时也是根据hashCode值来访问,导致性能下降。
即在HashSet集合中两个元素相等的标准是:
1 equals()方法比较相等;2 hashCode值相等。
两者必须相等才为同一个元素。所以重写某个对象(元素)的equals()方法时,也要重写hashCode()方法,以保证与Set集合规则一致: 元素不可重复。
所以重写hashCode()方法的基本规则是:
- 程序运行中,同一个对象多次调用hashCode(),返回值应该一样
- equals()比较为真,hashCode()应返回相同值
- 对象中用作equals()方法比较标准的实例变量,都应该用于计算hashCode值
重写hashCode()步骤:
1、把对象内每个有意义的实例变量(即每个参与equals()比较标准的实例变量)计算出一个int类型的hashCode值,计算方式如下:
2、用第1步计算得到的多个hashCode值组合计算出一个hashCode值返回,且为避免直接想加产生偶然相等,可为每个实例变量的hashCode值乘以一个质数后再想加。