特点:
元素不重复
无索引
HashSet实现类
特点:
无序列表
多线程实现
底层为哈希表(HashMap)
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetTest {
public static void main(String[] args) {
Set<Integer> set=new HashSet<>();
set.add(1);
set.add(2);
set.add(12);
Iterator<Integer> ite=set.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
哈希值
获取哈希值:
Object类:public native int hashCode();
String类(重写了Object的hashCode方法):public int hashCode();
HashSet集合存取数据的结构(哈希表)
jdk1.8之前:
数组+链表
jdk1.8之后:
数组+链表
数组+红黑树
希表将元素分组(同一哈希值的元素为一组),每一组的元素如果超过8个则用数组+红黑树的存储模式
HashSet存储自定义类型元素
在HashSet中存储自定义类型元素时,需要重写对象中的hashCode()和equals()方法。建立自己的比较方式才能保证HashSet集合中对象的唯一
HashSet存储自定义类型元素
Set元素集合报错元素唯一:
存储的元素(Integer,String,…,Student,Person,…),必须重写hashCode和equals方法
案例:要求同名同龄视为一人
Person类
package study001.hash;
import java.util.Objects;
public class Person {
private String name;
private int age;
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 void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Test
import study001.hash.Person;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetTest {
public static void main(String[] args) {
HashSet<Person> set=new HashSet<>();
Person p1=new Person("aha",18);
Person p2=new Person("aha",18);
Person p3=new Person("eye",18);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p1.equals(p2));
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p3);
}
}
可变参数
jdk1.5
使用注意事项:
- 一个方法的参数列表只能有一个可变参数
- 如果参数有多个,可变参数需要写在参数列表末尾
public static void main(String[] args) {
System.out.println(sum(1,1,2,3,4,5,32,2,45,6,5,43,3,45,5,4,32,2));
}
public static int sum(int ... arr){
int s=0;
for(int i=0;i<arr.length;i++){
s+=i;
}
return s;
}