java笔记之Collection之Set接口

文章介绍了Java中的Set接口及其常用实现类,包括HashSet、LinkedHashSet和TreeSet的基本特性和底层实现机制。HashSet基于HashMap,无序且不允许重复,而LinkedHashSet保持插入顺序,TreeSet则支持定制排序,底层实现为TreeMap。文章还讨论了Set接口的遍历方式以及HashSet的扩容和红黑树转换规则。
摘要由CSDN通过智能技术生成

韩顺平老师的零基础30天学java的课程总结


一、Set接口及常用方法

1.Set接口的基本介绍

(1)无序(添加和取出的顺序不一致),没有索引。
(2)元素不重复。(只能有一个null)
(3)Set接口也实现了Collection接口。
其以下的常用子类有HashSet和TreeSet。HashSet的子类有LinkedHashSet。
在这里插入图片描述

2.Set接口的常用方法

Set接口也是Collection的子接口,因此常用方法和Collection一样。

3.Set接口的遍历方式

1.增强for。
2.迭代器。
3.不能通过索引方式来获取。
如:

Set set = new HashSet();
//1.add添加
set.add("john");
set.add("lucy");
set.add("john");
set.add("jack");
set.add("audrey");
set.add("Cline");
set.add(null);
set.add(null);
//System.out.println("set=" + set);//无序,不重复。
//2.这里的无序指添加和取出的顺序不一致,但取出的顺序却是固定的,只要取出的是这个顺序,下次运行还是这个顺序。
//for (int i = 0; i < 10; i++) {
//   System.out.println("set="+set);
// }
//3.remove删除
set.remove(null);
//4.contains查找-根据key值.
System.out.println(set.contains("Cline"));
//5.isEmpty判断是否为null
System.out.println(set.isEmpty());
//6.遍历
System.out.println("=====使用迭代器=====");
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
    Object next = iterator.next();
    System.out.println("set="+next);
}
System.out.println("======增强for循环=====");
for (Object o :set) {
    System.out.println("o="+o);
}

没有set方法修改。

二、Set接口的实现类-HashSet

1.HashSet的全面说明

(1)HashSet实现了Set接口。
(2)HashSet底层实现的是HashMap。
(3)HashSet不能有重复的对象/元素,所以只能存放一个null值。
(4)HashSet不保证元素有序,元素会先计算hash值,再计算索引。

2.HashSet不能加入相同数据的真正含义

HashSet的底层是HashMap,HashMap的底层是(数组+链表+红黑树)
add方法进行添加时,
1.会先根据传入的key值(对象)计算hash值,然后通过hash得出一个索引值。
2.然后找到存储数据表table,看该索引处是否为null,如果是null就直接添加,如果不是就通过equals进行比较。
3.如果equals为true就放弃添加,如果为false就添加到后面。
在这里插入图片描述
(String类及基本数据类型的内容相同的对象的hash值是一样的。)
如:

set.add("abc");
set.add("abc");
set.add(1);
set.add(1);

只要一个abc和1能添加成功。

3.分析HashSet的扩容和转成红黑树机制

如果一条链上已经有8个对象,此时还要向链上添加,就要看该数组的大小是不是到64个,如果没到64就会进行扩容,如果到64,就会将这条链转化成红黑树。
在这里插入图片描述

三、接口的实现类-LinkedHashSet

1.LinkedHashSet的全面说明

(1)LinkedHashSet是HashSet的子类
(2)底层是LinkedHashMap,维护了一个数组+双向链表
(3)添加顺序和取出顺序一致(使用hash值决定了元素的存储位置,使用双向链表维持了元素的次序。)
(4)LinkedHashSet不允许添加重复元素。

2.LinkedHashSet的底层机制说明

在这里插入图片描述
在这里插入图片描述

四、TreeSet

在这里插入图片描述

介绍

(1)当用无参构造器构建时,仍是无序的。
(2)可以通过传入一个比较器对象Comparator实现定制排序。(如通过字符的大小,通过字符串的长度。)
(3)TreeSet的底层是TreeMap。
如:

        //1.默认构造器不会有序
//        TreeSet treeSet = new TreeSet();
        //2.有参,传入比较器对象,实现定制排序
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //1.通过字符的大小进行排序
                return ((String)o1).compareTo((String)o2);
                //2.通过字符串的长度
//                return ((String)o2).length()-((String)o1).length();
            }
        });
        //添加数据
        treeSet.add("jack");
        treeSet.add("tom");
        treeSet.add("sp");
        treeSet.add("a");

        System.out.println("treeSet="+treeSet);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值