HashSet集合详解

/*
set集合:HashSet

1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构

2.哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表
每个单向链表都有一个独一无二的hash值,代表数组的下标,在每个单向链表所有节点
的hash值都是一样的,hash值实际上是Key调用hashCode方法,再通过哈希算法转换成的值

3.如何向哈希表中添加元素
先调用被存储的Key的hashCode方法,经过哈希算法得出哈希值,如果在这个哈希表中
不存在这个值,则直接加入元素,如果该hash值已经存在,继续调用Key之间的equals方法
如果返回true,则放弃添加该元素,如果返回false,则将该元素添加

4.HashSet其实是HashMap中的Key部分,HashSet有什么特点,HashMap中的Key应该具有相同的特点

5.HashSet和HashMap初始化容量都是16,默认加载因子是0.75
即数组容量使用超过百分之七十五,就会扩容
*/
import java.util.*;
public class fuck8{

public static void main(String[] args){

Set s=new HashSet();

s.add(1);
s.add(1);

s.add(13);
s.add(19);

Iterator it=s.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}


}


/*
关于往Set集合中存储的元素,该元素的hashCode和equals方法
HashMap中有一个put方法,put(Key,value),Key是无序不可重复的

结论:存储在HashMap集合或者HashSet集合Key部分的元素
需要同时重写hashcode和equals方法
*/
import java.util.*;
public class fuck9{

public static void main(String[] args){

//创建集合
Set s=new HashSet();

//e1,e5相同的情况下却还是添加进去了,不应该这样
//需要重写HashCode方法,他俩的哈希值应该一样
employee e1=new employee("1002","jack");
employee e5=new employee("1002","jack");


employee e2=new employee("5003","king");
employee e3=new employee("4995","tom");
employee e4=new employee("2778","lisa");

s.add(e1);
s.add(e2);
s.add(e3);
s.add(e4);
s.add(e5);

System.out.println(s.size());//4
}

}


//根据现实业务逻辑,该公司员工编号是1000~9999
class employee{

//field
String no;
String name;

//constructor
employee(String no,String name){
this.no=no;
this.name=name;
}

//重写equals方法
//如果员工编号和姓名相同,则是同一个对象
public boolean equals(Object o){
if(this==o) return true;
if(o instanceof employee){
employee e=(employee) o;
if(e.no.equals(this.no)&&e.name.equals(this.name)){
return true;
}
}
return false;
}

//重写hashCode方法
public int hashCode(){

//String提供的以员工编号分组的重写的hashCode方法
return no.hashCode();
}
}

猜你喜欢

转载自blog.csdn.net/rolic_/article/details/80306569
今日推荐