Set集合:
* 特点:
* 不包含重复元素,由于它不能直接实例化,
* 一般情况 使用子实现类实例化: HashSet TreeSet
HashSet集合:
元素唯一的,存储和取出不一致(无序性),特别是它不保证该顺序恒久不变。
Set<Student> set = new HashSet<Student>() ;
//创建学生对象
Student s1 = new Student("亚索", 20) ;
Student s2 = new Student("盲僧", 18) ;
Student s3 = new Student("盲僧", 18) ;
Student s4 = new Student("螳螂", 25) ;
Student s5 = new Student("螳螂", 25) ;
Student s6 = new Student("ez", 27) ;
Student s7 = new Student("ez", 27) ;
//给集合中添加
set.add(s1) ;
set.add(s2) ;
set.add(s3) ;
set.add(s4) ;
set.add(s5) ;
set.add(s6) ;
set.add(s7) ;
//遍历集合
for(Student s: set) {
System.out.println(s.getName()+"---"+s.getAge());
}
/* HashSet集合:不能保证集合的顺序恒久不变!唯一
*输出结果:
* 螳螂---25
盲僧---18
ez---27
亚索---20
* */
LinkedHashSet
/*
* LinkedHashSet:底层依赖于哈希表和链接列表实现
* 由哈希表保证元素唯一
* 由链表保证元素有序
* 特点:有序性和唯一性
* */
public class LinkedHashSetDemo {
public static void main(String[] args) {
//创建一个LinkedHashSet集合对象
LinkedHashSet<String> set = new LinkedHashSet<String>() ;
//添加字符串元素
set.add("hello") ;
set.add("world") ;
set.add("java") ;
set.add("java") ;
set.add("hello") ;
set.add("javaee") ;
//遍历
for(String s: set) {
System.out.println(s);
}
}
/*
hello
world
java
javaee
*/
TreeSet
基于TreeMap的实现,底层数据结构是一种红黑树结构,根据使用不同的构造方法,排序不同,
TreeSet集合两种排序
* 自然排序,对于自定义的类实现Comparable接口,重写compareTo(T o)方法,通过无参构造放TreeSet() ;
* 比较器排序:是一个有参构造方法
*
* 使用TreeSet集合存储Student类型(自然排序)
* 主要条件:按照姓名的长度从小到大排序
* 次要条件:(分析一两个次要条件)
* 长度一样,姓名内容不一定一样,
* 姓名内容相同,年龄不一定一样
1、自然排序 Comparable接口 重写compareTo(T o)的返回值默认是0,
import java.util.TreeSet;
/*
* 需求:使用TreeSet存储自定义对象Student
* 为什么出现这个ClassCastException:Student类型不能转换为Comparle接口
*如果要使用自然排序---->TreeSet(); 必须让当前该集合的类型实现自然排序的接口comparable
*
* 主要条件:按照年龄从小到大排序
*
* 自己分析次要条件
* 年龄如果一样,不一定
* 姓名的内容比较
* */
public class TreeSetDemo2 {
public static void main(String[] args) {
//创建TreeSet集合对象
//public TreeSet()构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
TreeSet<Student> ts = new TreeSet<Student>() ;
//创建几个学生对象
Student s1 = new Student("zhangguorong", 20) ;
Student s2 = new Student("wanglihong", 20) ;
Student s3 = new Student("wenzhang", 20) ;
Student s4 = new Student("zhangguorong", 28) ;
Student s5 = new Student("gaoyuanyuan", 25) ;
Student s6 = new Student("zhaoyouting", 29) ;
Student s7 = new Student("zhaoyouting", 35) ;
//添加到集合中
// java.lang.ClassCastException:
//com.qianfeng.set_04.Student cannot be cast to java.lang.Comparable
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
ts.add(s7) ;
//遍历
for(Student s :ts) {
System.out.println(s.getName()+"---"+s.getAge());
}
/*
zhaoyouting---35
zhaoyouting---29
zhangguorong---28
gaoyuanyuan---25
wanglihong---20
wenzhang---20
zhangguorong---20
*/
}
}
//实现自然排序接口
public class Student implements Comparable<Student> {
private String name ;
private int age ;
public Student() {
super();
}
public Student(String name, int age) {
super();
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 "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student s) {//存储s1对象根节点 s2进行比较
// return 0; //0
//按照年龄从小到大进行排序
int num = s.age -this.age ;
//加上次要条件
//年龄如果一样,不一定
//姓名的内容比较
int num2 = (num==0)?(this.name.compareTo(s.name)) :num ;
return num2 ;
}
}
2、 比较器排序
* 主要条件:按照姓名的长度从小到大排序
* */
import java.util.Comparator;
public class TreeSetDemo {
public static void main(String[] args) {
//创建一个TreeSet集合对象,有参构造方式
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() ) ; //子实现类对象
@Override
public int compare(Student s1, Student s2) {
//return 0;
//s1----->刚才使用自然排序里面 this
//s2----->刚才使用自然排序里面的s
//主要条件:按照姓名的长度从小到大排序
int num = s1.getName().length()-s2.getName().length() ;
//次要条件:姓名长度一样,内容不一定一样
int num2 = (num==0)?(s1.getName().compareTo(s2.getName())): num ;
//内容一样,不一定年龄一样
int num3 = (num2==0)?(s1.getAge()-s2.getAge()):num2 ;
return num3;
}
});
//创建学生对象
Student s1 = new Student("zhangguorong", 20) ;
Student s2 = new Student("wanglihong", 20) ;
Student s3 = new Student("wenzhang", 20) ;
Student s4 = new Student("zhangguorong", 28) ;
Student s5 = new Student("gaoyuanyuan", 25) ;
Student s6 = new Student("zhaoyouting", 29) ;
Student s7 = new Student("zhaoyouting", 35) ;
Student s8 = new Student("liushishi", 34) ;
Student s9 = new Student("wuqilong", 43) ;
Student s10 = new Student("wenzhang", 27) ;
//添加集合中
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
ts.add(s7) ;
ts.add(s8) ;
ts.add(s9) ;
ts.add(s10) ;
//遍历
for(Student s:ts) {
System.out.println(s.getName()+"---"+s.getAge());
}
}