Java集合 超详细版+面试题

news2025/1/11 22:45:40

程序总是根据运行时才知道的某些条件去创建新的对象。在此之前,无法知道所需对象的数量甚至确切类型。为了解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。下面讲详细介绍如何使用标准库中的集合类。

集合框架图

简化图: 

说明:对于以上的框架图有如下几点说明

1、所有集合类都位于java.util包下。Java 的集合类主要由两个接口派生而出:Collection 和 Map,Collection 和 Map 是 Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。

2、集合接口:6 个接口(短虚线表示),表示不同集合类型,是集合框架的基础。

3、抽象类:5 个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。

4、实现类:8 个实现类(实线表示),对接口的具体实现。

5、Collection 接口是一组允许重复的对象。

6、Set 接口继承 Collection,集合元素不重复。

7、List 接口继承 Collection,允许重复,维护元素插入顺序。

8、Map 接口是键-值对象,与 Collection 接口没有什么关系。

9、Set、List 和 Map 可以看做集合的三大类:

List 集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。

Set 集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。

Map 集合中保存 Key-value 对形式的元素,访问时只能根据每项元素的 key 来访问其 value。


基本概念

Java 集合概览

Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。

Java集合类库采用“持有对象”的思想,并将其分为两个不同的概念,表示为类库的基本接口:

1.集合(Collection):一个独立元素的序列,这些元素都服从一条或多条规则。List 必须以插入的顺序保存元素, Set 不能包含重复元素, Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。

2. 映射(Map) :一组成对的“键值对”对象,允许使用键来查找值。ArrayList 使用数字来查找对象,因此在某种意义上讲,它是将数字和对象关联在一起。map 允许我们使用一个对象来查找另一个对象,它也被称作关联数组(associative array),因为它将对象和其它对象关联在一起;或者称作字典(dictionary),因为可以使用一个键对象来查找值对象,就像在字典中使用单词查找定义一样。Map 是强大的编程工具。Java集合类库将接口(interfaces)与实现(implementations)分离。使用接口的目的是,如果想要改变具体实现,只需在创建时修改它就行了。因此,可以像下面这样创建一个 List :

List<User> apples = new ArrayList<>();

这种方式并非总是有效的,因为某些具体类有额外的功能。例如, LinkedList 具有 List 接口中未包含的额外方法,而 TreeMap 也具有在 Map 接口中未包含的方法。如果需要使用这些方法,就不能将它们向上转型为更通用的接口。


说说 List, Set, Queue, Map 四者的区别?

List(对付顺序的好帮手): 存储的元素是有序的、可重复的。

Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。

Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。

Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x" 代表 key,"y" 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。


如何选用集合?

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

当我们只需要存放元素值时,就选择实现Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet,不需要就选择实现 List 接口的比如 ArrayList 或 LinkedList,然后再根据实现这些接口的集合的特点来选用。


为什么要使用集合?

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

数组的缺点是一旦声明之后,长度就不可变了;同时,声明数组时的数据类型也决定了该数组存储的数据的类型;而且,数组存储的数据是有序的、可重复的,特点单一。但是集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。


Java集合经典问题

ArrayList 了解吗?

ArrayList 的底层是动态数组,它的容量能动态增长。在添加大量元素前,应用可以使用ensureCapacity操作增加 ArrayList 实例的容量。ArrayList 继承了 AbstractList ,并实现了 List 接口。

ArrayList 的扩容机制?

ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。默认情况下,新的容量会是原容量的1.5倍。

ArrayList 了解吗?

ArrayList 的底层是动态数组,它的容量能动态增长。在添加大量元素前,应用可以使用ensureCapacity操作增加 ArrayList 实例的容量。ArrayList 继承了 AbstractList ,并实现了 List 接口。

ArrayList 的扩容机制?

ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。默认情况下,新的容量会是原容量的1.5倍。

HashMap为什么线程不安全?

多线程下扩容死循环。JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。

HashMap和HashTable的区别?

HashMap和Hashtable都实现了Map接口。

HashMap可以接受为null的key和value,key为null的键值对放在下标为0的头结点的链表中,而Hashtable则不行。

HashMap是非线程安全的,HashTable是线程安全的。Jdk1.5提供了ConcurrentHashMap,它是HashTable的替代。

Hashtable很多方法是同步方法,在单线程环境下它比HashMap要慢。


以上就是今日知识分享,如果你喜欢记得点赞评论哦,以防找不到我!

(以上文字及图片整理于网络,如有侵权联系删除)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遗传算法求解问题(1)

问题描述 在一个长度为 n 的数组中选择 10 个元素&#xff0c;使得 10个元素的和 与 该元组中元素总和的 1/10 接近 问题约束 数组长度 n&#xff1a;10 < n < 100; 数组中没有重复的数字&#xff0c;所以选择的10个元素中也没有重复的数字 遗传算法原理 请移步我上…

国产第一颗7A的车规级马达驱动芯片TMI8140-Q1

新能源汽车因其电动化和智能化的特性&#xff0c;需要大量的马达驱动、DC/DC、高效率Buck & BuckBoost等车规级芯片&#xff0c;成为名副其实的“芯片大户”&#xff01; 以往制造一辆传统汽车一般需要用到500-600颗左右的芯片&#xff0c;而一台高性能的新能源汽车需要芯…

上传IPA包到App Store​

我们都经历过上传IPA包到App Store时的痛苦&#xff01;&#xff01;&#xff01;​ 第一步&#xff1a;通过Xcode-> Archive&#xff0c;Validate App&#xff0c;成功&#xff01;​ 第二步&#xff1a;通过Xcode-> Archive&#xff0c;Distribute App&#xff0c;成…

从股票市场选择配对的股票:共同趋势模型与套利定价理论

股价取对数之后的序列建模为随机游走。现在把取对数之后的股价当作是由一个随机游走和一个平稳时序组成&#xff1a; 是随机游走部分&#xff0c;是平稳部分。取对数后的股价求差就得到回报。所以在时间的回报表示为&#xff1a; 表示非平稳部分的回报&#xff0c;表示平稳部分…

如何基于运维事件中心通过 logstash 进行日志关键字监控

日常运维过程中&#xff0c;很多场景都需要对日志关键字进行监测&#xff0c;以便第一时间发现应用/业务相关异常&#xff0c;这是一种比较常见的监控需求&#xff0c;所以也有很多方法可以实现关键字告警。对于简单的告警可以通过一些传统的监控工具实现&#xff0c;但对于体量…

从头开始搭建一个SpringBoot项目--SpringSecurity的配置

从头开始搭建一个SpringBoot项目--SpringSecurity的配置前言本文的目标使用到的依赖、Redis配置、通用返回实体类依赖Redis项目里的配置通用返回实体ResultResultCodeResultUtil配置文件配置的目录结构Spring Security的配置信息SecurityConfigWebMVCConfig用到的类及代码自定义…

深入浅出自定义创建spring-boot-starter

深入浅出自定义创建spring-boot-starter https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration 快速入手 第一步&#xff1a;新建模块 第二步&#xff1a;修改依赖 <?xml version"1.0" e…

关键词(三)

关键词一.最冤枉的关键字—sizeof二.“简单”的布尔类型—_Bool一.最冤枉的关键字—sizeof 前面我们说过定义变量是需要空间的&#xff08;声明不需要&#xff09;&#xff0c;同时你需要有类型像int,char…这些不同的类型会在内存中开辟不同大小的空间&#xff0c;而sizeof就可…

Web安全测试工具AppScan简述

01 安全测试的对象 了解常见的Web应用安全漏洞&#xff0c;参考OWASP Top 10 2017。 理解这些常见漏洞的攻击原理&#xff0c;如何判断系统是否存在这些漏洞、如何防止这些漏洞。 02 安全测试的实施 SQL注入测试 确认所有的解释器都明确的将不可信数据从命令语句或者查询语…

微服务囧途之BFF层登场

从单体架构演化为微服务架构后&#xff0c;架构者的期望是“模块A”“模块B” “后端服务”。 场景一 Web端和Mobile端都有一个详情页面&#xff0c;需要调用模块A的getDetail接口获取数据。假设Web端实际需要展示的字段是20个&#xff0c;Mobile端实际需要展示的字段是10个…

记一次Metrics-server异常

报错 前几天测试环境k8s集群做etcd的备份恢复。 所有的pod都起来了&#xff0c;包括metrics-server的状态也是 Running,部署新pod也没有异常&#xff0c;结果kubectl top 请求的时候报错了 Error from server (ServiceUnavailable): the server is currently unable to handle …

Spring cloud Consul 服务注册中心实战

Spring cloud Consul服务注册中心一、简介二、功能三、角色四、工作原理1、服务注册及发现2、服务调用五、起步1、下载2、安装六、实例一、简介 Consul 用于实现分布式系统的服务注册与配置&#xff0c;与其它方案相比&#xff0c;Consul 更 “一站式”&#xff0c;内置了服务…

移植lighttpd笔记

一、前言 lighttpd交叉编译并移植到iTop4412平台 二、编译环境 ubuntu 18.04pcrelighttpd交叉编译链:arm-none-linux-gnueabi三、编译过程 1.pcre交叉编译 tar -xvf pcre-8.38.tar.bz2 cd pcre-8.38/ ./configure --host=arm-none-linux-gnueabi --prefix=/ --enable-utf8 …

IDEA中如何实现 git stash 命令的可视化操作?

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a;git stash 相关命令 1、git stash 2、git stash save 注释 3、git stash list 4、git stash pop 5、git stash apply stash{编号} 6、git stash drop stash{编号} 7、git stash clear 8、git stash…

flutter 内网安装包生成二维码

参考 前言 有时候我们可能需要用手机访问电脑上的文件, 或者用手机测试电脑上编写的程序 此时 在同一个wifi网络的前提下我们可以这么做: 第一种 使用python 直接使用自带python工具开启http服务, 首先打开终端, 进入需要共享的目录,然后运行以下代码即可: python -m Simple…

React TreeSelect 组件使用和优化

1、自定义折叠和展开图标 此时就要用到switcherIcon属性&#xff0c;以下是antd中对switcherIcon属性的描述&#xff0c; switcherIcon自定义树节点的展开/折叠图标ReactNode | ((props: AntTreeNodeProps) > ReactNode)-具体使用如下&#xff1a; import { DownOutlined…

数据库原理及MySQL应用 | 事件

事件由一个特定的线程——事件调度器来管理&#xff0c;事件是根据指定时间表&#xff0c;在某一特定的时间点&#xff0c;触发相关的SQL语句或存储过程。 01、事件概述 事件(Event)是根据指定时间表执行的任务&#xff0c;是MySQL在相应的时刻调用的过程式数据库对象。它由事…

抓包分析ssh远程主机为何变慢了?

文章目录背景SSH协议握手过程ssh 抓包MAC层包传输tcp握手抓包解释三次握手的第一个报文- SYN包第一个报文对应的抓包详情三次握手的第二个报文- SYNACK包第二个报文对应的抓包详情三次握手的第三个报文- ACK包第三个报文对应的抓包详情ssh版本协议交换密钥协商key阶段Key Excha…

程序员的工资这么高,为什么还会有人离职?

出了社会以后才发现&#xff0c;班级里天天打鸡血的、最奋斗的、同时也最焦虑的&#xff0c;不是成绩最好的&#xff0c;也不是成绩最差的&#xff0c;而是那帮处于中间的人。 他们不像那些成绩最差的&#xff0c;或是天天摆烂&#xff0c;或是靠高情商混得风生水起&#xff1b…

Pytest----pluggy源码解读基础准备

【原文链接】Pytest----pluggy源码解读基础准备 解读pluggy源码&#xff0c;直接使用pytest环境中安装的pluggy即可&#xff0c;比如这里安装的pluggy版本是1.0.0&#xff0c;为了更好的理解源码&#xff0c;这里首先使用如下应用代码作为应用实例&#xff0c;从如下代码中可以…