Set集合、HashSet集合、LinkedHashSet集合

1、Set集合的特点

无序,不重复、无索引

Set集合的方法上基本和Collection的API一致

2、Set集合的实现类特点

HashSet:无序、不重复、无索引

LinkedHashList:有序、不重复、无索引

TreeSet:可排序、不重复、无索引

public static void main(String[] args) {

        //1、创建一个Set集合的对象
        Set<String> s=new HashSet<>();

        //2、调用add方法
        //如果当前元素是第一次添加,成功返回true;如果是重复添加,添加失败返回false
        s.add("张三");
        s.add("李四");
        s.add("王五");
        //3、打印集合
        //无序
        System.out.println(s);

        //迭代器进行遍历
        Iterator<String> it=s.iterator();
        while (it.hasNext()){
            String str=it.next();
            System.out.println(str);
        }

        //增强for遍历
        for (String str:s){
            System.out.println(str);
        }

        //Lambda表达式遍历
        s.forEach(str-> System.out.println(str));
    }

 public static void main(String[] args) {

        /*
        对象的整数类型表示
        1、如果没有重写hashCode方法,不同对象计算出的哈希值是不一样的
        2、如果已经重写了hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是相同的
        3、但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能相同。(哈希碰撞)
         */

        //1、创建对象
        student s1=new student("zhangsan",23);
        student s2=new student("zhangsan",23);

        //2、重写hashCode方法
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

        //在小部分情况下会发生哈希碰撞
        System.out.println("abc".hashCode());
        System.out.println("acD".hashCode());
    }

 

 1、创建一个默认长度为16,默认加载因为0.75的数组(即当存入的数据达到总长度的75%时,开始扩容),数组名为table

2、根据元素的哈希值跟数组的长度计算出应存入的位置

3、判断当前位置是否为null,如果是null则直接存入

4、如果位置不为null,表示有元素,调用equals方法比较属性值(如果是自定义的对象,需要重写equals和hashCode方法)

5、

一样:不存 不一样:存入数组,形成链表

jdk8以前:新元素存入数组,老元素挂在新元素下面

jdk8以后:新元素直接挂在老元素的下面,当链表的长度超过8,且数组长度大于等于64时,连标自动转化为红黑树。

1、jdk8以前:数组和链表组合而成。

      jdk8以后:数组和链表和红黑树组成。

2、

1、先根据地址值或者属性值计算哈希值,利用哈希值寻找到数组存储位置

2、判断是否为null,如果为null,直接存入。如果不是null代表已经存入数据,使用equals方法(如果是自己定义的对象需要重写equals方法),将新元素挂在老元素下面,当满足链表的长度超过8,且数组长度大于等于64时,将链表转化做红黑树。

3、Hash存储时会根据哈希值随机存储,而取出来时会顺着数组的索引进行取值。

4、因为链表有许多元素,不能直接单独分为一组。

5、equals和HashCode方法进行去重判断。

 

 和哈希表一样,但是添加数据的时候才用了双向链表的方式,查询时按照节点顺序进行查询,因此存取有序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值