iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >有哪些Java集合框架
  • 227
分享到

有哪些Java集合框架

2023-06-16 10:06:02 227人浏览 独家记忆
摘要

这篇文章主要介绍“有哪些Java集合框架”,在日常操作中,相信很多人在有哪些Java集合框架问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Java集合框架”的疑惑有所帮助!接下来,请跟着小编一起来学习吧

这篇文章主要介绍“有哪些Java集合框架”,在日常操作中,相信很多人在有哪些Java集合框架问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Java集合框架”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

话不多说,直接上图:

有哪些Java集合框架

Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的:

Collection 和 Map

顾名思义,容器就是用来存放数据的。

那么这两大接口的不同之处在于:

  • Collection 存放单一元素;

  • Map 存放 key-value 键值对。

就是单身狗放 Collection 里面,couple 就放 Map 里。(所以你属于哪里?

学习这些集合框架,我认为有 4 个目标:

  1. 明确每个接口和类的对应关系;

  2. 对每个接口和类,熟悉常用的 api;

  3. 对不同的场景,能够选择合适的数据结构并分析优缺点;

  4. 学习源码的设计,面试要会答啊。

关于 Map,之前那篇 HashMap  的文章已经讲的非常透彻详尽了,所以本文不再赘述。如果还没看过那篇文章的小伙伴,快去公众号内回复「HashMap」看文章吧~

Collection

先来看最上层的 Collection.

有哪些Java集合框架

Collection 里还定义了很多方法,这些方法也都会继承到各个子接口和实现类里,而这些 API  的使用也是日常工作和面试常见常考的,所以我们先来看下这些方法。

操作集合,无非就是「增删改查」四大类,也叫 CRUD:

  • Create, Read, Update, and Delete.

那我也把这些 API 分为这四大类:

功能方法
add()/addAll()
remove()/ removeAll()
Collection Interface 里没有
contains()/ containsAll()
其他isEmpty()/size()/toArray()

下面具体来看:

增:

boolean add(E e);

add() 方法传入的数据类型必须是 Object,所以当写入基本数据类型的时候,会做自动装箱 auto-boxing 和自动拆箱  unboxing。

还有另外一个方法 addAll(),可以把另一个集合里的元素加到此集合中。

boolean addAll(Collection<? extends E> c);

删:

boolean remove(Object o);

remove()是删除的指定元素。

那和 addAll() 对应的,

自然就有removeAll(),就是把集合 B 中的所有元素都删掉。

boolean removeAll(Collection<?> c);

改:

Collection Interface 里并没有直接改元素的操作,反正删和增就可以完成改了嘛!

查:

查下集合中有没有某个特定的元素:

boolean contains(Object o);

查集合 A 是否包含了集合 B:

boolean containsAll(Collection<?> c);

还有一些对集合整体的操作:

  • 判断集合是否为空:

boolean isEmpty();
  • 集合的大小:

int size();
Object[] toArray();

以上就是 Collection 中常用的 API 了。

在接口里都定义好了,子类不要也得要。

当然子类也会做一些自己的实现,这样就有了不同的数据结构。

那我们一个个来看。

List

有哪些Java集合框架

List 最大的特点就是:有序,可重复。

看官网说的:

  • An ordered collection (also known as a sequence).

  • Unlike sets, lists typically allow duplicate elements.

这一下把 Set 的特点也说出来了,和 List 完全相反,Set 是 无序,不重复的。

List 的实现方式有 LinkedList 和 ArrayList 两种,那面试时最常问的就是这两个数据结构如何选择。

对于这类选择问题:

一是考虑数据结构是否能完成需要的功能;

如果都能完成,二是考虑哪种更高效。

(万事都是如此啊。

那具体来看这两个 classes 的 API 和它们的时间复杂度:

功能方法ArrayListLinkedList
add(E e)O(1)O(1)
add(int index, E e)O(n)O(n)
remove(int index)O(n)O(n)
remove(E e)O(n)O(n)
set(int index, E e)O(1)O(n)
get(int index)O(1)O(n)

稍微解释几个:

add(E e) 是在尾巴上加元素,虽然 ArrayList 可能会有扩容的情况出现,但是均摊复杂度(amortized time  complexity)还是 O(1) 的。

add(int index, E e)是在特定的位置上加元素,LinkedList 需要先找到这个位置,再加上这个元素,虽然单纯的「加」这个动作是  O(1) 的,但是要找到这个位置还是 O(n) 的。(这个有的人就认为是 O(1),和面试官解释清楚就行了,拒绝扛精。

remove(int index)是 remove 这个 index 上的元素,所以

  • ArrayList 找到这个元素的过程是 O(1),但是 remove 之后,后续元素都要往前移动一位,所以均摊复杂度是 O(n);

  • LinkedList 也是要先找到这个 index,这个过程是 O(n) 的,所以整体也是 O(n)。

remove(E e)是 remove 见到的第一个这个元素,那么

  • ArrayList 要先找到这个元素,这个过程是 O(n),然后移除后还要往前移一位,这个更是 O(n),总的还是 O(n);

  • LinkedList 也是要先找,这个过程是 O(n),然后移走,这个过程是 O(1),总的是 O(n).

那造成时间复杂度的区别的原因是什么呢?

答:

  • 因为 ArrayList 是用数组来实现的。

  • 而数组和链表的最大区别就是数组是可以随机访问的(random access)。

这个特点造成了在数组里可以通过下标用 O(1) 的时间拿到任何位置的数,而链表则做不到,只能从头开始逐个遍历。

也就是说在「改查」这两个功能上,因为数组能够随机访问,所以 ArrayList 的效率高。

那「增删」呢?

如果不考虑找到这个元素的时间,

数组因为物理上的连续性,当要增删元素时,在尾部还好,但是其他地方就会导致后续元素都要移动,所以效率较低;而链表则可以轻松的断开和下一个元素的连接,直接插入新元素或者移除旧元素。

但是呢,实际上你不能不考虑找到元素的时间啊。。。而且如果是在尾部操作,数据量大时 ArrayList 会更快的。

所以说:

  • 改查选择 ArrayList;

  • 增删在尾部的选择 ArrayList;

  • 其他情况下,如果时间复杂度一样,推荐选择 ArrayList,因为 overhead 更小,或者说内存使用更有效率。

Vector

那作为 List 的最后一个知识点,我们来聊一下 Vector。这也是一个年龄暴露帖,用过的都是大佬。

那 Vector 和 ArrayList 一样,也是继承自 java.util.AbstractList,底层也是用数组来实现的。

但是现在已经被弃用了,因为...它加了太多的 synchronized!

任何好处都是有代价的,线程安全的成本就是效率低,在某些系统里很容易成为瓶颈,所以现在大家不再在数据结构的层面加  synchronized,而是把这个任务转移给我们程序员==

那么面试常问题:Vector 和 ArrayList 的区别是什么,只答出来这个还还不太全面。

来看 stack overflow 上的高票回答:

有哪些Java集合框架

一是刚才已经说过的线程安全问题;

二是扩容时扩多少的区别。

这个得看看源码:

有哪些Java集合框架

这是 ArrayList 的扩容实现,这个算术右移操作是把这个数的二进制往右移动一位,最左边补符号位,但是因为容量没有负数,所以还是补 0.

那右移一位的效果就是除以 2,那么定义的新容量就是原容量的 1.5 倍。

再来看 Vector 的:

有哪些Java集合框架

因为通常 capacityIncrement 我们并不定义,所以默认情况下它是扩容两倍。

答出来这两点,就肯定没问题了。

Queue & Deque

Queue 是一端进另一端出的线性数据结构;而 Deque 是两端都可以进出的。

有哪些Java集合框架

Queue

Java 中的 这个 Queue 接口稍微有点坑,一般来说队列的语义都是先进先出(FIFO)的。

但是这里有个例外,就是 PriorityQueue,也叫 heap,并不按照进去的时间顺序出来,而是按照规定的优先级出去,并且它的操作并不是 O(1)  的,时间复杂度的计算稍微有点复杂,我们之后单独开一篇来讲。

那 Queue 的方法官网[1]都总结好了,它有两组 API,基本功能是一样的,但是呢:

  • 一组是会抛异常的;

  • 另一组会返回一个特殊值。

功能抛异常返回值
add(e)offer(e)
remove()poll()
element()peek()

为什么会抛异常呢?

比如队列空了,那 remove() 就会抛异常,但是 poll() 就返回 null;element() 就会抛异常,而 peek() 就返回 null  就好了。

那 add(e) 怎么会抛异常呢?

有些 Queue 它会有容量的限制,比如 BlockingQueue,那如果已经达到了它最大的容量且不会扩容的,就会抛异常;但如果 offer(e),就会  return false.

那怎么选择呢?:

  • 首先,要用就用同一组 API,前后要统一;

  • 其次,根据需求。如果你需要它抛异常,那就是用抛异常的;不过做算法题时基本不用,所以选那组返回特殊值的就好了。

Deque

Deque 是两端都可以进出的,那自然是有针对 First 端的操作和对 Last 端的操作,那每端都有两组,一组抛异常,一组返回特殊值:

功能抛异常返回值
addFirst(e)/ addLast(e)offerFirst(e)/ offerLast(e)
removeFirst()/ removeLast()pollFirst()/ pollLast()
getFirst()/ getLast()peekFirst()/ peekLast()

使用时同理,要用就用同一组。

Queue 和 Deque 的这些 API 都是 O(1) 的时间复杂度,准确来说是均摊时间复杂度。

实现类

它们的实现类有这三个:

有哪些Java集合框架

所以说,

  • 如果想实现「普通队列 - 先进先出」的语义,就使用 LinkedList 或者 ArrayDeque 来实现;

  • 如果想实现「优先队列」的语义,就使用 PriorityQueue;

  • 如果想实现「栈」的语义,就使用 ArrayDeque。

我们一个个来看。

在实现普通队列时,如何选择用 LinkedList 还是 ArrayDeque 呢?

来看一下 StackOverflow[2] 上的高票回答:

有哪些Java集合框架

总结来说就是推荐使用 ArrayDeque,因为效率高,而 LinkedList 还会有其他的额外开销(overhead)。

那 ArrayDeque 和 LinkedList 的区别有哪些呢?

有哪些Java集合框架

还是在刚才的同一个问题下,这是我认为总结的最好的:

  1. ArrayDeque 是一个可扩容的数组,LinkedList 是链表结构;

  2. ArrayDeque 里不可以存 null 值,但是 LinkedList 可以;

  3. ArrayDeque 在操作头尾端的增删操作时更高效,但是 LinkedList 只有在当要移除中间某个元素且已经找到了这个元素后的移除才是 O(1)  的;

  4. ArrayDeque 在内存使用方面更高效。

所以,只要不是必须要存 null 值,就选择 ArrayDeque 吧!

那如果是一个很资深的面试官问你,什么情况下你要选择用 LinkedList 呢?

答:Java 6 以前。。。因为 ArrayDeque 在 Java 6 之后才有的。。

为了版本兼容的问题,实际工作中我们不得不做一些妥协。。

那最后一个问题,就是关于 Stack 了。

Stack

Stack 在语义上是 后进先出(LIFO) 的线性数据结构。

有很多高频面试题都是要用到栈的,比如接水问题,虽然最优解是用双指针,但是用栈是最直观的解法也是需要了解的,之后有机会再专门写吧。

那在 Java 中是怎么实现栈的呢?

虽然 Java 中有 Stack 这个类,但是呢,官方文档都说不让用了!

有哪些Java集合框架

原因也很简单,因为 Vector 已经过被弃用了,而 Stack 是继承 Vector 的。

那么想实现 Stack 的语义,就用 ArrayDeque 吧:

Deque<Integer> stack = new ArrayDeque<>();

Set

最后一个 Set,刚才已经说过了 Set 的特定是无序,不重复的。

就和数学里学的「集合」的概念一致。

有哪些Java集合框架

Set 的常用实现类有三个:

HashSet: 采用 Hashmap 的 key 来储存元素,主要特点是无序的,基本操作都是 O(1) 的时间复杂度,很快。

LinkedHashSet: 这个是一个 HashSet + LinkedList 的结构,特点就是既拥有了 O(1)  的时间复杂度,又能够保留插入的顺序。

TreeSet: 采用红黑树结构,特点是可以有序,可以用自然排序或者自定义比较器来排序;缺点就是查询速度没有 HashSet 快。

那每个 Set 的底层实现其实就是对应的 Map:

数值放在 map 中的 key 上,value 上放了个 PRESENT,是一个静态的 Object,相当于 place holder,每个 key  都指向这个 object。

那么具体的实现原理、增删改查四种操作,以及哈希冲突、hashCode()/equals() 等问题都在 HashMap  那篇文章里讲过了,这里就不赘述了,没有看过的小伙伴可以在公众号后台回复「HashMap」获取文章哦~

总结

有哪些Java集合框架

到此,关于“有哪些Java集合框架”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 有哪些Java集合框架

本文链接: https://www.lsjlt.com/news/283180.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java集合框架有哪些
    这篇文章主要介绍“Java集合框架有哪些”,在日常操作中,相信很多人在Java集合框架有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java集合框架有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-16
  • 有哪些Java集合框架
    这篇文章主要介绍“有哪些Java集合框架”,在日常操作中,相信很多人在有哪些Java集合框架问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Java集合框架”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-16
  • Java 中有哪些集合框架
    本篇文章为大家展示了Java 中有哪些集合框架,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 为什么要使用集合当我们在学习一个东西的时候,最好是明白为什么要使用这个东西,不要为了用而用,知其然而...
    99+
    2023-06-15
  • Java集合框架的知识点有哪些
    本篇内容介绍了“Java集合框架的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!集合框架(collections framewo...
    99+
    2023-06-17
  • java集合框架的使用场景有哪些
    本篇内容介绍了“java集合框架的使用场景有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、集合框架的认识对于集合框架的认识,为了防止...
    99+
    2023-06-19
  • Java程序员集合框架面试题有哪些
    本篇内容主要讲解“Java程序员集合框架面试题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序员集合框架面试题有哪些”吧!1、 什么是Java集合APIJava集合框架API是用...
    99+
    2023-06-17
  • Java集合框架的面试题及答案有哪些
    这篇文章主要介绍“Java集合框架的面试题及答案有哪些”,在日常操作中,相信很多人在Java集合框架的面试题及答案有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java集合框架的面试题及答案有哪些”的疑...
    99+
    2023-06-17
  • Java集合类框架常见的面试题有哪些
    这篇文章主要介绍“Java集合类框架常见的面试题有哪些”,在日常操作中,相信很多人在Java集合类框架常见的面试题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java集合类框架常见的面试题有哪些”的疑...
    99+
    2023-06-02
  • Java集合框架有什么用
    这篇文章主要介绍Java集合框架有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java集合框架集合概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。集合和数组的区别:数组长度固定,集合长...
    99+
    2023-06-20
  • java集合框架及背后的数据结构有哪些
    今天小编给大家分享一下java集合框架及背后的数据结构有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 介绍Java...
    99+
    2023-07-05
  • java框架有哪些
    java的框架包括:1.SpringMVC框架;2.MyBatis框架;3.Dubbo框架;4.EhCache框架;5.Apache Shiro框架;6.Spring框架;java框架有:SpringMVC是基于java实现Web MVC设...
    99+
    2024-04-02
  • Java集合框架是什么
    这篇文章主要介绍了Java集合框架是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、简介1、集合框架介绍Java集合框架提供了一套性能优良,使用方便的接口和类,他们位于...
    99+
    2023-06-29
  • Java框架之Maven SSM集合
    目录SSMMaven什么是mavenMaven好处,为什么要用Maven三种仓库坐标概念总结SSM @Controller,@Service本质都是@Component,作用是new...
    99+
    2024-04-02
  • Java集合类有哪些
    这篇文章主要介绍“Java集合类有哪些”,在日常操作中,相信很多人在Java集合类有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java集合类有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!Ja...
    99+
    2023-06-19
  • java中的集合框架有什么作用
    本篇内容介绍了“java中的集合框架有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!集合框架是为表示和操作集合而规定的一种统一的标准...
    99+
    2023-06-17
  • Java集合的总体框架有什么用
    这篇文章将为大家详细讲解有关Java集合的总体框架有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、集合概述数组其实就是一个集合。集合实际上就是一个容器。可以来容纳其它的数据。二、集合在开发中的应...
    99+
    2023-06-15
  • Java集合系列之JCF集合框架概述
    Java集合框架(Java Collections Framework,JCF)是Java平台提供的一套用于存储、操作和管理对象的集...
    99+
    2023-09-23
    java
  • 新手初学Java集合框架
    目录Java集合框架集合List接口ArrayListVectorLinkedList:泛型:Set接口HashSetTreeSetMap接口特点:遍历:HashMapHashtab...
    99+
    2024-04-02
  • java日志框架有哪些
    java的日志框架有:1.SLF4J,基于API的java日志框架;2.log4j,基于java的开源日志组件;3.logstash,java日志管理工具;4.gclogviewer,java日志查看工具;5.Commons Logging...
    99+
    2024-04-02
  • java中有哪些orm框架
    java中有哪些orm框架?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了W...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作