Set集合
前面我们学习了Collection 集合有两个子集合List和Set,List集合在前面我们已经介绍过了,接下来让我们看看Set集合以及他的子实现类:
先让我们看看Set集合和List集合的区别:
Set集合:不允许出现重复元素,存储和输出的顺序不一致(无序性),可以使元素为null
List集合:可以出现重复元素,存储和输出的顺序是一致的(有序性)
例如:
package com.SetDome;
import java.util.HashSet;
import java.util.Set;
public class SetDome2 {
public static void main(String[] args) {
//创建一个set集合对象
Set<String> set=new HashSet<String>();
//添加元素给集合对象
set.add("Hello");
set.add("World");
set.add("Hello");
set.add("javaSE");
set.add("javaSE");
//增强for循环
for(String s:set) {
System.out.println(s);
}
}
}
运行结果:
Hello
javaSE
World
由上例可以看出,set集合中的元素如果有重复元素,在输出时就会出现去重的效果,会达到这一效果的原因是Set的子实现类HashSet。
HashSet的存储原理:
当你向其中存储元素的时候,首先会调用该方法底层的HashCode方法将元素中的哈希码值(地址值)算出来,通过这个哈希码值就可以算出元素在哈希表中的位置
1)如果根据哈希码值算出来的位置上没有任何元素,则将该元素放在这个位置上
2)如果算出来的位置上有元素的存在,就要运用equals方法将输入的元素与位置上已经存在的元素进行比较,如果返回的是true,就不理睬它,如果返回的是false,就将该元素添加到哈希表中去
接下来我们再看看向set集合中添加自定义对象时会怎么样?
先创建一个自定义学生类:
package com.SetDome;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
再来创建一个测试类进行测试
package com.SetDome;
import java.util.HashSet;
import java.util.Set;
public class SetDome {
public static void main(String[] args) {
//创建一个set集合对象
Set<Student> set=new HashSet<Student>();
Student s1=new Student("迪丽热巴",25);
Student s2=new Student("赵星星",24);
Student s3=new Student("吴宣仪",23);
Student s4=new Student("迪丽热巴",25);
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
for(Student str: set) {
System.out.println(str.getName()+"---"+str.getAge());
}
}
}
运行结果:
赵星星---24
吴宣仪---23
迪丽热巴---25
大家可以看到上面的学生类里面我多写了HashCode方法和equals方法,因为是自定义类,系统不会在底层帮你重写这些方法,只能我们自己手动去重写,不然的话就达不到去重的效果