HashSet

1.Set集合:特点:1.没有下标,不能存重复值,怎么进的不一定怎么出;因为没有下标只能通过增强for和迭代器进行取值,
普通的数组不能用迭代器取值,因为没迭代器对象所以不能调迭代器方法;因为set的集合是怎么进的不一定怎么出,所以取值时顺序肯定不一样
2.HashSet是数组和链表结合的结构;默认的数组长度是16; 加载因子:就是在达到加载因子的数值时会提前开辟一个新的长度为16的数组
数组存的是地址,桶里存的是元素
3.public static void main(String[] args){
int s1="abc".hashcode();//计算哈希值的方法 .hashcode()
int s2="abc".hashcode();当我们向HashSet存值的时候,add方法会先去调用存储类型的类中的Hashcode方法计算该元素的哈希值;
int s3="bcd".hashcode();计算完元素的哈希值会到数组中查找有没有有该元素一样的哈希值,如果没有就直接将该元素存入集合中
System.out.println(s1);//数组里面存哈希值,链表存元素值,数组里面的哈希值可以看做就是地址
System.out.println(s2);
System.out.println(s3);
//1.计算元素哈希值;2.到容器中找是否有改元素的哈希值;如果哈希值相同则调用该元素的equals()方法比较俩元素内容是否一样
//如果equals()方法比较后内容不一样(哈希值一样,内容不一样)就会存进去(挂在已存元素的链表下面),如果哈希值一样内容也一样则不存
Set<Person> set=new HashSet<Person>();
set.add(new Person("a",10));//因为没有重写equals()方法和hashcode()方法所以没法比较出来
set.add(new Person("b",9));//不重写hashcode()方法会根据地址来比较;也就是继承父类的hashcode()是比较地址
set.add(new Person("c",8)); //如果Set或者HashCode存自定义元素需要重写hashcode和equals方法才行
//给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
//遍历
for(Person p:set){
System.out.println(p);
}
5.public static void main(String[] args) {//唯一不一样;怎么存就怎么取;(没有下标,不能存重复元素,怎么存怎么取)
LinkedHashSet<String> set=new LinkedHashSet<String>();
set.add("abc");//add调用了.hashcode()和.equals()方法
set.add("bcd");
//遍历
for(String s:set){
System.out.println(s);
}
}

原文地址:https://www.cnblogs.com/hankai2735/p/11331864.html