java的常用集合

本文深入剖析了Java中的三种核心集合类:ArrayList(基于数组)、HashSet(底层是HashMap)和LinkedList(双向链表)。讲解了它们的特点、操作方法和适用场景,对比了它们在线程安全性、添加删除效率及内存结构上的差异。

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

单列集合

双列集合(键值对形式)

Collection接口常用方法

此处使用继承了Collection接口的List接口来演示 

        List list = new ArrayList();
        list.add("jack");
        list.add(10);
        list.add(true);
        System.out.println(list);
        Integer d = (Integer) list.get(1);
        //删除指定元素
        list.remove(d);
        System.out.println(list);
        //contains:查找元素是否存在
        System.out.println(list.contains("jack"));
        //获取元素格式
        System.out.println(list.size());
        //isEmpty:判断是否为空
        System.out.println(list.isEmpty());
        //clear:清空
        list.clear();
        System.out.println(list);
        //addAll:添加多个元素
        ArrayList list2 = new ArrayList();
        list2.add("西游记");
        list2.add("西游记2");
        list.addAll(list2);
        System.out.println(list);
        //containsAll:查找多个元素是否都存在
        System.out.println(list.containsAll(list2));
        //删除多个元素
        list.removeAll(list2);
        System.out.println(list);

List接口常用实现类 

ArrayList

1.ArrayList是由数组来实现数据存储的,

2.ArrayList基本等同于Vector,除了ArrayList是线程不安全的(执行效率高),由源码分析没有关键字synchronized修饰,在多线程情况下不建议使用ArrayList ,可以考虑使用线程安全的Vector

ArrayList的底层操作机制源码分析:

1)ArrayList中维护了一个Object类型的数组elementData,ArrayList使用这个数组来存储数据,所以说ArrayList底层是一个数组

transient Object[] elementData; //transient 有瞬间,短暂的意思,该关键字表示其所修饰的属性不会被序列化

如果使用的是无参构造,则初始的elementData容量为0,第1次添加,则将其扩容为10,后面再次扩容则扩容为原来的1.5倍

3)如果使用的是指定大小的构造器,则elementData的初始容量为指定大小,后面在扩容则扩容为原来的1.5倍

ArrayList与Vector的比较 

ArrayList与LinkedList的比较

这两个都是线程不安全的

关于LinkedList的说明:

LinkedList底层实现了双向链表和双端队列特点。
可以添加任意元素(元素可以重复),包括null。
线程不安全,没有实现同步。

Set接口常用实现类 

Set接口基本介绍:

1)无序(添加和取出的顺序不一致),没有索引。

2)不允许重复元素,所以最多包含一个null。

Set接口的常用方法:

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

Set接口的遍历方式:

同Collection的遍历方式一样,因为Set接口是Collection接口的子接口。

1.可以使用迭代器

2.增强for

3.不能使用索引的方式来获取

 HashSet

1.HashSet底层是HashMap

2.添加一个元素时,先得到hash值会转成->索引值

3.找到存储数据表table,看这个索引位置是否已经存放有元素

4.如果没有,直接加入

5.如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后的位置

6.在java8中,如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认是8),并且table的大小大于等于MIN_TREEIFY_CAPACITY(默认64)就会进行树化(红黑树) 

Map接口

1.Map与Collection并列存在。用于保存具有映射关系的数据:key-value(双列元素)
2.Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node中
3.Map中的key不允许重复,原因和HashSet一样,
4.Map中的value可以重复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值