一:Set集合的概述。
Set集合不允许存储相同的元素,而且存取顺序不一致,属于集合的一种。Set集合主要有以下几种HashSet,LinkedHashSet,和TreeSet三种;下面来介绍一下几种集合。
二HashSet
(1)Hash集合的特点:底层由哈希表组成,元素无序且唯一,元素的唯一靠元素重写hashCode()和equals()方法来实现,线程不安全,效率高,Integer和String类型对hashCode()方法和equals()方法实现了重写。
(2)对HashSet集合存储字符并进行遍历
举例:
public class Demo {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("hello");
set.add("java");
set.add("hello");
for(String str:set){
System.out.println(str);
}
}
}
结果:
体现了元素的唯一性和无序。
(3)Hashset集合对对象元素的遍历
举例:
public class Demo1 {
public static void main(String[] args) {
HashSet<Student> hashSet = new HashSet<>();
hashSet.add(new Student("张三",10));
hashSet.add(new Student("李四",19));
hashSet.add(new Student("李三",10));
hashSet.add(new Student("赵四",20));
hashSet.add(new Student("张三",10));
for(Student stu :hashSet){
System.out.println(stu.getName()+"=="+stu.getAge());
}
}
}
学生类:
public class Student {
private String name;
private int age;
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", 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 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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
结果: 注意:Student需要重写hashCode()equals()方法
三:LinkedHashSet类
(1)概述:LinkedHashSet底层是由链表和哈希表组成,所以既能保证元素有序还能保证元素唯一。线程不安全,效率高。
(2)举例:LinkedHashSet集合的遍历.
举例:
public class Demo2 {
public static void main(String[] args) {
LinkedHashSet<Integer> integers = new LinkedHashSet<>();
integers.add(11);
integers.add(22);
integers.add(33);
integers.add(44);
integers.add(55);
integers.add(11);
integers.add(66);//遍历
for(Integer integer:integers){
System.out.println(integer);
}
}
}
元素唯一且有序。
四:TreeSet集合
(1)TreeSet的概述:TreeSet中的元素是唯一的,但是TreeSet集合对元素进行了排序,如果对TreeSet的构造为无参构造的话,那么排序方式为自然排序,要求元素必须实现Copareble 接口,重写此接口中的copareTo方法 若为有参构造的话,排序方式为比较器排序,参数要一个Comparetor比较器(接口)重写比较器中的compare()方法根据此方法的返回值的正负0来决定元素的排列顺序。它的底层为二叉树结构
(2)二叉树结构:二叉树的数据结构 先存入一个树根 分两个叉
存储元素时 跟树根比较 小的放在左边 大的放在右边
如果相等就不存储
取的时候按照 左中右的顺序来取
(3)自然遍历练习:(注意)自然排序 此对象 必须实现Comparable接口 否则报错
举例:
public static void main(String[] args) {
TreeSet<Student> treeSet = new TreeSet<>();
treeSet.add(new Student("张三",18));
treeSet.add(new Student("赵四",15));
treeSet.add(new Student("张三",18));
treeSet.add(new Student("王五",14));
treeSet.add(new Student("张四",13));
for(Student set:treeSet){
System.out.println(set.getName()+"=="+set.getAge());
}
}
}
学生对象:
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", 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 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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student o) {
int r=this.getName().length()-o.getName().length();
int r1=r==0?this.getAge()-o.getAge():r;
int r2=r1==0?this.getName().compareTo(o.getName()):r1;
return r2;
}
}
结果:
(3)比较器遍历的举例:
举例:
public class Demo1 {
public static void main(String[] args) {
Mycompare mycompare = new Mycompare();
TreeSet<Student> set = new TreeSet<Student>(mycompare);
set.add(new Student("张三",20));
set.add(new Student("李四",22));
set.add(new Student("赵四",40));
set.add(new Student("张四",33));
set.add(new Student("张三",20));
for(Student stu:set){
System.out.println(stu.getName()+"=="+stu.getAge());
}
}
}
学生类:
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
}
结果: