第二章 集合

news2024/10/7 19:21:19

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
    • `说说HashMap 和 HashSet 区别?`
    • `说下HashMap 和 Hashtable 的区别?`
    • `为什么HashTable 的key和value 不能为 null 值 ?`
    • `说说LinkedHashMap 的实现原理?`
  • 一、集合容器概述
    • `1、 什么是集合 ,集合的特点 ?`
    • `2、集合和数组的区别 ?`
    • `3、使用集合框架的好处 ?`
    • `4、说说Java中常用的容器有哪些?也就是常用的集合类有哪些?`
    • `5、List,Set,Map三者的区别 ?`
    • `6、集合框架底层数据结构`
    • `7、哪些集合类是线程安全的?`
    • `8、 Java集合的快速失败机制 “fail-fast”?`
    • `9、怎么确保一个集合不能被修改?`
  • List
    • `10 、 List 和 Set 的区别 ?`
    • `11 、 迭代器 Iterator 是什么?`
    • `12、Iterator 怎么使用?有什么特点?`


前言

说说HashMap 和 HashSet 区别?

HashSet 底层就是基于 HashMap 实现的。两者主要区别:

在这里插入图片描述

说下HashMap 和 Hashtable 的区别?

线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!)

效率:因为Hashtable加了synchronized锁。所以HashMap 要比 Hashtable 效率高一点。另外,Hashtable 基本被淘汰,不要在代码中使用它

对 Null key 和 Null value 的支持: HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有 null 键和 null 值,否则会抛出 NullPointerException。

初始容量大小和每次扩充容量大小的不同 :
① 创建时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。
② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小。

为什么HashTable 的key和value 不能为 null 值 ?

key V 不能为 null 主要是为了线程安全所考虑
当通过get(k)获取对应的value时,如果获取到的是null时,无法判断,它是put(k,v)的时候value为null,还是这个key从来没有做过映射。假如线程1调用m.contains(key)返回true,然后在调用m.get(key),这时的m可能已经不同了。因为线程2可能在线程1调用m.contains(key)时,删除了key节点,这样就会导致线程1得到的结果不明确,产生多线程安全问题,因此,Hashmap和ConcurrentHashMap的key和value不能为null。

而HashMap允许key和value为null,在单线程时,调用contains()和get()不会出现问题,但是多线程下,就是线程不安全的。如果要保证线程安全,应该使用ConcurrentHashMap 。

说说LinkedHashMap 的实现原理?

LinkedHashMap也是基于HashMap 实现的,不同的是它定义了一个Entry header,这个header不是放在Table里,它是额外独立出来的。LinkedHashMap通过继承hashMap 中的Entry,并添加两个属性Entrybefore,after和 header结合起来组成一个双向链表,来实现按插入顺序或访问顺序排序。

LinkedHashMap定义了排序模式 accessOrder,该属性为boolean型变量,对于访问顺序,为true,对于插入顺序,则为false。一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序。

说一下HashMap 和 TreeMap 区别?


一、集合容器概述

1、 什么是集合 ,集合的特点 ?

集合就是一个放数据的容器,准确的说是放数据对象引用的容器
集合类存放的都是对象的引用,而不是对象的本身
集合类型主要有3种:set(集)、list(列表)和map(映射)。

集合的特点主要有如下两点:
集合用于存储对象的容器,对象是用来封装数据,对象多了也需要存储集中式管理。
和数组对比对象的大小不确定。因为集合是可变长度的。数组需要提前定义大小

2、集合和数组的区别 ?

数组是固定长度的;集合可变长度的。
数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

3、使用集合框架的好处 ?

容量自增长;
提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
可以方便地扩展或改写集合,提高代码复用性和可操作性。

4、说说Java中常用的容器有哪些?也就是常用的集合类有哪些?

.

Collection接口 和 Map接口 是所有集合框架的父接口:

Collection接口的子接口包括:Set接口和List接口
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等

5、List,Set,Map三者的区别 ?

在这里插入图片描述

Java 容器分为 Collection 和 Map 两大类,Collection集合的子接口有Set、List、Queue三种子接
口。我们比较常用的是Set、List,Map接口不是collection的子接口。

Collection集合主要有List和Set两大接口
List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多
个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一
个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及TreeSet。

Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重
复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应
的值对象。
Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap

6、集合框架底层数据结构

Collection

List
Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表*

Set
HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)

Map
HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是
主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较
大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散
列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加
了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的
操作,实现了访问顺序相关逻辑。

HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突
而存在的
TreeMap: 红黑树(自平衡的排序二叉树)

7、哪些集合类是线程安全的?

Vector:就比Arraylist多了个 synchronized (线程安全),因为效率较低,现在已经不太建议使
用。

hashTable:就比hashMap多了个synchronized (线程安全),不建议使用。

ConcurrentHashMap:是Java5中支持高并发、高吞吐量的线程安全HashMap实现。它由Segment数组结构和HashEntry数组结构组成。Segment数组在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键-值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构;一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素;每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。(推荐使用)

8、 Java集合的快速失败机制 “fail-fast”?

是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生
fail-fast 机制。

例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时
候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这
个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。
原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集
合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()
遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍
历;否则抛出异常,终止遍历。

解决办法:
在遍历过程中,所有涉及到改变modCount值得地方全部加上synchronized。
使用CopyOnWriteArrayList来替换ArrayList

9、怎么确保一个集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变
集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

示例代码如下:

List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections. unmodifiableCollection(list);
clist. add("y"); // 运行时此行报错
System. out. println(list. size());

List

10 、 List 和 Set 的区别 ?

List:有序集合(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多
个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。

Set:无序集合(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一
个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及TreeSet。

11 、 迭代器 Iterator 是什么?

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

public interface Collection<E> extends Iterable<E>{
	// Query Operations
}

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

Iterator 使用代码如下:
先调用iterator 方法获取到 迭代器,然会判断是否有元素或者下一个元素,再调用 next 获取元素
	List<String> list = new ArrayList<>();
	Iterator<String> it = list. iterator();
	while(it. hasNext()){
		String obj = it. next();
		System. out. println(obj);
	}

特点
Iterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改
的时候,就会抛出 ConcurrentModificationException 异常。

  1. 如何边遍历边移除 Collection 中的元素?
  2. Iterator 和 ListIterator 有什么区别?
  3. 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List遍历的最佳实践是什么?
  4. 如何实现数组和 List 之间的转换?
    8.comparable和comparator的区别?
    9.Collection和Collections有什么区别?
    10.说一下PriorityQueue?

ArrayList

  1. Array 和 ArrayList 有何区别?
  2. 如何实现 Array 和 List 之间的转换?
    2.详细说说 Arraylist 和 LinkedList的区别?
  3. 说一下 ArrayList 的优缺点
    3.ArrayList实现 RandomAccess接口有何作用?
    5.说说ArrayList 的扩容机制?
    6.Array和ArrayList有何区别?
    4.说一说Vector 和 ArrayList 的区别?
  4. 插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述
  5. 多线程场景下如何使用 ArrayList?
  6. 为什么 ArrayList 的 elementData 加上 transient 修饰?

Set接口
24. 说一下 HashSet 的实现原理?
25. HashSet如何检查重复?HashSet是如何保证数据不可重复的?
26. HashSet与HashMap的区别
linkedllist和linkledHashSet的区别
28. 什么是链表

三、Map接口
27. 什么是Hash算法
20.HashMap怎么计算 key 的 hash 值的?
35. 能否使用任何类作为 Map 的 key?
27.为什么HashMap中String、Integer这样的包装类适合作为Key?
37. 如果使用Object作为HashMap的Key,应该怎么办呢?
34. HashMap是怎么解决哈希冲突的?
38. HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标?
12.HashMap的实现原理/底层数据结构?
13.HashMap 的长度为什么是 2 的幂次方?
14.说说HashMap的put方法执行流程?
15.说说HashMap的get方法执行流程?
33. HashMap的扩容操作是怎么实现的?
16.说说HashMap的resize方法执行过程
31. 什么是红黑树
17.HashMap什么时候会树化?
18.HashMap底层为什么选择红黑树而不用其他树,比如二叉查找树?
19.HashMap扩容(加载)因子为何默认是 0.75f?
39. HashMap 的长度为什么是2的幂次方
22.HashMap多线程操作导致死循环问题知道吗?

28.说一下Queue 与 Deque 的区别?
29.说说ArrayDeque 与 LinkedList 的区别?
30.说一下 HashSet、LinkedHashSet 和 TreeSet 三者的异同?

  1. HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现

  2. 什么是TreeMap 简介

  3. 如何决定使用 HashMap 还是 TreeMap?

  4. HashMap 和 ConcurrentHashMap 的区别

  5. ConcurrentHashMap 和 Hashtable 的区别?

  6. ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?
    四、辅助工具类

  7. comparable 和 comparator的区别?

  8. Collection 和 Collections 有什么区别?

  9. TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?

  10. Collection 和 Collections 有什么区别?

  11. TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?

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

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

相关文章

极客之眼 Nmap:窥探世界的第一步

文章目录 参考描述Nmap极客之眼Nmap 与黑客的缠绵往事CIDRNmap 的获取检测 Nmap 是否已经安装下载并安装 NmapLinuxMacOS 与 WIndows 区域扫描基本扫描扫描结果解析域名解析服务 区域扫描CIDR列表扫描正向 DNS 查询与反向 DNS 查询列表扫描拒绝反向 DNS 查询 主机名与 CIDRIP 地…

vs2019+vtk开发环境搭建

1.安装vs2019 Enterprise&#xff0c;visual assist x&#xff0c;cmake Microsoft Visual Studio Enterprise 2019 sn: BF8Y8-GN2QH-T84XB-QVY3B-RC4DF 2.下载vtkhttps://www.vtk.org/files/release/9.2/VTK-9.2.6.tar.gz 3.cmake编译配置选中Example&#xff0c;可编译官方…

【Java】『蓝桥杯』10道编程题及答案(五)

系列文章 【Java】『蓝桥杯』10道编程题及答案&#xff08;一&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案&#xff08;二&#xff09; 本文链接&#xff1a;https://blog.csdn.net/y…

深度学习之神经网络量化理解

深度学习系列文章目录 文章目录 深度学习系列文章目录前言一、什么是量化量化现状GoogleTensorRTTVM量化基本知识基于线性量化的对称量化和非对称量化 总结 前言 刚开始接触神经网络&#xff0c;对量化是2年前那会&#xff0c;用NCNN和TVM在树莓派上部署一个简单的SSD网络。那…

知识点滴 - 世界化工企业百强

2022年7月25日&#xff0c;美国《化学与工程新闻》&#xff08;C&EN&#xff09;发布2022年全球化工企业50强名单。 2022-09-21日附近&#xff0c;国际石化市场信息服务商安迅思ICIS发布了最新世界化工企业100强排行榜&#xff08;Top 100 Chemical Companies&#xff09;&…

基于微信小程序的垃圾分类系统的研究与实现(附源码和教程)

1. 简介 本文介绍的事基于微信小程序的垃圾分类系统&#xff0c;主要实现的功能有登录、注册、垃圾分类查询、垃圾预约回收、垃圾分类功能。 2.系统设计与实现 本章节是论文的重点&#xff0c;基于上一章介绍的总体设计框架的搭建&#xff0c;详细对小程序的页面布局、流程设…

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址&#xff1a;http://arxiv.org/abs/2112.01527 项目地址&#xff1a;https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成&#xff1a; 主干特征提取器&#xff…

GPT在医疗健康领域:应用、价值与展望

目录 发展背景 应用场景 价值分析 未来发展趋势 发展痛点 市场规模预测 结论 全文精要提炼&#xff1a; 作者&#xff1a;ChatgptMidjourneyFOTORXmind 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;在各行各业的应用越来越广泛&#xff0c;尤其…

unity NGUI使用方法

基本用法 很多基本模块比如按钮、slider等都能从Prefab中直接拖拽到场景中实现&#xff0c;但都需要有一个Collider&#xff08;Prefab已经自带&#xff09; 因为不仅是UI&#xff0c;所有带有Collider的游戏物体都能接收到OnClick&#xff0c; OnPress这样的事件——前提是需…

sed编辑器基础命令

shell脚本编程系列 学习sed编辑器 sed编辑器被称作流编辑器&#xff08;stream editor&#xff09;,与普通的交互式文本编辑器不同&#xff0c;在交互式文本编辑器可以用键盘命令交互式插入、删除或替换文本数据。流编辑器则是根据事先设计好的一组规则编辑数据流。 sed编辑器…

人脸检测--传统方法

人脸检测与识别综述 人脸检测与识别是计算机视觉和生物识别领域中最受关注的研究内容。 如何从包含人脸内容的图像、视频等多媒体数据中&#xff0c;找到人脸&#xff0c;并对其身份进行判定&#xff0c;是人脸检测与识别中的主要问题。 应用场景 - 安全监控 - 访问控制 …

【Java校招面试】基础知识(一)——Java常用类库

目录 前言一、编程时常用的Java类库1. 异常捕获模块(try-catch-finally, Error, Exception)2. boolean / short / int / long / float / double / char / byte及其对应的引用类型 二、面试时常考的Java类库1. 一切类型的父类Object及其equals / hashCode / toString方法2. 常用…

anaconda安装pytorch的流程

1.查看本机支持的CUDA版本 cmd:nvidia-smi 2.安装本机支持的CUDA版本 CUDA安装教程 GPU, CUDA,cuDNN三者的关系总结 3.使用anaconda创建虚拟环境 3.在anaconda对应的虚拟环境中安装CUDA对应的pytorch版本 anaconda安装pytorch&#xff08;anaconda3&#xff0c;Windows10&am…

idea使用 ( 二 ) 创建java项目

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…

二叉搜索树【Java】

文章目录 二叉搜索树的性质二叉搜索树的操作遍历查找插入删除 二叉搜索树又称为二叉排序树&#xff0c;是一种具有一定性质的特殊的二叉树&#xff1b; 二叉搜索树的性质 若它的左子树不为空&#xff0c;则左子树上结点的值均小于根节点的值&#xff1b; 若它的右子树不为空&a…

08 Kubernetes应用配置管理

课件 在 Kubernetes 中&#xff0c;secret 是一种用于存储敏感信息的对象。Kubernetes 支持以下三种类型的 secret&#xff1a; Opaque&#xff1a;这是默认的 secret 类型&#xff0c;可以用于存储任何类型的数据&#xff0c;包括字符串、二进制数据等。 Service Account&…

【P2】Jmeter 线程组的并行与串行

一、串行与并行规则 &#xff08;1&#xff09;、测试计划中的执行顺序遵循&#xff1a;setUp 线程组 -> 线程组 -> tearDown 线程组 &#xff08;2&#xff09;、如果将测试计划中的独立运行每个线程组勾选上&#xff0c;则多个线程组串行执行&#xff0c;否则并发执行…

吴恩达 Chatgpt prompt 工程--5.Transforming

探索如何将大型语言模型用于文本转换任务&#xff0c;如语言翻译、拼写和语法检查、音调调整和格式转换。 Setup import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopenai.api_key os.getenv(OPE…

2.6 浮点运算方法和浮点运算器

学习目标&#xff1a; 以下是一些具体的学习目标&#xff1a; 理解浮点数的基本概念和表示方法&#xff0c;包括符号位、指数和尾数。学习浮点数的运算规则和舍入规则&#xff0c;包括加、减、乘、除、开方等。了解浮点数的常见问题和误差&#xff0c;例如舍入误差、溢出、下…

Unity一般打包流程

Unity一般打包流程 通常打包流程主要是通过 Building setting来选择需要打包的场景后出包到指定文件夹位置&#xff0c;也可以采用 [MenuItem("MyMenu/Do Something")]中使用static函数来选择打包路径和打包方式——需要将该脚本放置在 Editor文件夹下 [MenuItem(&…