集合进阶——set系列

继承于Collection,

add,clear,remove,contains,isEmpty,size

三种遍历

package 集合进阶;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetDemo {
    public static void main(String[] args) {
        Set<String> s = new HashSet<>();
        s.add("zhagnsan");
        s.add("lisi");
//输出无序的,所以不一定按顺序输出
        System.out.println(s);
//1.迭代器
        Iterator<String> iterator = s.iterator();
        while (iterator.hasNext()){
            String s1 = iterator.next();
            System.out.println(s1);
        }
//2.增强for循环
        

        for (String s1 : s) {
            System.out.println(s1);
        }
//3.lambda表达式
        s.forEach(s1 -> System.out.println(s1));

    }
}


HashSet(底层采用哈希表)

哈希表

ptg插件一键生成标准JavaBean

重写hashCode,相同对象输出相同的哈希值

哈希碰撞:不同属性的值查找的哈希值一样

底层原理:链表长度超过8,数组长度大于64,自动转换为红黑树


hashCode,equals底层都是比较的地址值,我们需要的是属性值

重写hashCode的目的:

底层用地址值进行比较,利用属性值计算哈希值

重写equals的目的:比较对象的属性值而不是地址值


1.为什么hashSet存取顺序不一样?

按键填入,但是输出遍历是从头开始


2.hashSet为什么没有索引?

一个位置挂几个,不好区分


3.hashSet利用什么机制保证数据去重?

HashSet首先获取哈希值,然后用equals获取内部属性值



案例:

利用HashSet去除内部重复值

返回false,

HashSet里面如果是自定义对象,要重写hashcode,equals方法来去重

如果是系统定好的结构,不用手动重写


LinkHashSet(相对于hashset有序)

底层原理热盎然是哈希表,但是每个元素额外多了一个双链表机制来记录存储的顺序

保证输入和输出顺序一样


但是使用时候仍然默认用HashSet


TreeSet

会自动排序从小到大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值