2-java集合容器

文章详细介绍了Java集合框架中的集合概念,包括集合与数组的区别,以及Collection接口的子接口Set、List、Queue的特点。Map接口及其常见实现类HashMap、ConcurrentHashMap和Hashtable的差异和使用场景也进行了深入探讨,强调了线程安全和数据结构的实现细节。
摘要由CSDN通过智能技术生成

目录:

1、集合概述
1.1、集合?

​ 集合(容器),主要由两类接口派生而来,分别是CollectionMap

​ Collection主要存放单一元素,子接口ListSetQueue;Map主要存放key-value对

1.2、集合的特点以及为什么要使用集合

​ 我们需要根据键值获取到元素值时就选用 Map 接口下的集合, 需要排序时选择 TreeMap ,不需要排序时就选择 HashMap ,需要保证线程安全就选用ConcurrentHashMap

​ 当我们只需要存放元素值时,就选择实现 Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSetHashSet ,不需要就选择实现 List 接口的比如 ArrayListLinkedList .

​ 当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用 来存储多个数据的。

1.3、集合和数组的区别

​ 1、数据类型:数组既可以存储基本数据类型,又可以存储引用数据类型(基本数据类型存储的是值, 引用数据类型存储的是地址值)集合只能存储引用数据类型(对象), 集合中也可以存储基本数据类型,但是在存储的时候会自动装箱(JDK1.5新特性)变成对象。定义数组时必须指定数组元素类型,集合默认其中所有元素都是Object;

​ 2、长度:数组的长度是固定的,集合长度是可以改变的;

​ 3、获取:无法直接获取数组实际存储的元素个数,length用来获取数组的长度,但可以通过size()直接获取集合实际存储的元素个数;

​ 4、实现方式:集合有多种实现方式和不同的适用场合,如ListSetMap等;而不像数组仅采用分配连续的空间方式;

​ 5、效率:集合以接口和类的形式存在,具有封装,继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂的操作,大大提高软件的开发效率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xt5p6cOB-1678692402487)(/Users/sunjiabao/Library/Application Support/typora-user-images/image-20230313132027724.png)]

2、Collection
2.1、Set

HashSetSet接口的实现类,线程不安全。 HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。主要用不需要保证元素插、取顺序的场景。

LinkedHashSetSet接口的实现类,线程不安全。 LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。主要用于需要保证元素插、取顺序的场景FIFO。

TreeSetSet接口的实现类,线程不安全。 TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。主要用于支持对元素自定义排序的场景。

2.1、List

ArrayList:是List的主要实现类,底层使用 Object[ ] 存储,是线程不同步的,适用于频繁的查找工作,线程不安全 ; ArrayList扩容机制

VectorList 的古老实现类,底层使用 Object[ ] 存储,线程安全的。

LinkedList (通常是不会用到的,可以用ArrayList替代)底层使用的是双向链表(1.6之前是循环链表,1.7取消了循环)

2.1、Queue

Queue 是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO)规则。Queue 扩展了 Collection 的接口。方法有:add(E e)remove()element()

Deque 是双端队列,在队列的两端均可以插入或删除元素。Deque 扩展了 Queue 方式的不同分为两类,方法有:addFirst(E e)addFirst(E e)addLast(E e)addFirst(E e)addLast(E e)getFirst()getLast()

ArrayDequeLinkedList 的区别:

ArrayDequeLinkedList 都实现了 Deque 接口,两者都具有队列的功能。从性能的⻆度上,选用 ArrayDeque 来实现队列要比 LinkedList 更好。此外, ArrayDeque 也可以用于实现栈。

  • ArrayDeque 是基于可变⻓的数组和双指针来实现,而 LinkedList 则通过链表来实现;
  • ArrayDeque 不支持存储 NULL 数据,但 LinkedList 支持;
  • ArrayDeque 是在 JDK1.6 才被引入的,而 LinkedList 早在 JDK1.2 时就已经存在;
  • ArrayDeque 插入时可能存在扩容过程, 不过均摊后的插入操作依然为 O(1)。虽然 LinkedList不需要扩容,但是每次插入数据时均需要申请新的堆空间,均摊性能相比更慢。

​ **PriorityQueue**与 Queue 的区别在于元素出队顺序是与优先级相关的,即总是优先级最高的元素先出队。

3、Map接口
3.1、HashMap的底层实现
3.2、HashMap的⻓度为什么是 2 的幂次方
3.3、HashMap多线程操作导致死循环问题
3.4、HashMap有哪几种常⻅的遍历方式?
3.5、ConcurrentHashMap 和 Hashtable的区别
3.6、ConcurrentHashMap 线程安全的具体实现方式/底层具体实现
3.7、JDK 1.7和 JDK 1.8*的 ConcurrentHashMap 实现有什么不同?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值