鱼C论坛

 找回密码
 立即注册
查看: 2660|回复: 1

[学习笔记] Java-021集合框架之Set

[复制链接]
发表于 2018-12-26 19:24:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-12-26 22:33 编辑

1、Set简介
Set是一个不包含重复元素的 collection。
① 继承于Collection接口,具有增删查改的方法!
② Set有两个实现类,HashSetTreeSet
2、HashSet
① HashSet实现Set接口,底层数据结构哈希表,那么它也是一个不包含重复元素的一个无序的集合,允许使用null,有且仅有一个元素为null!
② HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装!
        Set s = Collections.synchronizedSet(new HashSet(...));
③ HashSet中含有一个”HashMap类型的成员变量”map,HashSet的操作函数,实际上都是通过map实现的。
// 创建集合对象
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);
}
为什么存储字符串的时候,字符串内容相同的只存储了一个呢?判断标准是什么?
        e.hash == hash  &&  ((k = e.key) == key || key.equals(k))
标准: 添加元素的哈希值 --->  元素的地址值  或  equals()方法
如果HashSet存储其他类,如果类没有重写这两个方法,默认使用的Object()。一般来说不会相同,会都加入集合。
==> 存储HashSet的类对象需要重写hashCode()和equals()方法。
3、LinkedHashSet
LinkedHashSet继承了HashSet,底层数据结构由哈希表和链表组成。
① 哈希表保证元素的唯一性。
② 链表保证元素有素。(存储和取出是一致)
// 创建集合对象
LinkedHashSet<String> hs = new LinkedHashSet<String>();
// 创建并添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
// 遍历
for (String s : hs) {
        System.out.println(s);
}
4、TreeSet
基于 TreeMap 的 NavigableSet 实现,底层数据结构为二叉树。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。
排序有两种方式(取决于构造方法)  ==>  A:自然排序  &&  B:比较器排序
1. 构造方法
TreeSet() ------------------------------------------------->   构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c)   ---------------->    构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator)  ---->    构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet<E> s) ------------------------------>   构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
自然排序:
        如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口。
public int compareTo(T o)  ---------->  比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
Integer等包装类默认重写了上面的方法。---> 从小到大排序
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 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;
        }
}
TreeSet集合保证元素唯一性的原理:
唯一性 ---->  根据比较的返回是否是0来决定。
注意:
① TreeSet中不允许使用null元素!在添加的时候如果添加null,则会抛出NullPointerException异常。
② TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-5 11:05:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表