set集合的遍历:
set集合中元素是无序的。
set集合中元素是不可重复的。
实现:foreach,迭代器
- HashSet
- 非线程安全
- 由HashMap支持
- 不保持插入顺序
- 它存储唯一元素并允许空值 (依据对象的hashcode来确定该元素是否存在
- 性能参数:初始容量,负载因子 (默认值: 初始容量16,负载因子0.75
1.如何去重
private Listlist = new ArrayList<>(); @BeforeAll public void setup() { set.add(1); set.add(1); set.add(2); set.add(2); set.add(3); set.add(3); } @Test public void test01() { List tmp = new ArrayList<>(new HashSet (list)); System.out.println(tmp); }
- foreach遍历,迭代器
private Setset=new HashSet<>(); @Before public void setup() { set.add(1); set.add(2); set.add(2); set.add(3); set.add(4); set.add(5); set.add(6); set.add(7); } @Test public void test02() { for (Integer e : set) { System.out.println(e); } } @Test public void test03() { Iterator it = set.iterator(); while(it.hasNext()) { System.out.println(it.next()); } }
- TreeSet
- TreeSet是基于TreeMap实现的
- 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
- 是一个包含有序的且没有重复元素的集合
创建一个实体类,实现排序接口
public class Student implements Comparable{ private Integer sid; private String sname; private int age; public Student(Integer sid, String sname, int age) { super(); this.sid = sid; this.sname = sname; this.age = age; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
实现hashCode和equals方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((sid == null) ? 0 : sid.hashCode());
result = prime * result + ((sname == null) ? 0 : sname.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 (sid == null) {
if (other.sid != null)
return false;
} else if (!sid.equals(other.sid))
return false;
if (sname == null) {
if (other.sname != null)
return false;
} else if (!sname.equals(other.sname))
return false;
return true;//学号名字年龄都相等才是同一个学生
}
@Override
public String toString() {
return "Student [s + sid + ", sname=" + sname + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
if(this.getAge()-o.getAge()==0) {
return this.getSid()-o.getSid();
}
return this.getAge() - o.getAge();
}
再使用ThreeSet
@Test
public void test04() {
TreeSet stu = new TreeSet<>();
stu.add(new Student(1,"zs", 18));
stu.add(new Student(1,"zs", 18));
stu.add(new Student(2,"ls", 19));
stu.add(new Student(4,"lihao", 10));
stu.add(new Student(7,"lihao", 18));
stu.add(new Student(5,"zengfanyan", 20));
stu.add(new Student(3,"we", 30));
for(Student s: stu) {
System.out.println(s);
}
} 


