Set集合
一.了解set集合
1.特点:无序;对象不可重复,即唯一
2.遍历方式:
1)foreach
2)iterator 迭代器
3)注意:因为set集合的特点,无序即没有下标,所以无法使用for循环下标遍历的方式
/**
* set集合
* 1.特点
* 2.遍历方式 两种 foreach iterator
*/
Set<String> set=new HashSet<>();
set.add("jj");
set.add("tt");
set.add("gg");
System.out.println("--------无序--------");
//1.无序
for (String s : set) {
System.out.print(s+",");//jj,tt,gg,
}
System.out.println();
System.out.println("---------唯一--------");
//2.唯一
set.add("cc");
for (String s : set) {
System.out.print(s+",");//jj,tt,gg,cc,
}
System.out.println();
System.out.println("---------迭代器遍历--------");
//3.迭代器遍历
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.print(it.next()+",");
}
二.常用的实现类
1.HashSet 这个我们上面一直在用就不再作解释了
2.重点:TreeSet
2.1TreeSet继承SortedSet(排序集合)接口
2.2定义:TreeSet是按照某种规则对集合里的元素进行排序
2.3排序的实现:
1)自然排序接口:java.lang.Comparable (针对对象)
2)比较器:java.util.Comparator
System.out.println("----------简单的String类型排序--------------");
Set<String> si=new TreeSet<String>();
si.add("yu");
si.add("dc");
si.add("fg");
si.add("xz");
for (String s : si) {
System.out.print(s+",");//dc,fg,xz,yu,
}
System.out.println();
System.out.println("----------对象类型排序--------------");
//该例子是对学生成绩进行 降序 排序
Set<Student> stu=new TreeSet<>(new ScoreComparator());//此处是方法调用
stu.add(new Student(2, "弟弟", 55.5));
stu.add(new Student(3, "君君", 58.5));
stu.add(new Student(1, "梅子", 25.5));
//使用foreach遍历
/*for (Student s : stu) {
System.out.println(s);
}*/
Iterator<Student> is = stu.iterator();
while(is.hasNext()) {
System.out.println(is.next());
/*
* Student [sid=3, sname=君君, score=58.5]
Student [sid=2, sname=弟弟, score=55.5]
Student [sid=1, sname=梅子, score=25.5]
*/
}
学生实体类:
package com.zking.set.test;
import java.io.Serializable;
public class Student implements Serializable,Comparable<Object>{
private Integer sid;
private String sname;
private Double score;
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 Double getScore() {
return score;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]";
}
public void setScore(Double score) {
this.score = score;
}
public Student(Integer sid, String sname, Double score) {
super();
this.sid = sid;
this.sname = sname;
this.score = score;
}
public Student() {
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
//result = prime * result + ((score == null) ? 0 : score.hashCode());
//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 (score == null) {
if (other.score != null)
return false;
} else if (!score.equals(other.score))
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;*/
if(this.getSname().equals(other.getSname()))
return true;
return true;
}
@Override
public int compareTo(Object o) {
Student stu=(Student)o;
return -(this.getSid()-stu.getSid());
}
}
调用的ScoreComparator方法:
package com.zking.set.test;
import java.util.Comparator;
public class ScoreComparator implements Comparator<Student> {
public int compare(Student o1, Student o2) {
return -(o1.getScore().hashCode()-o2.getScore().hashCode());//降序
//return o1.getScore().hashCode()-o2.getScore().hashCode();//升序
}
}
三.关于set集合元素是被过滤还是被覆盖问题
1.同样要使用到上面的Student学生实体类
2.注意:
1)需要实现Comparable接口,重写hashcode()方法和equals()方法
2)步骤:
a.先执行hashcode方法,判断对象属性的哈希码值是否一致,若一致则直接被过滤掉,不再输出该元素;
b.若不一致,则再执行equals()方法,在equals()方法中具体对象属性的属性值,根据需求,返回元素!
对比两张图可知,set集合重复的元素是被过滤掉的,而非覆盖!!!
四. 关于LinkedHashSet
1.元素是有顺序的
2.元素是不重复的
3.底层数据结构是按照链表的结构存储的 Linked
感谢你耐心的看完,希望对你有所帮助!