1.Set集合
1.1 特点
1.无序的。
2.不可以存储重复元素。
3.不可以通过索引访问元素。
1.2 HashSet
存储字符串
因为字符串对象重写了hashcode和equals方法,所以可以判断出元素是否重复。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("令狐冲");
set.add("风清扬");
set.add("田伯光");
set.add("田伯光");//不可以存储重复元素
System.out.println(set);//[令狐冲, 田伯光, 风清扬] 无序的
//迭代器遍历
Iterator<String> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
System.out.println("==================");
//增强for
for (String s : set) {
System.out.println(s);
}
}
}
存储自定义对象
HashSet存储对象时是根据对象的hashcode和equals方法来判断元素是否重复的。
学生类
package com.mnyketang.setdemo;
import java.util.Objects;
public class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
测试类
package com.mnyketang.setdemo;
import java.util.HashSet;
import java.util.Iterator;
/*
HashSet
存储字符串
存储自定义对象
*/
public class Demo01 {
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
hashSet.add("岳不群");
hashSet.add("令狐冲");
hashSet.add("田伯光");
hashSet.add("风清扬");
hashSet.add("风清扬");//不可以存放重复元素
//无序的
System.out.println(hashSet);//[令狐冲, 田伯光, 风清扬, 岳不群]
//遍历 迭代器遍历
Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//增强for
for (String s : hashSet) {
System.out.println(s);
}
//存储自定义对象 HashSet存储对象时是根据对象的hashcode和equals方法来判断元素是否重复的。
HashSet<Student> hashSet1 = new HashSet<>();
hashSet1.add(new Student("ls",20));
hashSet1.add(new Student("zs",18));
hashSet1.add(new Student("ww",21));
hashSet1.add(new Student("ww",21));
System.out.println(hashSet1);
}
}
HasdSet集合底层是采用哈希表来 存储元素的。
1.3 哈希表
哈希值
概念:是JDK根据对象的地址或者属性算出来的int类型的数值
如何计算:Object类中的public int hashCode():返回对象的哈希码值。
特点:
如果没有重写hashCode方法,那么根据对象地址值进行计算哈希值。所以同一个对象多次调用hashCode方法
返回的哈希值是相同的。
不同对象的哈希值不一样。
如果重写了hashCode方法,通常是根据对象的属性值计算哈希值。如果不同的对象属性值一样,哈希值也一样。
示例代码
package com.mnyketang.setdemo;
/*
哈希值
概念:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
如何计算:Object类中的public int hashCode():返回对象的哈希码值。
特点:
如果没有重写hashCode方法,那么根据对象地址值进行计算哈希值。
所以同一个对象多次调用hashCode方法返回的哈希值是相同的。不同对象的哈希值不一样。
如果重写了hashCode方法,通常是根据对象的属性值计算哈希值。如果不同的对象属性值一样,哈希值也一样。
*/
public class Demo02 {
public static void main(String[] args) {
//如果没有重写hashCode方法,那么根据对象地址值进行计算哈希值。
// 所以同一个对象多次调用hashCode方法返回的哈希值是相同的。不同对象的哈希值不一样。
Cat cat = new Cat();
System.out.println(cat.hashCode());//961
System.out.println(cat.hashCode());//961
// 如果重写了hashCode方法,通常是根据对象的属性值计算哈希值。如果不同的对象属性值一样,哈希值也一样。
Cat cat1 = new Cat("小花",5);
Cat cat2 = new Cat("小花",5);
System.out.println(cat1.hashCode());//23686020
System.out.println(cat2.hashCode());//23686020
}
}
哈希表
jdk1.8以前:数组+链表,jdk1.8以后:数组+链表+红黑树