Java集合面试题汇总大全

news2024/11/17 10:00:01

每个集合的出现一定是为了解决某种问题的解决方案。

 

集合流程图

  1. JAVA中集合和数组的区别
  2. Collection和Collections的区别
  3. ArrayList和LinkedList 和Vector的区别
  4. list/set/map的区别
  5. HashSet和TreeSet和LinkedHashSet区别
  6. HashMap和Hashtable的比较
  7. HashMap和ConcurrentHashMap区别
  8. HashMap 底层实现原理
  9. HashMap和LinkedHashMap的区别?
  10. ArrayList/LinkedList /HashMap初始大小,add后是多少?(jdk1.8)

一、JAVA中集合和数组的区别

数组:
 定义:相同数据类型的集合。
 缺点:声明数组长度是固定的。
集合:
 定义:相同数据类型的集合。
 优点:声明时不需要指定长度。(底层做了动态扩容问题)
                
1. 数组声明了它容纳的元素的类型,集合默认是Object。
2. 数组一旦固定大小就无法改变容量,而集合是可以动态扩展容量。

二、Collection和Collections的区别

- Collection:是集合类的上级接口,继承与它的接口主要有Set、List
- Collcetions:针对集合类的一个帮助类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全等操作

三、ArrayList和LinkedList 和Vector的区别

类 别

ArrayList

Vector

LinkedList

数据结构

数组

数组

双向链表

优 点

查询快

查询快

增删快

缺点

增删慢

增删慢

查询慢

继 承 类

AbstractList

AbstractList

AbstractSequentialList

实 现 接 口

List, RandomAccess,Cloneable, Serializable

List, RandomAccess, Cloneable, Serializable

List, Deque, Cloneable, Serializable

线 程 安 全

不安全

被synchronized修饰,线程 安全

不安全

默 认 容 量

10

10

最 大 容 量

Integer.MAX_VALUE - 8

Integer.MAX_VALUE - 8

1 << 25

扩 增

1.5倍,不可设增长因子

2倍,可设增长因子

\

使 用 场 景

频繁查找元素(单线程)

频繁查找元素(多线程)

频繁增删元素(单线 程)

1.线程安全
	Vector : 线程安全
	ArrayList, LinkedList : 线程不安全
2.实现⽅式
	LinkedList : 链表,比基于数组更节省空间
	ArrayList,Vector : 数组
3.扩容
	ArrayList和Vector使⽤数组实现, 当数组长度不够,内部会创建⼀个更大的数组
	LinkedList 不存在这⽅⾯的问题
4.速度
	ArrayList 查改快, 增删慢
	LinkedList 查改慢, 增删快

四、list/set/map的区别

list/set/map都是各自集合的接口。

本文中的有序指的是添加顺序和遍历顺序一致,称为有序。

类别

list

set

map

元素顺序

有序

无序

无序

元素去重

可以

不可以

键唯一,value可以重复

collection接口

继承

继承

并列

总结:

List:
  1.可以允许重复的对象。
  2.可以插入多个null元素。
  3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
  4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
Set:
  1.不允许重复对象
  2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
  3. 只允许一个 null 元素
  4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
Map:
  1.Map不是collection的子接口或者实现类。Map是一个接口。
  2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
  3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
  4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
  5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

五、HashSet和TreeSet和LinkedHashSet区别

类别

HashSet

TreeSet

LinkedHashSet

数据结构

hash表

链表

元素顺序

无序

有序

有序

null值存在

一个

不可以

一个

时间复杂度

1

n

1

线程安全

不安全

不安全

不安全

HashSet:
	1、无序 2、非线程安全 3、集合元素中可以存放一个null
TreeSet:
	1、默认自然顺序的有序集合 2、非线程安全 3、不可以存放null元素
LinkedHashSet:
	1、保存元素添加顺序的有序集合 2、非线程安全

六、HashMap和Hashtable的比较

类别

HashMap

Hashtable

父类

AbstractMap

Dictionary

遍历Iterator

fail-fast迭代器

1.8前:Enumeration

线程

不安全

安全:Synchronize、modCount++

null值

可以

不可以

容量扩增

16、2:计算效率

11、2n+1:哈希冲突减少

方法

/

多elments() 和contains() 两个方法

1、HashTable 线程安全,HashMap 非线程安全
2、Hashtable 不允许 null 值(key 和 value 都不可以),HashMap 允许 null 值(key 和 value 都可以)。
3、两者的遍历方式大同小异,Hashtable 仅仅比 HashMap 多一个 elements 方法

七、HashMap和ConcurrentHashMap区别

类 别

HashMap

ConcurrentHashMap

底 层 结 构

1.8前:列表+链表 1.8:列表+链 表+红黑树(链表长度到8)

1.7:数组+链表 1.8:数组+链表+红黑树

线 程

不安全

安全:分段锁、CAS+Synchronized

扩 增

默认初始值16、扩容因子: 0.75(时间与空间一个平衡值), 扩容一倍

段内元素超过该段对应Entry数组长度的75%触发扩 容,不会对整个Map进行扩容 ConcurrentHashMap

null 值

可以

不可以

总结:
1、ConcurrentHashMap是线程安全的,HashMap不是线程安全的
2、HashMap允许键和值为null,ConcurrentHashMap不允许
3、HashMap在用Iteroctor遍历的同时,不允许修改HashMap,ConcurrentHashMap允许该行为,并且对后续的遍历是可见的
(CurrentHashMap使用的是分段锁,效率高于HashTable,且是线程安全)

八、HashMap 底层实现原理

具体详细可参考:HashMap原理讲解

一、HashMap基本描述
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。并且不保证映射的顺序。


1.1HashMap的数据结构?
哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过8时,链表转换为红黑树
1.2HashMap的工作原理?
HashMap(底层采用数组+链表),采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,依次来解决Hash冲突的问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。
1.3HashMap的put实现过程?
HashMap通过put&get方法存储和获取。我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put(key, value)方法传递键和值时,它先调用key.hashCode()方法,得到hash值,然后结合数组长度,计算得数组下标,用于找到bucket位置,来储存Entry对象。
如果hash值在HashMap中不存在,则执行插入,若存在,则发生碰撞,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。
如果hash值在HashMap中存在,且它们两者equals返回true,则更新键值对。
如果HashMap集合中的键值对大于12,调用resize方法进行数组扩容。
1.4HashMap的get实现过程?
从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
底层的数据结构:HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。
1.5 JDK8中什么时候会转为红黑树?
如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)。

九、HashMap和LinkedHashMap的区别?

LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
LinkedHashMap是线程不安全的,HashMap不是线程安全的

十、ArrayList/LinkedList /HashMap初始大小,add后是多少?(jdk1.8)

类型

ArrayList

LinkedList

HashMap

默认

[]数据 0

0

16

扩容

1.5

0.75因子、2倍

最大

Integer.MAX_VALUE - 8

1 << 30

ArrayList: jdk1.8之后:
1.ArrayList初始集合不初始化数组容量的时候,默认值为0
2.添加元素后,扩容为10,之后每次扩容为原来的0.5倍
LinkedList :
是一个双向链表,无初始大小,无扩容机制,直接添加即可
HashMap:
HashMap 初始化大小是 16 ,扩容因子默认0.75(可以指定初始化大小,和扩容因子)
扩容机制.(当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍(*2)。

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

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

相关文章

【零基础】学python数据结构与算法笔记5

文章目录前言30.归并排序归并31.归并排序实现32.归并排序时间复杂度讨论33.NB三人组小结总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b站学习链接 30.归并排序归并 将两个箭头指向两个列表的首个元素&#xff0c;比较&#xff0c;哪个大就把它…

Java IO流 - 字符流的使用详细介绍

文章目录字符流的使用文件字符输入流创建字符输入流字符输入流读取文件字符输出流创建字符输出流字符输出流写入字符流的使用 字节流读取中文输出会存在什么问题&#xff1f; 会乱码。或者内存溢出。 读取中文输出&#xff0c;哪个流更合适&#xff0c;为什么&#xff1f; 字符…

MAX78000训练自己的神经网络模型

参考&#xff1a; The MAX78000 Microcontroller, Some Coffee, and Artificial Intelligence GitHub - MaximIntegratedAI/ai8x-training: Model Training for ADIs MAX78000 and MAX78002 AI Devices ai8x-synthesis/WSL2.md at develop MaximIntegratedAI/ai8x-synthesi…

移动金融管理系统设计与开发实训(课程设计报告)——基于Android+Django的银行系统部分功能设计与实现

阅读过程中若有不解和需要可私信&#xff0c;乐于解答 项目代码文档都保存着 基于AndroidDjango的银行系统部分功能开发与设计 摘要&#xff1a; 随着信息技术的快速发展以及经济的快速发展&#xff0c;金融界的信息化的进程也在不断推进&#xff0c;信息技术的不断成熟和人…

JavaWeb:EL表达式JSTL标签

1&#xff0c;EL表达式 1.1 概述 EL&#xff08;全称Expression Language&#xff09;表达式语言&#xff0c;用于简化JSP页面内的Java代码。 EL表达式的主要作用是 获取数据 。其实就是从域对象中获取数据&#xff0c;然后将数据展示在页面上。 而EL表达式的语法也比较简单…

HR软件七步帮助企业管理员工

对于中小企业&#xff08;SMB&#xff09;来说&#xff0c;员工就意味着一切。你的员工几乎掌握着企业的整体增长和发展&#xff0c;他们可以成就企业&#xff0c;但也能破坏企业的发展。为了提高员工效率&#xff0c;中小型企业需要出色的人力资源管理。员工只有在受到重视和培…

【Linux】Linux环境变量的理解

加油布鲁斯&#xff0c;你能行的&#xff01; 文章目录一、环境变量PATH中的系统默认搜索路径1.将程序安装到/usr/bin目录&#xff08;不带./运行自己写的程序&#xff09;2.将程序路径添加到PATH环境变量里面&#xff08;不带./运行自己写的程序&#xff09;二、环境变量的深…

PyTorch基础部分——毕设进行时

为了完成毕设准备开始学习PyTorch&#xff0c;第一步到蓝桥云课搜索实验项目&#xff0c;找到了“PyTorch入门与实战&#xff08;第二版&#xff09;”&#xff0c;开始边实验边学习&#xff08;本身有了一点点点点的相关基础了&#xff09;学习传送门&#xff1a;PyTorch基础入…

SQL WHERE 子句

WHERE 子句用于过滤记录。 SQL WHERE 子句 WHERE 子句用于提取那些满足指定条件的记录。 SQL WHERE 语法 SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明&#xff1a; column1, column2, ...&#xff1a;要选择的字段名称&#xff0c;可以为多个…

06SpringCloudAlibaba负载均衡服务调用-OpenFeign

目录 SpringCloud Feign 查看此博客&#xff1a;005SpringCloud--Feign&#xff1a;负载均衡(基于服务端)_gh_xiaohe的博客-CSDN博客 OpenFegin概述 OpenFeign是什么&#xff1a; OpenFegin能干什么 Feign和OpenFeign两者区别 OpenFeign使用步骤 服务消费者 接口注解 微…

TP相关知识

说明 该文章来源于徒弟lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明PHP中有一些内置类PHP反序列化问题绕过姿势&#xff1a;魔术方法&#xff08;反序列化如何利用&#xff09;CMS可能存在的部分逻辑问题$_REQUEST相关安全…

小游戏引擎选型参考指南

写在前面 前面写了几期有关于小游戏的文章&#xff0c;主要从小游戏开发、小游戏运营、小游戏变现等多个角度进行了较为粗略的介绍&#xff0c;很多同学表示对小游戏引擎部分很感兴趣&#xff0c;希望能够有一些更为深入的分析介绍。今天就对目前主流的小游戏引擎进行探讨。 …

Java 并发编程 (二)CountDownLatch和CyclicBarrier的使用

CountDownLatch和CyclicBarrier CountDownLatch 功能介绍 CountDownLatch 是一个同步功能的辅助类 线程计数不为0时呈wait状态如果为0则继续执行。通过await 和 countDown 两个方法来实现等待和继续运行。 作用&#xff1a;一个线程或多个线程等待另一个线程或多个线程完成后…

2003-2021年高铁列车信息

2003-2021年高铁列车信息 1、时间&#xff1a;2003-2021年 2、指标&#xff1a; 列车车次、出发站、出发站所属地级市、出发站所属省份、出发站类型、到达站、到达站所属地级市、到达站所属省份、到达站类型、车型、开车时间、到站时间、运行时间、里程 3、指标说明&#x…

58. 微调(fine-tuning)

前面的一些章节介绍了如何在只有6万张图像的Fashion-MNIST训练数据集上训练模型。 我们还描述了学术界当下使用最广泛的大规模图像数据集ImageNet&#xff0c;它有超过1000万的图像和1000类的物体。 然而&#xff0c;我们平常接触到的数据集的规模通常在这两者之间。 假如我们…

3、基于注解的IoC装配与依赖注入

一、XML开启注解支持 1、添加context名称空间 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&…

03SpringCloudAlibaba服务注册中心—Zookeeper

目录 注册中心Zookeeper 五步曲&#xff1a; zookeeper服务提供者 1、03-cloud-provider-payment-zookeeper-8004 2、pom.xml 3、改yum 4、主启动 5、业务类 测试1&#xff1a; 测试2&#xff1a; ​ 服务节点是临时节点还是持久节点 粗划分&#xff1a; 细划分&am…

南京晓庄Java期末知识点复习

南京晓庄Java期末知识点复习第一章 Java 语言概述第二章 Java 语法基础标识符基本数据类型**运算符****语句**数组和字符串命令行参数输入输出第三章 类五个基本概念类类的封装类的继承**抽象类**接口关键字常用的工具类第四章 Applet及其应用**Java程序的两种基本形式****Appl…

红队渗透靶场之prime1.0(超详细!)

靶场考察知识 Wordpress WordPress是一个免费的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;可以用来创建和管理网站或博客。它是由PHP语言和MySQL数据库构建的&#xff0c;并且拥有大量的插件和主题&#xff0c;可以让您轻松地自定义网站的外观和功能 Wpscan扫…

引用量超6000的语义分割经典论文DeepLabv3解读

分享语义分割领域的一篇经典论文DeepLabv3&#xff0c;由谷歌发表于CVPR2017。开源代码地址&#xff1a; Tensorflow版本&#xff1a;https://github.com/tensorflow/models/tree/master/research/deeplabPytorch版本&#xff1a;https://github.com/open-mmlab/mmsegmentatio…