1、Set接口
java.util.Set接口 extends Collection接口
Set接口特点:
1、不允许存储重复的元素
2、没有索引,没有带索引的方法,也不能使用普通的for循环遍历
2、HashSet集合
java.util.HashSet集合 implements Set接口
HashSet特点:
1、不允许存储重复的元素
2、没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3、是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
4、底层是一个哈希表结构(查询的速度非常的快)
3、哈希值(HashCode)
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是数据实际存储的物理地址)在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
hashCode方法源码:
public native int hashCode();
native代表该方法调用的是本地操作系统的方法
4、哈希表
HashSet集合存储数据的结构(哈希表)
jdk1.8版本之前:哈希表 = 数组 + 链表
jdk1.8版本之后: 哈希表 = 数组 + 链表;哈希表 = 数组 + 红黑树(提高查询的速度)
哈希表特点:速度快
两个元素不同,但是哈希值相同,被称作哈希冲突。
5、HashSet存储自定义类型元素
要求:同名同年龄的人只能存储一次
定义类:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
实现类:
public class Demo04HashSetSavePerson {
public static void main(String[] args) {
//创建HashSet集合存储Person
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("王雷",26);
Person p2 = new Person("王雷",26);
Person p3 = new Person("王雷",19);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set);
//[Person{name='王雷', age=26}, Person{name='王雷', age=19}]
}
}
6、LinkedHashSet集合
java.util.linkedHashSet集合 extends HashSet集合
特点:
底层是一个哈希表(数组 + 链表/红黑树)+ 链表:多了一条链表(记录元素的存储顺序),保证元素有序。
举例:
public class Demo04LinkedHashSet {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("www");
set.add("abc");
set.add("abc");
set.add("illness");
System.out.println(set); //[abc, www, illness] 无序,不允许重复
LinkedHashSet<String> set2 = new LinkedHashSet<>();
set2.add("www");
set2.add("abc");
set2.add("abc");
set2.add("illness");
System.out.println(set2); //[www, abc, illness] 有序,不允许重复
}
}