一,概述
java.util.Set接口 extends Collection接口,是一个不包含重复元素的Collection集合。
特点:
1,不允许存储重复元素;
2,没有索引,没有带索引的方法,所以不能使用普通for 循环遍历。
二,HashSet集合
java.util.HashSet集合 implements Set接口。
特点:
1,不允许存储重复元素;
2,没有索引,没有带索引的方法,所以不能使用普通for 循环遍历;
3,是一个无序集合,存储元素和取出元素顺序可能不一致;
4, 底层是一个哈希表结构(查询速度非常快)。
哈希值:是一个十进制整数,由系统随机给出(就是对象的地址值,是一个模拟出来的逻辑地址,不是数据实际存储的地址值)。
在Object类有一个hashCode()方法,,可以获取对象的哈希值。
package day5_03;
public class Person extends Object {
/*
public native int hashCode();
native:该方法调用本地操作系统的方法。
*/
@Override
public int hashCode() {
return 1;
}
}
package day5_03;
public class DemohashCode {
public static void main(String[] args) {
Person p = new Person();
Person p2 = new Person();
int p_addr = p.hashCode();
int p2_addr = p2.hashCode();
System.out.println(p_addr); //1967205423 | 1
System.out.println(p.toString()); //day5_03.Person@75412c2f | day5_03.Person@1
System.out.println(p2_addr); //1967205423
//String类重写了hashCode方法
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.hashCode()); //96354
System.out.println(str2.hashCode()); //96354
System.out.println(str1.hashCode() == str2.hashCode()); //true
System.out.println(str1 == str2); //false
System.out.println("通话".hashCode()); //1179395
System.out.println("重地".hashCode()); //1179395
}
}
三,哈希表数据结构
HashSet集合存储的数据结构:哈希表。
jdk1.8版本之前:哈希表=数组+链表;
jdk1.8版本之后:哈希表=数组+链表/红黑树(提高查询效率);
数组结构:把元素进行分组(相同哈希值元素分为一组);
链表/红黑树结构:把相同哈希值元素连接到一起。
四,LinkedHashSet集合
java.util.LinkedHashSet集合 extends HashSet集合。
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+ 链表:多了一条链表(记录元素存储顺序),保证元素有序。