17、集合框架——Set
来源:互联网 发布:淘宝上可以买彩票吗 编辑:程序博客网 时间:2024/06/03 17:07
1、Set集合概述及特点
Collection
list 有序(存储顺序和取出顺序一致),可重复
set 无序(存储顺序和取出顺序不一致),唯一
HashSet:它不保证set的迭代顺序,特别是它不保证该顺序恒久不变
注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序
2、HashSet
A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
1、 存储字符串并遍历
// 创建集合对象
HashSet<String> hs = new HashSet<String>();
// 创建并添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
// 遍历集合
for (String s : hs) {
System.out.println(s);
}
2、保证元素唯一性的源码解析
3、存储自定义对象并遍历
3、LinkedHashSet的概述和使用
LinkedHashSet:底层数据结构由哈希表和链表组成。
哈希保证元素的唯一性。
链表保证元素有序。
4、TreeSet
TreeSet:能够对元素按照某种规则进行排序(基于TreeMap),底层是二叉树结构
排序有两种方式
A. 自然排序(Comparable)
无参构造
Student.java
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;}@Overridepublic int compareTo(Student s) {// 主要条件 姓名的长度int num = this.name.length() - s.name.length();// 姓名的长度相同,不代表姓名的内容相同int num2 = num == 0 ? this.name.compareTo(s.name) : num;// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄int num3 = num2 == 0 ? this.age - s.age : num2;return num3;}TreeSetDemo.java
public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象TreeSet<Student> ts = new TreeSet<Student>();// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}
B. 比较器排序 (Comparator)
带参构造
Studetn.java
public class 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;}}TreeSetDemo.java
public static void main(String[] args) {// 创建集合对象// TreeSet<Student> ts = new TreeSet<Student>(); //自然排序// public TreeSet(Comparator comparator) //比较器排序// TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象// 而匿名内部类就可以实现这个东西TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {// 姓名长度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("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}
1、存储Integer类型的元素并遍历
2、保证元素排序的源码解析
3、TreeSet保证元素排序和唯一性的原理
唯一性:是根据比较的返回值是否是0来决定的
排序:
A:自然排序(元素具备比较性)
让元素所属的类实现自然排序接口Comparable
B:比较器排序(集合具备比较性)
让集合的构造方法接收一个比较器接口的子类对象Comparator
4、存储自定义对象并遍历
5、总结
阅读全文
0 0
- 集合框架—Set
- 17、集合框架——Set
- Java集合框架—Set
- Javase—集合框架Set
- 集合框架—02—Set
- 集合框架1——List,Set
- Java集合框架基础——Set
- 集合框架——Set(HashSet)
- 集合框架——Set(TreeSet)
- 集合框架——Set(TreeSet练习)
- 黑马程序员——集合框架3:Set集合
- (36)Java学习笔记——集合框架 / Set集合
- 集合框架-Set集合
- 黑马程序员——【Java】集合框架——Set
- 黑马程序员——Java集合框架—Set
- 黑马程序员_java集合框架——Set
- 黑马程序员——API集合框架-Set、Map
- java基础——集合框架(List、Set、Map)
- 如何使用Docker、Docker-Compose和Rancher搭建部署Pipeline(二)
- 聊聊Java中的Object类
- css样式换行整理
- pandas入门——数据切片
- node中的异步
- 17、集合框架——Set
- zcmu-1954
- Windows的cmd中cd指令切换路径
- Git Submodule管理项目子模块
- SO_REUSEADDR与SO_REUSEPORT平台差异性与测试
- Linux 登陆shell,交互shell以及环境变量读取顺序
- java写kafka的生产者与消费者代码
- 目前在餐厅吃饭,有什么你发现的痛点,哪些可以用互联网的思维来解决?并提出解决方案?
- Android Service 使用,一个简单音乐播放器 DEMO(二)