一文搞懂Java中的容器(集合类)

这篇具有很好参考价值的文章主要介绍了一文搞懂Java中的容器(集合类)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:本文介绍的集合类有很多,有的是日常开发常用的,有的是面试常问的,建议大家都了解一点。


一、容器的分类

Java 容器分为 CollectionMap 两大类,其下又有很多子类,如下所示:
一文搞懂Java中的容器(集合类)

这里有个面试点:Collection 和 Collections 有什么区别?
Collection 是一个集合接口
Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:Collections. sort(list)。

二、List、Set、Map 之间的区别是什么

一文搞懂Java中的容器(集合类)

三、List

1、ArrayList 和 LinkedList 的区别是什么?

  • 数据结构:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
  • 查询效率:ArrayListLinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  • 增删效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList

2、ArrayList 和 Vector 的区别是什么?

  • 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
  • 性能:ArrayList 在性能方面要优于 Vector,同样是因为Synchronized,每个操作都需要去获取锁。
  • 扩容:ArrayListVector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%

不推荐使用Vector性能非常低。在需要保证线程安全的场景下,可以使用Collections.synchronizedList()List 转为线程安全的 SynchronizedList。或者使用写时复制CopyOnWriteArrayList

四、Map

1、HashMap 的实现原理

HashMap的数据结构是数组 + 链表 + 红黑树,通过put(key,value)存储,get(key)来获取。在存储时,对key进行哈希计算得到哈希值,确定在数组中的位置,如果没有哈希冲突,直接可以存储元素。如果产生哈希冲突,会遍历链表,判断哈希值和key值,决定是修改还是插入链表末尾。

链表在默认配置下,超过8位会转成红黑树,增加效率。

HashMap扩容时会先把数组大小扩容为原数组的两倍,再对原数组的元素重新确定位置,转移到新数组中。

想要了解更详细的实现原理,源码等信息,请参考之前发布的《你真的懂HashMap吗???》一文

2、HashMap 和 Hashtable 有什么区别?

  • 存储:HashMapkeyvalue 都可以为 null,而 Hashtable 不允许。
  • 线程安全:Hashtable 使用了 Synchronized 来实现线程同步,是线程安全的,而 HashMap 是非线程安全的。

不推荐使用Hashtable性能非常低。在需要保证线程安全的场景下,可以使用ConcurrentHashMap,在Java 1.8 优化后,性能非常客观。

3、HashMap 和 TreeMap有什么区别?

  • 数据结构:HashMap的数据结构是 数组+链表+红黑树TreeMap的数据结构是红黑树
  • 实现接口:TreeMapHashMap 都继承自 AbstractMap ,但是需要注意的是 TreeMap 它还实现了 NavigableMap 接口和 SortedMap 接口,拥有对集合内元素的搜索能力和根据键key的排序能力。
  • 性能:HashMap适用于在Map中插入删除定位元素,Treemap适用于按自然顺序自定义顺序遍历键(key)。

五、Iterator

1、Iterator 是什么?

Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

2、Iterator 和 ListIterator 有什么区别?

  • Iterator 可以遍历 SetList 集合,而 ListIterator 只能遍历 List
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator 继承 Iterator 接口,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置

3、Iterator 怎么使用?有什么特点?

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
    String s = iterator.next();
    System.out.println(s);
}

Iterator的使用非常简单,通过集合的iterator()获取实例,根据hasNext()遍历元素。
Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。


总结

Java中的容器在日常开发中使用频率非常高,根据不同的业务需求选择不同的容器非常重要,不仅可以提高性能,也能减少出错。但这需要对每个容器都有相对深入的理解。
希望我的分享能对你理解Java中的容器有所帮助。文章来源地址https://www.toymoban.com/news/detail-491641.html

到了这里,关于一文搞懂Java中的容器(集合类)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文搞懂 MySQL 中的常用函数及用法

    MySQL是一种常用的关系型数据库管理系统,它提供了许多内置函数来处理数据。本文将介绍MySQL中的各种常用函数,包括字符串函数、日期函数、数学函数、聚合函数等。 1.1CONCAT函数 CONCAT函数用于将两个或多个字符串连接在一起。它的语法如下: 其中,str1、str2等为要连接的

    2024年02月10日
    浏览(38)
  • 一文搞懂深度信念网络!DBN概念介绍与Pytorch实战

    本文深入探讨了深度信念网络DBN的核心概念、结构、Pytorch实战,分析其在深度学习网络中的定位、潜力与应用场景。 关注TechLead,分享AI与云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员

    2024年02月11日
    浏览(47)
  • Linux | 一文带你真正搞懂Linux中的权限问题

    首先来说说权限的基本概念: a.限制人的 b.访问的对象天然可能没有这种“属性” 首先这么说吧,权限也可以理解成【一件事情是否允许被谁“做”】,这个“谁”在Linux中分为两种用户,我么吧下面马上说到 然后要明确权限包括什么: 权限 = 人 + 事物(文件)属性(rwx)

    2024年02月02日
    浏览(49)
  • 一文搞懂idea中的根目录和路径(以Mybatis为例)

    项目根目录是你在文件系统中为整个项目选择的顶层目录。 它通常包含了项目的所有内容,包括源代码、构建配置文件、文档、测试文件等。 在版本控制系统中(如 Git),项目根目录通常是仓库的根目录。 在 IntelliJ IDEA 或其他 JetBrains IDE 中,内容根目录指的是一个模块(

    2024年03月21日
    浏览(42)
  • 【C++漂流记】一文搞懂类与对象中的对象特征

    在C++中,类与对象是面向对象编程的基本概念。类是一种抽象的数据类型,用于描述对象的属性和行为。而对象则是类的实例,具体化了类的属性和行为。本文将介绍C++中类与对象的对象特征,并重点讨论了对象的引用。 相关链接: 一文搞懂类与对象的封装 一文搞懂C++中的

    2024年02月07日
    浏览(41)
  • 【Java基础篇】一文搞懂Java方法的调用与重载(超详细)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 概念 :在Java中,方法是一段包含了一系列语句的可重用代码块。方法用于执行特定的任务或操作,并且可以带有输入参数和返回值。 方法的意义 :J

    2024年02月11日
    浏览(43)
  • 到底什么是Java AIO?为什么Netty会移除AIO?一文搞懂AIO的本质!

    关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论Java BIO和Java NIO这两者,而关于Java AIO的文章就少之又少了( 即使用也只是介绍了一下概念和代码示例 )。 在深入了解AIO之前,我注意到以下几个现象: 1) 2011年Java 7发布,它增加了

    2024年02月10日
    浏览(40)
  • 安全无忧:Java并发集合容器的应用与实践

    JDK 提供的这些容器大部分在 java.util.concurrent 包中: ConcurrentHashMap : 线程安全的 HashMap CopyOnWriteArrayList : 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector ConcurrentLinkedQueue : 高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列

    2024年01月19日
    浏览(44)
  • Java集合之Disruptor 介绍

    1.1.1 定义 Disruptor 是一个开源的高性能内存队列,由英国外汇交易公司 LMAX 开发的,获得了 2011 年的 Oracle 官方的 Duke’s Choice Awards(Duke 选择大奖)。 Disruptor 提供的功能类似于 Kafka 、 RocketMQ 这类分布式队列,不过,其作为范围是 JVM (内存), Disruptor 解决了 JDK 内置线程安全队列

    2024年02月12日
    浏览(32)
  • Java转换坐标系,GPS(WGS84)大地200(CGCS200)、百度(BD-09)、高德(GCJ-02)互转,一文搞懂坐标系、坐标转换

    1.分不清的坐标系 WG-S84: 地理坐标系统,GPS仪器记录的经纬度信息,Google Earth采用,Google Map中国范围外使用,高德地图中国范围外使用。 GCJ-02: 投影坐标系统,火星坐标系,中国国家测绘局制定的坐标系统,由WGS-84加密后的坐标。Google中国和搜搜地图,arcgis地图,高德地图

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包