一:Set
Set集合概述及特点: 无序(存储和取出的顺序)和唯一.
package org.westos.demo;
import java.util.HashSet;
public class SetDemo2 {
public static void main(String[] args) {
//Set集合的特点:元素无序,且唯一
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(100);
hashSet.add(20);
hashSet.add(30);
hashSet.add(5);
hashSet.add(60);
hashSet.add(20);
hashSet.add(30);
hashSet.add(20);
hashSet.add(30);
//遍历
for(Integer num:hashSet){
System.out.println(num);
}
}
}
二:HashSet
HashSet概述和特点:
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。线程不安全,效率高,允许存储null元 素,元素无序(元素的存取顺序不一致)且唯一
HashSet保证元素唯一性:
HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。
set集合中存储元素的时候,他默认比较的时地址值,如果地址值不一样,就会存到集合当种,往往我们认为两个 对象只要成员变量的值一模一样就认为两个对象一样,那我们就需要重写hahsCode()方法和equals()方法
HashSet的举例:
package org.westos.Demo;
//HashSet 集合种元素无序,唯一
import java.util.HashSet;
//测试类
public class HashSetDemo {
//主方法
public static void main(String[] args) {
HashSet<Student> hs = new HashSet();//创建一个HashSet集合
Student s1 = new Student("张三", 29);//创建六个学生对象
Student s2 = new Student("李四", 22);
Student s3 = new Student("王五", 21);
Student s4 = new Student("赵六", 24);
Student s5 = new Student("张三", 29);//s5与s1的中内容相同.因为HashSet的唯一性
//s5不能存入集合当中.这只是我们自己的想法
//而实际情况是,没有重写equals()方法和hashCode()方法
//所以当地址值不同时就可以存入集合,要是想要根据对象内容来
//确定唯一性那么就要重写equals()方法和hashCode()
Student s6 = new Student("李四", 27);
hs.add(s1);//将对象存入集合当中
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
hs.add(s6);
for (Student stu : hs) {//遍历
System.out.println(stu.getName() + "---" + stu.getAge());
}
}
}
package org.westos.Demo;
import java.util.Objects;
//定义一个学生类
public class Student {
private String name;
private int age;
//无参构造
public Student() {
}
//有参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//getXXX和setXXX
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;
}
//重写toString()方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写equals()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
//重写hashCode()方法
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
三:LinkedHashSet
LinkedHashSet的概述:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。线程不安全,效率高.
链表保证了元素有序,哈希表保证了元素唯一.
LinkedHashSet的举例:
package org.westos.Demo;
import java.util.LinkedHashSet;
//测试类
public class LinkedHashDemo {
public static void main(String[] args) {//主方法
LinkedHashSet<Teacher> LHS = new LinkedHashSet<>();//创建一个LinkedHashSet集合
Teacher t1 = new Teacher("张三", 29);//创建五个Teacher对象
Teacher t2 = new Teacher("李四", 29);
Teacher t3 = new Teacher("王五", 28);
Teacher t4 = new Teacher("赵六", 23);
Teacher t5 = new Teacher("张三", 29);//和HashSet一样,不重写equals()和hasCode()方法的话,根据地址可以存入集合当中
//如果重写,元素内容相同,LinkedHashSet的唯一性该元素不能存入集合当中
LHS.add(t1);//将元素放入集合当中
LHS.add(t2);
LHS.add(t3);
LHS.add(t4);
LHS.add(t5);
for (Teacher th : LHS) {//遍历集合
System.out.println(th.getName() + "---" + th.getAge());
}
}
}
package org.westos.Demo;
import java.util.Objects;
//创建一个Teacher集合
public class Teacher {
private String name;
private int age;
//无参构造方法
public Teacher() {
}
//有参构造方法
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
//setXXX()和getXXX()方法
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;
}
//重写toString()方法
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写equals()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return age == teacher.age &&
Objects.equals(name, teacher.name);
}
//重写hashCode()方法
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
四:TreeSet
TreeSet : TreeSet 底层数据结构是二叉树(红黑树)
TreeSet集合的特点,元素唯一,且能对元素进行排序 线程不安全,效率高
TreeSet对元素进行排序,有两种方式,具体使用哪种排序方式,根据构造方法来决定
如果使用的是空参构造,那么采用的是自然排序
元素必须实现Compareble接口并且重写compareTO()方法 ,元素排序就是根据compareTO()方法
的返回值的正负来决定排列顺序,返回0 元素不往里面存
如果使用的是有参构造,那么采用的是比较器排序
通过匿名内部类来传Comparator 比较器 是一个接口 接口中有一个比较的方法 compare()根据此 方法的返回值的正负以及0 来决定元素的排列顺序
TreeSet的举例:
package org.westos.Demo;
import java.util.TreeSet;
//测试类
public class TreeSetDemo {
//主方法
public static void main(String[] args) {
TreeSet<Teacher> TS = new TreeSet<>();//创建一个TreeSet集合
Teacher t1 = new Teacher("张龙", 20);//创建五个Teacher对象
Teacher t2 = new Teacher("赵虎", 22);
Teacher t3 = new Teacher("王朝", 23);
Teacher t4 = new Teacher("马汉", 25);
Teacher t5 = new Teacher("刘能", 21);
TS.add(t1);//将五个元素存入集合中
TS.add(t2);
TS.add(t3);
TS.add(t4);
TS.add(t5);
for (Teacher tea : TS) {//遍历
System.out.println(tea.getName() + "---" + tea.getAge());
}
}
}
package org.westos.Demo;
import java.util.Objects;
//创建一个Teacher集合,并且实现Comparable接口,重写compareTo()方法
public class Teacher implements Comparable<Teacher> {
private String name;
private int age;
//无参构造方法
public Teacher() {
}
//有参构造方法
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
//setXXX()和getXXX()方法
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;
}
//重写toString()方法
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写equals()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return age == teacher.age &&
Objects.equals(name, teacher.name);
}
//重写hashCode()方法
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//重写compareTo方法
@Override
public int compareTo(Teacher o) {
int r = this.getAge()-this.getAge();//通过元素中年龄大小来排序
int r1 = r==0?this.getName().compareTo(o.getName()):r;//如果年龄相同,在根据名字的字典顺序来比较
return r1;//返回值
//根据返回值的正负 ,0 来存放元素
}
}