set接口实现类的对比
/*
1.Set接口的框架:
|---Collection接口:单列集合,用来存储一个一个的对象
|---List接口:存储有序的、可重复的数据 --->"动态“数组
|---ArrayList、LinkedLis、Vector
|---Set接口:存储无序的、不可重复的数据 --->高中讲的"集合"
|---HashSet:作为Set接口的主要实现类;线程不安全,可以存储null值
|---LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的
的顺序遍历
|---TreeSet:可以按照添加对象的指定属性,进行排序
*/
Set的无序性与不可重复性的理解
public class SetTest {
/*
Set:存储无序的、不可重复的数据
以HashSet为例说明
1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的
哈希值决定的
2.不可重复性:保证添加的元素按照equals()判断时,不能返回true.即相同的元素只能添加一个
*/
@Test
public void test1(){
Set set = new HashSet();
set.add(456);
set.add(123);
set.add(123);
set.add("AA");
set.add("CC");
set.add(new User("Tom",12));
set.add(new User("Tom",12));
set.add(129);
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//重写完equals和hashCode后 遍历不会显示两个Tom
}
}
User类
public class User {
private String name;
private int age;
public User() {
}
public User(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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
System.out.println("User equals()...");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}