Java集合-Java集合基础

news2025/4/3 12:46:42

目录

讲一讲Java集合吧

集合的使用

为什么要使用集合?

如何选用集合?

Collection

Collection与Collections的区别是什么?

Collections.sort和Arrays.sort的实现原理

为何Collection不从Cloneable和Serializable接口继承?

线程安全集合类

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

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

iterator

迭代器 Iterator 是什么?怎么用,有什么特点?

Iterator 和 ListIterator 有什么区别?

Enumeration和Iterator接口的区别?

快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?


讲一讲Java集合吧

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

对于Collection接口,下面又有三个主要的子接口 : List,Set,Queue

List主要实现类 :

  • ArrayList: 底层是Object[] 数组
  • LinkedList: 底层是 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
  • Vector:底层是Object[] 数组
  • Stack : 继承自Vector

Set主要实现类 :

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

Queue接口主要实现类 :

  • PriorityQueue: Object[] 数组来实现二叉堆--->完全二叉树
  • ArrayQueue: Object[] 数组 + 双指针

对于Map接口,下面又有主要的实现类有 :HashMap,LinkedHashMap,HashTable,TreeMap

  • HashMap: JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间
  • LinkedHashMap: LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
  • Hashtable: 数组+链表组成的,数组是 Hashtable 的主体,链表则是主要为了解决哈希冲突而存在的
  • TreeMap: 底层是由红黑树实现的,保证有序

List,Set,Queue,Map接口的特点

  • List: 存储的元素是有序的、可重复的。
  • Set: 存储的元素是无序的、不可重复的。
  • Queue: 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
  • Map: 用于存储键值对(key-val形式)的元素, 根据key获取val,key是无序的,不可重复,val是无序的,可重复

集合的使用

为什么要使用集合?

先说一下使用数组的缺点 :

  1. 一旦初始化以后,其长度就不可修改.
  2. 数组中提供的方法非常限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
  3. 数组只能存放一组类型相同的元素,单一.实际开发中存储的数据类型可能是多种多样的
  4. 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
  5. 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
  6. 数组不能存放键值对

为啥使用集合 ?

集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据,还可以提供相应的方法来提高操作容器的效率

如何选用集合?

主要是根据集合的特点来进行选择

  • 如果你想要存放键值对,根据key获取到val,那么就可以选用Map接口下的集合
    • 需要排序,选择TreeMap
    • 不需要排序就选择HashMap
    • 想要保证线程安全就选用ConcurrentHashMap
  • 否则就是指需要存储单个元素,那么可以选用Collection接口下的集合
    • 需要保证元素唯一,需要排序选择TreeSet , 否则可以选择HashSet
    • 需要按照某种排队规则可以选用Queue接口下的集合如PriorityQueue,ArrayDeque
    • 只需存放单一元素,有序,可重复 就可以选择List接口下的集合,如果需要保证线程安全,可以使用vector,SynchronizedList(使用Collections.synchronizedList(list); 将list包装成SynchronizedList),copyOnWriteList, 否则可以选择比如 ArrayList,LinkedList ,增删多:linkedList,查询多 : ArrayList

Collection

Collection与Collections的区别是什么?

collection 是一个接口 主要的接口如 List, Set, Queue,这三个主要的接口有实现类来帮助我们操作元素.

collections是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序(sort)、搜索、反转(reverse)、拷贝(copy)以及线程安全等各种操作

Collections 工具类常用方法:

  • 排序
void reverse(List list)//反转
void shuffle(List list)//随机排序
void sort(List list)//按自然排序的升序排序
void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑
void swap(List list, int i , int j)//交换两个索引位置的元素
void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面
  • 查找,替换操作
int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素
int frequency(Collection c, Object o)//统计元素出现次数
int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target)
boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素
  • 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合)

Collections 提供了多个synchronizedXxx()方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。

我们知道 HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap 都是线程不安全的。Collections 提供了多个静态方法可以把他们包装成线程同步的集合。

synchronizedCollection(Collection<T>  c) //返回指定 collection 支持的同步(线程安全的)collection。
synchronizedList(List<T> list)//返回指定列表支持的同步(线程安全的)List。
synchronizedMap(Map<K,V> m) //返回由指定映射支持的同步(线程安全的)Map。
synchronizedSet(Set<T> s) //返回指定 set 支持的同步(线程安全的)set。

Collections.sort和Arrays.sort的实现原理


为何Collection不从Cloneable和Serializable接口继承?

Collection是集合的根接口,可以存储一组对象,因为对象的存储多种多样.所以如何存储对象是由接口的具体实现来决定的,比如,比如 list允许重复而set不允许重复, 对于克隆和序列化而言,只对具体的实体和对象才有意义,不能把一个接口,抽象类克隆,序列化甚至反序列化. 所以具体的Collection实现类 是否可以克隆,序列化由其自身来决定,不能由超类强行赋予.

举一个反例吧 : 如果Collection继承了clone和serializable,那么它的所有实现类都会实现这两个接口,但是如果某个实现类不需要被克隆,甚至不允许序列化,那么就与collection矛盾了

线程安全集合类

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

  1. String
  2. Integer
  3. StringBuffer
  4. Random
  5. Vector
  6. Hashtable
  7. java.util.concurrent 包下的类

剩下的不是线程安全的

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

iterator

迭代器 Iterator 是什么?怎么用,有什么特点?

Iterator 和 ListIterator 有什么区别?

  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历).(ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以)
  • ListIterator有add()方法,可以向List中添加对象,而Iterator不可以;
  • ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能;
  • 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现,Iterator仅能遍历,不能修改。

Enumeration和Iterator接口的区别?

快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

fail-fast 和fail-safe 是在不允许在遍历集合的时候去修改的两种应对措施,因为在遍历的时候可能会有其他线程来修改,这时fail-fast是立刻抛出异常,而fail-safe则是会有应对策略,比如牺牲一致性来保证整个遍历的运行完成

  • ArrayList是fail-fast的典型代表,当在遍历的时候有其他线程修改,则立刻抛出异常ConcurrentModificationException (遍历的同时不能修改)
    • 原理 : 迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历.
  • copyOnWirteArrayList是fail-safe的典型代表, 当在遍历的时候有其他线程修改 , 会有应对策略,比如牺牲一致性让整个遍历运行完成 (遍历的同时可以修改)
    • 原理 : fail-safe集合中的所有对集合的修改都是先复制一份副本,然后在副本集合中进行修改,并不是直接对原集合进行修改

参考:

博客园 一些博客

csdn一些博客

https://www.cnblogs.com/williamjie/p/11158588.html

Javaguide : Java集合常见面试题总结(下) | JavaGuide(Java面试+学习指南)

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

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

相关文章

面向开发人员的 ChatGPT 提示语教程中文版

面向开发人员的 ChatGPT 提示语教程中文版 1. 指南1-1. 提示的指南1-2. 配置1-3. 提示语原则原则 1: 写出清晰而具体的指示技巧 1: 使用分隔符来清楚地表明输入的不同部分技巧 2: 要求提供结构化的输出技巧 3: 要求模型检查条件是否得到满足技巧 4: "少许样本"提示 原…

新魔百盒M304A_增强版2+16G_S905系列_UWE5621DS_卡刷/线刷固件包-当贝桌面

新魔百盒M304A_增强版216G_S905系列_UWE5621DS_卡刷&#xff0f;线刷固件包-当贝桌面 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内…

第三十九章 Unity 图像 (Image) UI

本章节&#xff0c;我们介绍一下“Image”UI元素&#xff0c;首先我们创建一个新场景“SampleScene2.unity”。然后我们点击菜单栏“GameObjec”->“UI”->“Image”&#xff0c;如下所示 我们将其放置到了中间位置&#xff0c;检视面板中的参数如下 默认情况下&#xf…

python基础-内置高阶函数map/reduce/filter函数的使用

一、map Python内置函数&#xff0c;用法及说明如下&#xff1a; class map(object):"""map(func, *iterables) --> map objectMake an iterator that computes the function using arguments fromeach of the iterables. Stops when the shortest iterab…

工控机All In One——篇1,pve安装(必读)

工控机All In One——篇1&#xff0c;pve安装 1、背景 满足家庭一机多用&#xff0c;同时满足软路由&#xff08;主旁路由&#xff09;、远程控制、NAS&#xff08;个人存储&#xff09;等功能 2、准备 硬件 1、J4125工控机 2、一个usb分线器 3、鼠标键盘 4、带HDMI或VGA接…

2022 年全国硕士研究生入学统一考试英语(一)试题

2022年全国硕士研究生入学统一考试英语&#xff08;一&#xff09;试题 SectionⅠUse of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) The idea that plants have…

论文解析-基于 Unity3D 游戏人工智能的研究与应用

1.重写 AgentAction 方法 1.1 重写 AgentAction 方法 这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释&#xff1a; ①public override void AgentAction(float[] vectorAction) 这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它接受…

【力扣-225】用队列实现栈

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 数据结构 &#x1f606;今日小tips : 有些家里可能会有两个同样名字的 WiFi&#xff0c;而其中一个名字的最后有个 5G&#xff0c;那么&#xff0c;这个 5G 和常说的 5G 信号是一回事吗&#xff1f;并不是&#xff0c;无线路…

研报精选230507

目录 【行业230507山西证券】煤炭行业周报&#xff1a;港口煤价趋稳&#xff0c;静待经济信心恢复与迎峰度夏双至 【行业230507山西证券】农业行业周报&#xff1a;建议逢低布局经营稳健和低PB的养殖股 【行业230507头豹研究院】2023年中国无源物联网行业词条报告 【个股230507…

运算放大器 - 笔记 02 -恒流源

恒流源 / 电流源 一、方案一二、方案二三、方案三四、方案四 前言&#xff1a;最近在学习运放&#xff0c;三极管&#xff0c;二极管&#xff0c;场效应管等器件的组合电路。捡起了以前的模电知识&#xff0c;写下笔记&#xff0c;以防再度忘记。 本文使用Multisim仿真软件进行…

MySQL---约束(主键约束,自增长约束,非空约束,唯一约束,默认约束、零填充约束)

1. 主键约束 MySQL主键约束是一个列或者多个列的组合&#xff0c;其值能唯一地标识表中的每一行,方便在RDBMS中 尽快的找到某一行。 主键约束相当于 唯一约束 非空约束 的组合&#xff0c;主键约束列不允许重复&#xff0c;也不允许出现空值。 每个表最多只允许一个主键 …

Linux 挂载磁盘教程,Linux系统分区及磁盘挂载

Linux 挂载磁盘教程&#xff0c;Linux系统分区及磁盘挂载 说明&#xff1a;以下教程是以未安装任何程序及无数据的数据盘基础上编写 如已安装程序或数据盘含有数据切勿使用此教程 本文中的磁盘/dev/sdb为笔者测试服务器上的命名&#xff0c;在您的服务器中可能是/dev/xdb、/dev…

【C++入门】引用

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

npm私有库(nexus)-安装nexus

注&#xff1a;安装 nexus(需要先安装 Java jdk) 1、上传软件包到服务器并解压 链接&#xff1a;https://pan.baidu.com/s/1NgpIbTaH4xV-HceyTUuxVA 提取码&#xff1a;vs51 tar -xvf nexus-3.19.1-01-unix.tar.gz 2、修改默认端口&#xff0c;并开启端口 firewall-cmd --pe…

windows和Linux系统配置静态ip方法

为什么要配置静态IP 配置静态IP地址可以确保设备始终具有相同的IP地址&#xff0c;这对于需要远程访问、网络管理和安全性很重要。与动态IP地址不同&#xff0c;静态IP地址不会随着时间而改变&#xff0c;因此它允许管理员轻松地识别特定设备并在网络上进行更精细的控制。另外…

02- 目标检测基础知识及优化思路汇总 (目标检测)

要点&#xff1a; 参考综述&#xff1a;深度学习目标检测最全综述 - 爱码网参考表达&#xff1a;https://www.cnblogs.com/xjxy/p/13588772.html 一 发展历程 分类网络是目标检测的基础&#xff0c;必须熟练掌握。 1.1 传统算法 V.J Detector 19年前&#xff0c;P. Viola 和 …

操作系统——文件管理

0.关注博主有更多知识 操作系统入门知识合集 目录 9.1文件系统概念 思考题&#xff1a; 9.2文件的物理结构 思考题&#xff1a; 9.3文件存储和目录 9.1文件系统概念 文件的定义&#xff1a; 文件是计算机信息存取的一种重要组织形式&#xff0c;文件由若干信息项有序构…

多项式时间验证与NP完全性

多项式时间的验证 对语言的“验证”算法&#xff1a; 验证与求解花费时间一样长&#xff1a;最短路径问题的一个实例的证书很容易能在多项式时间内被验证。实际上最短路径问题本身可以在多项式时间内求解。因此&#xff0c;根据指定的证书来验证与从头开始求解这个问题的时间…

Docker安装常用软件-Nacos

一、单机部署 官方网站&#xff1a;什么是 Nacos 1、下载最新nacos镜像 docker pull nacos/nacos-server 2、新建映射文件夹 --nacos/conf/application.properties --nacos/logs --nacos/sql ①application文件 # # Copyright 1999-2021 Alibaba Group Holding Ltd. #…

Ajax -- from表单与模板引擎

1. from表单的基本使用 1.1 什么是表单 表单在网页中主要负责数据采集功能。HTML中的标签&#xff0c;就是用于采集用户输入的信息&#xff0c;并通过标签的提交操作&#xff0c;把采集到的信息提交到服务器端进行处理。 1.2 表单的组成部分 表单由三个基本部分组成&#…