Java自学笔记—LinkedHashSet

本文介绍了Java中LinkedHashSet的特点,它是HashSet的子类,底层使用LinkedHashMap维护元素顺序。主要关注了元素添加、遍历顺序的一致性以及其底层实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java自学笔记—LinkedHashSet

特点

  1. HashSet子类
  2. 底层是LinkedHashMap,底层维护了一个数组 + 双向链表,有 head 和 tail 结点
  3. 每个结点有before和after属性,以便形成双向链表
  4. 根据hashCode值确定元素存储位置,同时使用链表维护元素次序,使得元素看起来以插入顺序保
  5. 不允许添加重复元素
  6. 遍历时可以确保遍历和插入顺序一致
  7. 在添加元素时,先求hash值,再求索引,确定table位置,然后将该元素加到双向链表(如果已经存在,则不添加,和HashSet一样)
    tail.next = newElement;
    newElement.pre = tail;
    tail = ewElement;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Set;

/**
 * @author Lspero
 * @version 1.0
 */
public class LinkedHashSet_ {
    public static void main(String[] args) {
        
        Set set = new LinkedHashSet();
        set.add(new String("AA"));
        set.add(456);
        set.add(456);
        set.add(new Customer("jack", 18));
        set.add(123);
        set.add("lspero");
        System.out.println(set);
        //1.LinkedHashSet加入与去除元素的顺序一致
        //2.LinkedHashSet底层维护的是LinkedHashMap
        //LinkedHashSet底层结构(数组+双向链表)
        //第一次添加时,直接将table扩容到16,存放的结点类型是LinkedHashMa$Entry
        //数组是 HashMap$Node[] 存放的数据是LinkedHashMa$Entry类型
        /*
            //继承关系在内部类完成
            static class Entry<K,V> extends HashMap.Node<K,V> {
                Entry<K,V> before, after;
                Entry(int hash, K key, V value, Node<K,V> next) {
                    super(hash, key, value, next);
                }
            }

         */
    }
}

class Customer{
    private String name;
    private int age;

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

常用方法

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

/**
 * @author Lspero
 * @version 1.0
 */
@SuppressWarnings("all")
public class SetMethod {
    public static void main(String[] args) {
        /*
         * 无序,没有索引
         * 不允许重复,最多一个null
         * 常用方法和Collection一样,但不能用索引获取元素
         * */
        Set set = new HashSet();
        //set接口实现类对象不能存放重复对象,可以添加一个null
        //数据存放时是无序的,但取出的顺序是固定的
        set.add("jhon");
        set.add("lucy");
        set.add("jhon");
        set.add("jack");
        set.add(null);
        set.add(null);
        System.out.println("Set = " + set);

        //遍历 迭代器和增强For循环
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }

        System.out.println("=========");
        for (Object o :set) {
            System.out.println(o);
        }
        //Set接口对象不能通过索引获取
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值