【Java】欸...?我学集合框架?真的假的?

news2024/11/17 11:48:06

【Java】欸…?我学集合框架?真的假的?

Java集合框架

概述

Java集合框架主要由以下几个部分组成:

  1. 接口(Interfaces):定义了集合的基本操作,如添加、删除、遍历等。
  2. 实现(Implementations):提供了接口的具体实现,例如ArrayListHashMap等。
  3. 算法(Algorithms):如CollectionsArrays类中定义的算法,用于操作集合元素。

为什么Java集合框架如此重要?

  • 简化数据管理:集合框架提供了统一的方式来处理不同类型的数据集合。
  • 提高性能:不同的集合类针对不同的使用场景进行了优化,可以提高程序的性能。
  • 增强代码的可读性:使用集合框架可以使代码更加简洁和易于理解。
  • 促进代码重用:集合框架的通用性使得编写的代码更容易被重用。

Collection接口

Collection接口概述

Collection 接口是Java集合框架中最基本的接口,它是所有单列集合的根接口。Collection 接口定义了适用于所有单列集合的操作,如添加、删除、遍历元素等。它提供了一系列通用的方法,使得对集合的操作变得统一和方便。

创建方式:

Collection<E> 对象名 = new 实现类对象<E>()

Collection接口的主要方法

以下是Collection接口中定义的一些核心方法:

  • boolean add(E e): 向集合中添加一个元素。
  • boolean remove(Object o): 从集合中移除一个指定的元素。
  • boolean contains(Object o): 检查集合是否包含指定的元素。
  • int size(): 返回集合中的元素数量。
  • boolean isEmpty(): 判断集合是否为空。
  • boolean containsAll(Collection<?> c): 检查集合是否包含另一个集合的所有元素。
  • boolean addAll(Collection<? extends E> c): 将指定集合的所有元素添加到当前集合中。
  • boolean removeAll(Collection<?> c): 从当前集合中移除指定集合中的所有元素。
  • boolean retainAll(Collection<?> c): 仅保留当前集合和指定集合共有的元素。
  • void clear(): 清空集合中的所有元素。
  • Iterator<E> iterator(): 返回一个迭代器,用于遍历集合中的元素。

迭代器

迭代器(Iterator)

迭代器是一种设计模式,用于顺序访问集合中的元素。在Java集合框架中,迭代器提供了一种统一的方法来遍历集合中的元素,而不需要了解集合的具体实现细节。Iterator接口定义在java.util包中,并且是java.lang.Iterable接口的一部分。

Iterator接口的主要方法
  • boolean hasNext(): 返回是否还有下一个元素可以迭代。
  • E next(): 返回迭代的下一个元素。
  • void remove(): 从集合中移除当前迭代的元素。
迭代器的使用

迭代器的使用通常如下:

复制Collection<E> collection = ...; // 某个集合实例
Iterator<E> iterator = collection.iterator();
while (iterator.hasNext()) {
    E element = iterator.next();
    // 处理元素
}

并发修改异常(ConcurrentModificationException)

在Java集合框架中,当一个集合在迭代过程中被修改(不是通过迭代器自身的remove方法),就会抛出ConcurrentModificationException异常。这个异常的目的是防止在迭代过程中集合结构被外部修改,这可能会导致不可预测的行为或违反迭代器的期望行为。

并发修改异常的常见场景
  • 在迭代过程中直接调用集合的addremove等修改方法。
  • 使用并发线程修改集合,而没有采取适当的同步措施。
避免并发修改异常的方法
  • 使用迭代器的remove方法来删除元素,该方法会告知迭代器集合已经被修改,从而避免异常。
  • 使用CopyOnWriteArrayList这样的并发集合,它们允许在迭代过程中进行修改,而不会引发异常。
  • 在多线程环境下,使用适当的同步机制,如synchronized块或ConcurrentHashMap等并发集合。

img

List接口

List接口

List接口是Collection接口的一个子接口,它是一个有序的集合,可以包含重复的元素。List接口提供了一些额外的方法,用于操作元素的顺序和插入点。

List接口的主要方法
  • void add(int index, E element): 在指定位置插入一个元素。
  • E get(int index): 返回指定位置的元素。
  • E set(int index, E element): 替换指定位置的元素。
  • E remove(int index): 移除指定位置的元素并返回被移除的元素。
  • int indexOf(Object o): 返回指定元素在列表中的第一次出现的位置。
  • int lastIndexOf(Object o): 返回指定元素在列表中的最后一次出现的位置。
  • ListIterator<E> listIterator(): 返回一个ListIterator(列表迭代器),允许对列表进行更复杂的操作。

ArrayList

ArrayList是基于数组实现的List接口的实现类。它允许对元素进行快速随机访问。

ArrayList的特点
  • 动态数组ArrayList内部使用一个数组来存储元素,可以根据需要动态调整大小。
  • 快速随机访问:通过索引访问元素非常快速。
  • 不是线程安全的ArrayList不是线程安全的,多线程环境下需要外部同步。
ArrayList的适用场景
  • 当需要快速访问列表中的元素时。
  • 当列表的大小变化不是非常频繁时。
ArrayList的常用方法
  • add(E e): 在列表末尾添加一个元素。
  • get(int index): 通过索引获取元素。
  • remove(int index): 移除指定索引处的元素。
ArrayList的使用示例
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
arrayList.add("C++");

String language = arrayList.get(1); // 获取索引为1的元素 "Python"
arrayList.remove(2); // 移除索引为2的元素 "C++"

LinkedList

LinkedList是基于链表实现的List接口的实现类,同时也是Queue接口的一个实现。

LinkedList的特点
  • 双向链表LinkedList内部使用双向链表来存储元素。
  • 插入和删除操作高效:在列表的头部、尾部或指定位置插入和删除元素非常高效。
  • 随机访问慢:由于链表的特性,随机访问元素较慢。
LinkedList的适用场景
  • 当需要频繁插入和删除元素时。
  • 当需要实现栈、队列或双端队列时。
LinkedList的常用方法
  • add(E e): 在列表末尾添加一个元素。
  • add(int index, E element): 在指定位置插入一个元素。
  • remove(int index): 移除指定位置的元素。
  • getFirst(): 获取列表的第一个元素。
  • getLast(): 获取列表的最后一个元素。
LinkedList的使用示例
List<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.add("Python");
linkedList.addFirst("C"); // 在列表头部添加元素

String firstLanguage = linkedList.getFirst(); // 获取第一个元素 "C"
linkedList.removeLast(); // 移除最后一个元素 "Python"

Vector

Vector是一个古老的List实现,与ArrayList类似,但它是同步的。

Vector的特点
  • 同步的动态数组Vector内部使用一个数组来存储元素,并且是线程安全的。
  • 性能较低:由于其线程安全性,Vector的性能通常低于ArrayList
  • 遗留类Vector是Java早期版本的一部分,现在已经不推荐使用。
Vector的适用场景
  • 在非常老的代码库中可能会遇到Vector,但在新的代码中应该避免使用。
Vector的常用方法

ArrayList类似,Vector提供了相同的方法,但由于其线程安全性,它还有一些额外的方法,如synchronized版本的迭代器。

Vector的使用示例
复制List<String> vector = new Vector<>();
vector.addElement("Java");
vector.addElement("Python");
vector.addElement("C++");

String language = vector.elementAt(1); // 获取索引为1的元素 "Python"
vector.removeElementAt(2); // 移除索引为2的元素 "C++"

Set接口

Set接口

Set接口是Java集合框架中Collection接口的一个子接口,它是一个不允许包含重复元素的集合。Set接口没有继承自List接口,因此它不保证元素的顺序,也不支持索引访问。

Set接口的主要方法
  • boolean add(E e): 添加一个元素,如果元素已存在,则返回false
  • boolean remove(Object o): 移除指定的元素。
  • boolean contains(Object o): 检查集合是否包含指定的元素。
  • Iterator<E> iterator(): 返回一个迭代器,用于遍历集合中的元素。

HashSet

HashSet是基于哈希表的Set实现,它不保证元素的顺序,并且允许空(null)元素。

HashSet的特点
  • 基于哈希表HashSet的实现依赖于HashMap,因此它提供了快速的查找速度。
  • 无序:元素没有特定的顺序。
  • 允许单个null元素HashSet可以包含一个null元素。
HashSet的适用场景
  • 当需要存储不重复的元素集合时。
  • 当元素的顺序不重要时。
HashSet的常用方法
  • add(E e): 添加元素。
  • remove(Object o): 移除元素。
  • contains(Object o): 检查集合是否包含元素。
HashSet的使用示例
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Cherry");

boolean containsBanana = hashSet.contains("Banana"); // 返回true
boolean removed = hashSet.remove("Apple"); // 返回true

TreeSet

TreeSet是基于红黑树的Set实现,它可以确保元素处于排序状态。

TreeSet的特点
  • 有序:所有的元素都会按照自然顺序或构造时提供的比较器进行排序。
  • 不允许null元素:与HashSet不同,TreeSet不允许包含null元素。
TreeSet的适用场景
  • 当需要有序的元素集合时。
  • 当需要维护元素的排序状态时。
TreeSet的常用方法
  • add(E e): 添加元素到排序后的集合中。
  • first(): 返回第一个(最小)元素。
  • last(): 返回最后一个(最大)元素。
TreeSet的使用示例
Set<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Cherry");

String firstFruit = treeSet.first(); // 返回"Apple"
String lastFruit = treeSet.last(); // 返回"Cherry"

LinkedHashSet

LinkedHashSet类似于HashSet,但它维护了元素的插入顺序。

LinkedHashSet的特点
  • 有序:元素按照插入顺序进行排序。
  • 性能:通常比HashSet慢,因为需要维护插入顺序。
LinkedHashSet的适用场景
  • 当需要存储不重复的元素集合,并且需要保持元素的插入顺序时。
LinkedHashSet的常用方法

HashSet相同。

LinkedHashSet的使用示例
复制Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Cherry");

// 遍历将按照添加的顺序:Apple, Banana, Cherry
for (String fruit : linkedHashSet) {
    System.out.println(fruit);
}

Map接口

img

Map接口

Map接口是Java集合框架的一部分,它存储的是键值对(key-value pairs),其中每个键(key)映射到一个值(value)。Map接口不保证元素的顺序,并且不允许键重复。

Map接口的主要方法
  • V put(K key, V value): 将指定的值与此映射中的指定键关联。
  • V get(Object key): 返回指定键所映射的值。
  • V remove(Object key): 移除指定键的映射关系并返回其值。
  • int size(): 返回映射中键值对的数量。
  • boolean isEmpty(): 判断映射是否为空。
  • Set<K> keySet(): 返回映射中包含的键的Set视图。
  • Collection<V> values(): 返回映射中包含的值的Collection视图。
  • Set<Map.Entry<K, V>> entrySet(): 返回映射中包含的键值对的Set视图。

HashMap

HashMap是基于哈希表的Map实现,它允许空键和空值。

HashMap的特点
  • 基于哈希表HashMap使用键对象的hashCode()值来存储和检索键值对。
  • 无序HashMap不保证映射的顺序。
  • 允许空键和空值:可以有一个或多个空键和空值。
HashMap的适用场景
  • 当需要快速查找键值对时。
  • 当元素的顺序不重要时。
HashMap的常用方法
  • put(K key, V value): 添加或更新键值对。
  • get(Object key): 根据键获取值。
  • remove(Object key): 根据键移除键值对。
  • keySet(): 获取所有键的集合。
  • values(): 获取所有值的集合。
  • entrySet(): 获取所有键值对的集合。
HashMap的使用示例
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 1);
hashMap.put("Banana", 2);

Integer appleCount = hashMap.get("Apple"); // 获取键"Apple"的值,返回1
hashMap.remove("Banana"); // 移除键"Banana"的键值对

TreeMap

TreeMap是基于红黑树的Map实现,它可以确保键的排序。

TreeMap的特点
  • 有序:所有的键都会根据其自然顺序或构造时提供的比较器进行排序。
  • 不允许空键TreeMap不允许空键,但可以有多个空值。
TreeMap的适用场景
  • 当需要有序的键值对映射时。
  • 当需要维护键的排序状态时。
TreeMap的常用方法
  • put(K key, V value): 添加或更新键值对。
  • firstKey(): 返回第一个(最小)键。
  • lastKey(): 返回最后一个(最大)键。
  • descendingKeySet(): 返回按降序排列的键集合。
TreeMap的使用示例
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Apple", 1);
treeMap.put("Banana", 2);

String firstFruit = treeMap.firstKey(); // 获取第一个键,返回"Apple"
String lastFruit = treeMap.lastKey(); // 获取最后一个键,返回"Banana"

LinkedHashMap

LinkedHashMap类似于HashMap,但它维护了插入顺序或者访问顺序。

LinkedHashMap的特点
  • 有序:元素按照插入顺序或访问顺序进行排序。
  • 允许空键和空值:可以有一个或多个空键和空值。
LinkedHashMap的适用场景
  • 当需要保持键值对的插入顺序或访问顺序时。
LinkedHashMap的常用方法

HashMap相同。

LinkedHashMap的使用示例
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("Apple", 1);
linkedHashMap.put("Banana", 2);

// 遍历将按照添加的顺序:Apple, Banana
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
    System.out.println(entry.getKey() + " => " + entry.getValue());
}

结语

集合框架接口之间继承实现关系复杂,实现类繁多,要想运用自如还需多加努力,尽量对每一个常见的实现类都作充分了解,此后笔者还会继续学习泛型(真假泛型、泛型擦除)相关的知识。

参考文献:

Java集合框架最全详解(看这篇就够了)_java 集合框架-CSDN博客

Java集合框架最全详解(超详细)保姆级-CSDN博客

Java 备忘清单 & java cheatsheet & Quick Reference

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

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

相关文章

【wiki知识库】01.wiki知识库前后端项目搭建(SpringBoot+Vue3)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 &#x1f33c;环境准备 想要搭建自己的wiki知识库&#xff0c;要提前搭建好自己的开发环境&#xff0c;后端我使用的是SpringBoot&#xff0c;前端使用的是Vue3&#xff0c;采用前后端分离的技术实现。同时使用了Mysql数…

2 使用香橙派AIpro报错 No module named ‘acllite utils‘

当使用jupyter运行香橙派的notebooks下面的案例的时候启动使用jupyter lab 然后自动跳转到jupyter页面。如下图: 这是自动跳转过来的。然后运行下面的包的导入后报错: 报错为No module named ‘acllite utils’,那么我们打开notebooks文件夹下面的start_notebooks.sh文件:…

【全开源】多功能投票小程序(ThinkPHP+FastAdmin+Uniapp)

打造高效、便捷的投票体验 一、引言 在数字化快速发展的今天&#xff0c;投票作为一种常见的决策方式&#xff0c;其便捷性和效率性显得尤为重要。为了满足不同场景下的投票需求&#xff0c;我们推出了这款多功能投票小程序系统源码。该系统源码设计灵活、功能丰富&#xff0…

分享:怎么才能保证大数据查询的准确性?

随着大数据应用到金融风控领域&#xff0c;大数据越来越重要了&#xff0c;很多朋友在查大数据的时候都会遇到一个问题&#xff0c;那就是自己查询的大数据什么信息都没有&#xff0c;要么就是很少&#xff0c;这是什么原因呢?要怎么才能保证大数据查询的准确性呢?下面小编就…

有什么免费视频翻译软件?安利5款视频翻译软件给你

随着“跨文化交流”话题的热度不断攀升&#xff0c;越来越多的视频内容跨越国界&#xff0c;触及全球观众。 在这一趋势下&#xff0c;视频翻译行业迎来了巨大的发展机遇。然而&#xff0c;面对众多的视频翻译工具&#xff0c;如何挑选出最合心意的那款呢&#xff1f; 现在&a…

RPA+AI 应用案例集合:自动推流直播

使用场景&#xff1a; 自动定时推流直播 使用技术&#xff1a; python playwright 每个解决一个小问题 During handling of the above exception, another exception occurred:Traceback (most recent call last): File "D:\pythonTryEverything\putdonwphone\not_watch_…

Vue.Draggable:强大的Vue拖放组件技术探索

一、引言 随着前端技术的不断发展&#xff0c;拖放&#xff08;Drag-and-Drop&#xff09;功能已经成为许多Web应用不可或缺的一部分。Vue.js作为现代前端框架的佼佼者&#xff0c;为开发者提供了丰富的生态系统和强大的工具链。Vue.Draggable作为基于Sortable.js的Vue拖放组件…

代码随想录算法训练营第三十五天 | 122.买卖股票的最佳时机 II、55.跳跃游戏、45.跳跃游戏 II

目录 122.买卖股票的最佳时机 思路 代码 55.跳跃游戏 思路 代码 45.跳跃问题 II 思路 代码 122.买卖股票的最佳时机 本题解法很巧妙&#xff0c;大家可以看题思考一下&#xff0c;在看题解。 代码随想录 思路 贪心这种东西&#xff0c;毫无章法可言&#xff0c; 完全…

c++引用和内联函数

一、引用 1.引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;引用类型必须和引用实体是同种类型的&#xff09;&#xff0c;如&#x…

漫谈企业信息化安全-综述

一、前言 一直以来想写一些文章&#xff0c;谈一谈企业信息化过程中的安全问题及对策。 随着信息技术的不断发展和普及&#xff0c;特别是今年来移动办公、云服务等等新的工作模式和新的信息技术的应用&#xff0c;企业信息化已经成为提升竞争力、促进创新和发展的重要途径。…

QT小项目:实现远程登录数据库功能(下一章实现主界面菜单设计)

一、环境 1、下载 vs_redist.x64和mysql-connector-c8.0.27-winx64.msi(这个依赖于前者)。 mysql-connector-c8.0.27-winx64.msi vs_redist.x64 二、将程序的数据库登录部分修改 1、这里新增一个控件方便客户端输入ip地址 2、打包项目&#xff0c;步骤参考 QT 项目打包 3、将…

揭秘 淘宝死店采集私信筛选,号称日赚500+

淘宝死店采集工具为电子商务创业者揭示了一个领域的新机遇&#xff0c;通过提供一系列深入分析和资源挖掘的功能&#xff0c;展现了从失败中寻找成功之道的独特方法论。以下是如何通过这种工具寻找电商平台中的隐含机会的几个关键方面&#xff1a; 分析失败的深层原因&#x…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…

kube-apiserver内存占用过多 go tool pprof 入门

目录 环境问题排查1、kube-apiserver %CPU 146 正常&#xff0c;%MEM 高达70&#xff0c;&#xff0c;load average 400&#xff0c;出现kswapd0进程。2、k describe node 看到 SystemOOM3、是否大量连接导致&#xff1f;4、通过prom查看指标5、访问K8s API6、pprof 火焰图 解决…

某方protobuf闲谈

问题 当我们去看某方的时候,搜索了关键词svm,然后通过抓包查看,请求的Request Payload是一串看不懂的乱码,并且返回的数据也大部分是乱码 观察请求的Content-Type是application/grpc-web+proto,没错数据的传输是protobuf的形式了 protobuf的相关概念和原理,网上有很多教…

火山引擎“奇袭”阿里云

图片&#xff5c;电影《美国队长3》剧照 ©自象限原创 作者丨程心 编辑丨罗辑 大模型价格战&#xff0c;已经不是什么新闻。 从OpenAI发布GPT-4o&#xff0c;将API价格下调50%&#xff0c;并宣布面向普通用户免费开始&#xff0c;就标志着大模型的竞争从性能进入到了成本…

CSS单位px、rem、em、vw、vh的区别

目录 前言 零.视口介绍 一.px 二.em 三.rem【重要】 3.1rem介绍 3.2rem与em的区别 四.vw、vh、vmax、vmin 五.注意问题 5.1如何使1rem 10px&#xff1f; 5.2如果父元素没有指定高度&#xff0c;那么子元素的百分比高度是多少&#xff1f; 5.3更多问题 前言 这几…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

手机端如何访问本地vue+vite项目,实现实时调试?

一、应用场景 h5&#xff08;vuevite&#xff09;嵌入app后&#xff0c;出现某种问题时&#xff0c;需要每次发布坏境后&#xff0c;才能才看效果&#xff0c;这种来回很耗时间&#xff0c;本文章在于解决手机端直接访问本地启动应用项目&#xff0c;无需重复发布坏境 二、实…

南京观海微电子---2种 电流检测中的高低边采样电阻和共模抑制比问题

电流检测有两种方法&#xff1a; 一种是用封装好的电流检测芯片采样电阻&#xff1b; 另一种是自己搭建运放电路 高端检测&#xff1a; 低端检测&#xff1a; 自己搭建运放电路&#xff1a;&#xff08;这种对电阻的精度要求较高&#xff0c;对称电路中电阻的一致性&#xff…