Set是Collection接口下的一个子接口;
Set接口:存储无序的,不可重复的数据,类似我们高中学的集合吧。
Set接口有3个常用的实现类
1。HashSet作为Set接口的主要实现类;线程不安全;可以存放null值。
2.LinkedHashSet:作为HashSet的子类;他在遍历其内部数据时,可以按照添加的顺序来遍历
3.TreeSet:要求添加的必须为同一类的数据;并且可以按照添加对象的指定属性进行排序
细节
1.Set具有无序性,但是无序性不等于随机性,这里的无序性指的是并非按照数组索引添加,而是根据哈希值去添加。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test1 {
public static void main(String[] args){
Set set=new HashSet();
set.add(123);
set.add(345);
set.add("ww");
set.add("AA");
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
运行结果并不是按照我们填入的顺序输出的
2.LInkedHashSet可以按照添加的顺序写
public class Test1 {
public static void main(String[] args){
Set set=new LinkedHashSet();
set.add(123);
set.add(345);
set.add("ww");
set.add("AA");
set.add(new Person("wu",12));
set.add(new Person("wu",12));
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
我们添加的Penson类的信息
注意 :我们必须要添加hashCode()和equals方法 {
}
public Person(String name, int age) {
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 String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
注意添加元素的过程
3.TreeSet必须添加为同一类型的不然会报错
public class Test1 {
public static void main(String[] args){
Set set=new TreeSet();
set.add(123);
set.add(345);
set.add(-32);
set.add(56);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
运行结果:按从小到大的方式排列