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

【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.mzph.cn/diannao/16108.shtml

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

相关文章

大语言模型的工程技巧(二)——混合精度训练

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 混合精度训练的示例请参考如下链接&#xff1a;regression2chatgpt/ch11_llm/gpt2_lora_optimum.ipynb 本文将讨论如何利用混合…

Java语法篇-易错

文章目录 类型转换switch case类之间关系及UMLtry catch finally 类型转换 隐式类型转换&#xff0c;不同数值类型参与计算时&#xff0c;低精度会转化为高精度参与运算 byte,short,char参与整数运算时会转成int float,int 参与浮点数运算时会转成double 强制类型转换 高精…

数据结构 —— 栈 与 队列

1.栈 1.1栈的结构和概念 栈&#xff08;Stack&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的原则。栈只允许在一端插入和删除数据&#xff0c;这一端被称为栈顶&#xff08;top&#xff09;&a…

c++引用和内联函数

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

MySQL--联合索引应用细节应用规范

目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …

2024年NGFW防火墙安全基准-防火墙安全功效竞争性评估实验室总结报告

Check Point 委托 Miercom 对 Check Point 下一代防火墙 (NGFW) 开展竞争性安全有效性测试&#xff0c; 选择的竞品分别来自 Cisco、Fortinet 和 Palo Alto Networks。对 Zscaler 的测试涉及他们的 SWG&#xff08;安全网关&#xff09;。测试内容包括验证防病毒、反恶意软件、…

SpringBoot+Vue开发记录(六)-- 后端配置mybatis

原型图什么的就先不管&#xff0c;后面再写。 本篇文章的主要内容就是springboot通过mybatis操作数据库实现增删改查。 重点是mybatis配置与相关文件数据&#xff0c;以后开新项目忘记了怎么配置的话可以再照着这个搞。 这算是最基础的部分了吧。 文章目录 一&#xff0c;配置…

基于STM32的自动宠物喂食器的Proteus仿真

文章目录 一、宠物喂食器1.题目要求2.思路2.1 OLED显示汉字2.2 DS1302模块2.3 液位传感器2.4 压力传感器和步进电机驱动 3.仿真图3.1 未仿真时3.2 开始仿真&#xff0c;OLED初始界面显示实时时间3.3 通过设置按键进入模式选择和喂食时间设置3.4 进入喂食时间设置3.5 设置好喂食…

计算机毕业设计Python+Spark+PyTroch游戏推荐系统 游戏可视化 游戏爬虫 神经网络混合CF推荐算法 协同过滤推荐算法 steam 大数据

毕业设计&#xff08;论文&#xff09; 基于SpringBoot的游戏防沉迷系统的设计与实现 摘 要 随着网络游戏市场的持续火爆,其最明显的负面影响----“网络游戏沉迷问题”已成为当前社会普遍关心的热点问题。根据2010年8月1日实施的《网络游戏管理暂行办法》&#xff0c;网络游…

图书管理系统——Java版

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 顺序表的学习&#xff0c;点我 目录 图书管理系统菜单 基本框架&#xff1a; 书&#xff1a; 书架&#xff1a; 用户&#xff…

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程&#xff0c;它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤&#xff1a; 1.确定营销目标&#xff1a; 明确你的营销活动旨在实现的具体目标&#xff0c;比如提升品牌知名度、增加销售额、吸引新客…

Java进阶学习笔记25——Objects类

为啥比较两个对象是否相等&#xff0c;要用Objects的equals方法&#xff0c;而不是用对象自己的equals方法来解决呢&#xff1f; Objects&#xff1a; Objects类是一个工具类&#xff0c;提供了很多操作对象的静态方法供我们使用。 package cn.ensource.d14_objects;import ja…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据&#xff0c;即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库&#xff0c;因为它们的用途不同&#xff0c;架构也不同。Hadoop 是一个跨分布…

Vue2基础及其进阶面试(二)

vue2的生命周期 删除一些没用的 App.vue 删成这个样子就行 <template><router-view/></template><style lang"scss"></style>来到路由把没用的删除 import Vue from vue import VueRouter from vue-router import HomeView from .…

JAVASE之类和对象(2)

哪怕犯错&#xff0c;也不能什么都不做。 主页&#xff1a;趋早–Step 专栏&#xff1a;JAVASE gitte:https://gitee.com/good-thg 接上部分&#xff0c;我们继续来学习JAVAEE类和对象。 引言&#xff1a; 这篇文章接上一篇&#xff0c;后半部分&#xff0c;结束类和对象 目录 …

Spring Boot 3.0:未来企业应用开发的基石

文章目录 一、Spring Boot 3.0的核心特性二、Spring Boot 3.0的优势三、如何在项目中应用Spring Boot 3.01.更新项目依赖2.调整代码结构3.测试和部署 《学习Spring Boot 3.0》内容简介作者简介目录内容介绍 随着技术的飞速发展&#xff0c;企业应用开发的需求也在不断演变。Spr…

爽!AI手绘变插画,接单赚爆了!

我最近发现一款名叫Hyper-SD15-Scribble的AI项目&#xff0c;可以实现一键手绘变插画的功能&#xff0c;而且它搭载了字节出品的超快速生成图片的AI大模型Hyper-SD15&#xff0c;可以实现几乎实时生成图片&#xff0c;有了它&#xff0c;拿去接一些手绘商单分分钟出图&#xff…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

WPF学习日常篇(一)--开发界面视图布局

接下来开始日常篇&#xff0c;我在主线篇&#xff08;正文&#xff09;中说过要介绍一下我的界面排布&#xff0c;科学的排布才更科学更有效率的进行敲代码和开发。日常篇中主要记录我的一些小想法和所考虑的一些细节。 一、主界面设置 主界面分为左右两部分&#xff0c;分为…

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

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