Set集合
阅读:235目录介绍
- 1.Set集合
- 1.1 特点
- 1.2 注意
- 2.HashSet
- 2.1 特点
- 2.2 如何保证元素唯一性
- 2.3 使用HashSet集合存储自定义对象,保证元素的唯一性
- 2.4 存储图解
- 3.LinkedHashSet
- 3.1 特点
- 4.TreeSet
- 4.1 TreeSet集合特点
- 4.2 如何进行排序
- 4.3 使用TreeSet集合存储自定义对象,并排序案例
- 4.4 使用TreeSet集合存储自定义对象,安排姓名的长度进行排序
- 4.4 产生10个1-20之间的随机数要求随机数不能重复案例
- 5.二叉树原理图
1.Set集合
1.1 特点
- Set集合: 可以保证元素的唯一性 , 但是不保证有序(有序: 指的是存储和取出的顺序一致)
1.2 注意
- set集合在存储元素的时候,需要对元素进行处理,按照一定的算法对元素进行排序,而有的时候我们的添加元素的顺序巧号是set集合计算完毕以后的顺序,但是这也不能说明是有序的
2.HashSet
- 2.1 特点
- HashSet集合保证元素的唯一性依赖于两个方法一个是hashCode方法,一个是equals方法在进行比较的时候先比较的是对象的hashCode值,如果对象的hashCode值是相同的,那么在调用equals方法比较.
- 2.2 如何保证元素唯一性
- 而我们的字符串是重写hashCode方法和equals方法,那么在这里相同的字符串的hashCode值就是相同的,并且equals方法比较是内容。当hashCode值相同,并且调用equals方法返回的是true的时候,说明两个对象是同一个,于是不进行存储,即就保证了元素的唯一性
- 2.3 使用HashSet集合存储自定义对象,保证元素的唯一性
- 如果两个对象的成员变量是相同的,那么我们认为就是同一个对象
- 2.4 存储图解
3.LinkedHashSet
- 3.1 特点
- LinkedHashSet: 底层的数据结构是链表和哈希表
- 元素唯一 ,并且有序
4.TreeSet
4.1 TreeSet集合特点 *
4.2 如何进行排序
- 集合可以对元素进行排序,而排序有两种方式一种是自然排序,一种是比较强器排序
- 到底使用的是自然排序还是比较器排序,主要取决于我们使用的构造方法
public TreeSet(): 使用自然排序
public TreeSet(Comparator<? super E> comparator) 使用的就是比较器排序
- 4.3 使用TreeSet集合存储自定义对象,并排序案例
/**
* 需求: 使用TreeSet集合存储自定义对象,并排序
*/
// 创建自定义对象
Student s1 = new Student("刘亦菲" , 18) ;
Student s2 = new Student("貂蝉" , 16) ;
Student s3 = new Student("杨玉环" , 22) ;
Student s4 = new Student("王昭君" , 14) ;
Student s5 = new Student("西施" , 25) ;
Student s6 = new Student("范冰冰" , 25) ;
// 创建TreeSet集合对象
TreeSet<Student> ts = new TreeSet<Student>() ; // 自然排序
// 添加元素
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
// 遍历集合
for(Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
//在student类中
public class Student implements Comparable<Student>{
//省略部分代码
@Override
public int compareTo(Student o) {
/**
* 按照年龄进行排序
*/
int num = this.age - o.age ;
// 比较姓名
int num2 = num == 0 ? this.name.compareTo(o.name) : num ;
return num2;
}
}
- 4.4 使用TreeSet集合存储自定义对象,安排姓名的长度进行排序
/**
* 需求: 使用TreeSet集合存储自定义对象,安排姓名的长度进行排序
*/
// 创建自定义对象
Student s1 = new Student("liubei" , 23) ;
Student s2 = new Student("guanyunchang" , 21) ;
Student s3 = new Student("zhangfei" , 18) ;
Student s4 = new Student("lvbu" , 25) ;
Student s5 = new Student("zhugeliang" , 23) ;
Student s6 = new Student("guanyu" , 23) ;
Student s7 = new Student("guanyu" , 25) ;
// 创建集合对象
TreeSet<Student> ts = new TreeSet<Student>() ;
// 添加元素
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
ts.add(s7) ;
// 增强for遍历
for(Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
//-------------------------
public class Student implements Comparable<Student>{
@Override
public int compareTo(Student o) {
/**
* 比较姓名的长度
*/
int num = this.name.length() - o.name.length() ;
// 比较内容
int num2 = (num == 0) ? this.name.compareTo(o.name) : num ;
// 比较年龄
int num3 = (num2 == 0) ? this.age - o.age : num2 ;
return num3;
}
}
- 4.5 产生10个1-20之间的随机数要求随机数不能重复案例
/**
* 产生10个1-20之间的随机数,要求不能重复
* 分析:
* 1: 创建一个HashSet集合对象 , 作用: 存储产生的随机数
* 2: 生成随机数 , 把随机数添加到集合中
* 3: 使用循环,当集合的长度大于等于10退出循环 , 小于10就一直循环
*/
// 创建一个HashSet集合对象 , 作用: 存储产生的随机数
HashSet<Integer> hs = new HashSet<Integer>() ;
while(hs.size() < 10) {
// 使用Random类
Random random = new Random() ;
int num = random.nextInt(20) + 1 ;
// 把num添加到集合中
hs.add(num) ;
}
// 遍历
for(Integer i : hs) {
System.out.println(i);
}
5.二叉树原理图
赞赏支持
