[进阶]java基础之集合四(set集合)

set系列集合

特点

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,不能使用普通的for循环遍历,也不能通过索引来获取元素

set集合的实现类

  • HashSet:无序、不重复、无索引
  • LinkedHashset:有序、不重复、无索引
  • Treeset:可排序、不重复、无索引

Set接口中的方法上基本上与Collection的API一致。

在这里插入图片描述

练习(存储字符串并遍历)

利用Set系列的集合,添加字符串,并使用多种方式遍历。

  • 迭代器
  • 增强for
  • Lambda表达式

代码呈现

package myset;

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

public class SetDemo1 {
    public static void main(String[] args) {
        /*
        利用Set系列的集合,添加字符串,并使用多种方式遍历。
        迭代器
        增强for
        Lambda表达式
         */

        //1.创建一个set集合对象

        Set<String> s = new HashSet<String>();

        //2.添加元素
        //如果当前元素第一次添加则返回值为true
        //如果当前元素为第二次添加则返回false
        boolean r1 = s.add("张三");
        boolean r2 = s.add("张三");
        boolean r3 = s.add("李四");
        boolean r4 = 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));



    }
}

HashSet

底层原理:

  • HashSet集合底层采取哈希表存储数据
  • 哈希表是一种对于增删改查数据性能都较好的结构

哈希表组成

  • JDK8之前:数组+链表
  • JDK8开始:数组+链表+红黑树

哈希值
对象的整数表现形式

  • 根据hashcode方法算出来的int类型的整数
  • 该方法定义在object类中,所有对象都可以调用,默认使用地址值进行计算
  • 一般情况下,会重写hashcode方法,利用对象内部的属性值计算哈希值

对象的哈希值的特点

  • 如果没有重写hashcode方法,不同对象计算出的哈希值是不同的
  • 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
  • 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
    在这里插入图片描述
    在这里插入图片描述
    Hashset底层原理
  • 创建一个默认长度16,默认加载因为0.75的数组,数组名table
  • 根据元素的哈希值跟数组的长度计算出应存入的位置
  • 判断当前位置是否为null,如果是null直接存入
  • 如果位置不为null,表示有元素,则调用equals方法比较属性值
  • 一样:不存不一样:存入数组,形成链表
    JDK8以前:新元素存入数组,老元素挂在新元素下面
    JDK8以后:新元素直接挂在老元素下面
  • JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树
  • 如果集合中存储的是自定义对象,必须要重写hashcode和equals方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值