Java-集合类

news2024/11/24 17:10:35

集合


Java集合是Java中用于存储和管理一组对象的工具。Java集合提供了相应的方法,用于用户对集合内数据的操作。
Java集合类提供了许多不同的数据结构,如列表、队列、栈、集合和映射,以满足不同类型的编程需求。

程序中如何存储大批量同类型的数据呢?使用数组是没有在学习集合时唯一的办法,数组确实好用,但是有一个缺陷就是数组是固定长度,不管是在定义时设置的长度,还是申请空间时设置的长度,都是有一个长度限制的,存储的数据超过了这个长度,那么就会产生数组下标越界异常。

那么如果在申请内存时,干脆就申请一块很大的空间呢?那不就可以了?但是如果这样申请内存的话,极易造成空间浪费,有可能你申请很大的一块内存,但是只需要使用其中的一点,又或者需要使用的空间还是超过了你申请的空间大小,那么使用起来还是非常的不方便。
这个时候 集合 就出现了,集合的长度是可变的,内存空间随着数据得存入而逐渐得变大,能够很方便使用者,而不同的集合还有着不同的特点方法,对应不同的需要只需要选取不同的集合即可。以下是常见集合之间的继承关系图。

在这里插入图片描述

Collection 接口

collection接口作为LIst与Set集合的父类接口,提供很多的通用方法供两个集合进行使用,以下就是此接口提供的方法。方向详细自行查看JavaAPI。

在这里插入图片描述

以上的方法,List与Set接口都是可以使用的。



List集合


List接口继承了Collection接口,因此包含了Collection接口的所有方法,此外还定义了两个重要的方法:

  1. get(int index) : 获得指定索引的元素。
  2. set(int index,Object obj) : 将指定索引位置的元素对象,修改为obj。


List接口,下面的继承类的底层实现一般分为两种:

  1. 以ArrarList为代表的继承类,底层实现为动态数组。有下标,查询元素方便,插入、删除元素复杂。
  2. 以LinkedList为代表的继承类,底层实现为链表。无下标,查询元素复杂,插入、删除元素简单。


ArrayList类

ArrayList是Java中的一种数据结构,属于java.util包。它实现了List接口,并提供了用于操作数据的方法。ArrarList的底层代码实现是使用数组实现的,所以可以通过下标来找到指定元素。

主要特性:

  1. 动态数组:ArrayList是一个动态数组,这意味着它可以在运行时增长和收缩。当你添加元素并且已经达到了当前的容量时,ArrayList会自动增长其容量。
  2. 索引:ArrayList中的每个元素都有一个索引,可以通过这个索引快速访问元素。
  3. 线程不安全:ArrayList不是线程安全的,这意味着多个线程同时修改ArrayList可能会导致问题。如果需要在多线程环境中使用,可以考虑使用Collections.synchronizedList()来包装它。
  4. null元素:ArrayList允许存储null元素。
  5. 性能:ArrayList通常比LinkedList更快,因为它使用更少的内存,并且缓存了数组的长度。然而,如果你需要频繁地在列表的开头或中间插入或删除元素,那么LinkedList可能是一个更好的选择。


常用方法:

  • add(E e): 将指定的元素追加到此列表的末尾。
  • add(int index, E element): 在此列表中的指定位置插入指定的元素。
  • get(int index): 返回此列表中指定位置的元素。
  • remove(int index): 从此列表中移除指定位置的元素。
  • size(): 返回此列表中的元素数。
  • isEmpty(): 如果此列表中没有元素,则返回true。
  • clear(): 从此列表中移除所有元素。
  • contains(Object o): 如果此列表包含指定的元素,则返回true。 如果此列表包含指定的元素,则返回true。

示例:

import java.util.ArrayList;   
  
public class Main {  
  public static void main(String[] args) {  
    // 创建一个ArrayList对象  
    ArrayList<String> list = new ArrayList<String>();  
   
    // 添加元素到ArrayList  
    list.add("Element 1");  
    list.add("Element 2");  
    list.add("Element 3");  
   
    // 输出ArrayList的元素  
    for (String element : list) {  
      System.out.println(element);  
    }  
  }  
}


Set集合

在Java中,Set是一种集合,它用于存储不重复元素的集合。Set集合中的每个元素都是唯一的,它们按照自然顺序或者自定义顺序进行排序。 由于Set集合的底层实现是通过哈希表实现的,简略来说就是,由于哈希表在添加数据时,会通过哈希函数计算出哈希值,而哈希值是唯一的,而将哈希值作为该元素的下标,将元素存储在对应的位置下,那么如果添加两个重新的元素时,由于哈希值是一样的,那么该位置就会有元素存储,那么第二个元素就不能存储进哈希表中,以此来保证数据的唯一性。


Java中提供了几个实现Set接口的类,包括:

  1. HashSet: HashSet是基于哈希表的Set实现。它不保证元素的顺序,允许null元素,但不允许null作为键。
  2. TreeSet: TreeSet是基于红黑树的Set实现。它按照元素的自然顺序或者自定义顺序进行排序,不允许null元素。
  3. LinkedHashSet: LinkedHashSet是基于哈希表和链表的Set实现。它按照元素的插入顺序进行排序,允许null元素。
  4. EnumSet: EnumSet是基于枚举类型的Set实现。它不允许null元素,但允许枚举类型的元素。


基本方法: 这些类都实现了Set接口,因此它们都具有Set的基本操作方法。
包括:

1、添加元素:使用add()方法将元素添加到Set集合中。
2、删除元素:使用remove()方法将元素从Set集合中删除。
3、包含元素:使用contains()方法检查Set集合是否包含指定元素。
4、获取元素数量:使用size()方法获取Set集合中元素的数量。
5、遍历元素:使用iterator()方法获取Set集合的迭代器,并使用迭代器遍历集合中的元素。

需要注意的是,由于Set集合中的元素是唯一的,因此如果尝试添加已经存在的元素,该操作将不会有任何效果。



HashSet集合

HashSet类是Set接口的一个实现类,它使用哈希表(HashMap)来存储集合中的元素。HashSet类不保证集合中元素的顺序。此类允许使用null元素。
HashSet集合中的元素是无序的,即它们不会按照任何特定的顺序进行排列。


特性:

  1. 不允许重复元素:HashSet集合中的每个元素都是唯一的,不会存储重复的元素。如果尝试向集合中添加已存在的元素,该操作将不会有任何影响。
  2. 无序集合:HashSet集合中的元素没有固定的顺序。这意味着无法预测或依赖于元素的迭代顺序。
  3. 允许null元素:HashSet集合中可以包含一个null元素。
  4. 线程不安全:HashSet类不是线程安全的。如果多个线程同时修改HashSet集合,可能会导致不可预测的结果。如果需要在多线程环境中使用HashSet,可以考虑使用Collections.synchronizedSet()方法来获取一个同步的集合。
  5. 性能:HashSet的性能通常优于ArrayList和LinkedList,特别是在添加和查询元素时。这是因为它基于HashMap实现,而HashMap的查找和插入操作的时间复杂度都是O(1)。

示例

import java.util.HashSet;  
  
public class HashSetExample {  
    public static void main(String[] args) {  
        // 创建一个新的HashSet集合  
        HashSet<String> set = new HashSet<>();  
  
        // 向集合中添加元素  
        set.add("Apple");  
        set.add("Banana");  
        set.add("Orange");  
  
        // 打印集合的内容  
        System.out.println("Set: " + set);  
  
        // 检查集合是否包含某个元素  
        System.out.println("Contains 'Apple': " + set.contains("Apple"));  
  
        // 删除一个元素  
        set.remove("Banana");  
        System.out.println("Set after removing 'Banana': " + set);  
  
        // 遍历集合  
        for (String item : set) {  
            System.out.println("Item: " + item);  
        }  
    }  
}

注意:由于HashSet是无序的,因此每次迭代输出的顺序可能会不同。



TreeSet集合

Java的TreeSet是一种基于TreeMap实现的类,它是一个有序的、不包含重复元素的集合。TreeSet中的元素可以是任何排序的对象,例如Integer、String或自定义对象。自定义对象需要自定义排序方法。



特性 :

  1. 元素的排序:TreeSet中的元素默认按照自然排序(升序)进行排列。例如,数字默认按照升序排列,字符串按照字典顺序排列。
  2. 元素的排序:TreeSet中的元素默认按照自然排序(升序)进行排列。例如,数字默认按照升序排列,字符串按照字典顺序排列。
  3. 元素的添加:你可以使用add()方法向TreeSet中添加元素。
  4. 元素的删除:你可以使用remove()方法从TreeSet中删除元素。
  5. 查找元素:你可以使用contains()方法检查TreeSet中是否包含某个元素。
  6. 遍历元素:你可以使用迭代器或增强for循环遍历TreeSet中的元素。


示例

import java.util.TreeSet;  
  
public class TreeSetExample {  
    public static void main(String[] args) {  
        // 创建一个新的TreeSet集合  
        TreeSet<Integer> set = new TreeSet<>();  
  
        // 向集合中添加元素  
        set.add(5);  
        set.add(3);  
        set.add(8);  
        set.add(1);  
        set.add(9);  
  
        // 打印集合的内容  
        System.out.println("Set: " + set);  
  
        // 检查集合是否包含某个元素  
        System.out.println("Contains 3: " + set.contains(3));  
  
        // 删除一个元素  
        set.remove(5);  
        System.out.println("Set after removing 5: " + set);  
    }  
}


Map集合

Java中的Map接口是一个关联数组,可以存储键-值对,其中键是唯一的。Map接口在java.util包中。
它的实现类包括HashMap、TreeMap、LinkedHashMap等


Map接口内的常用方法

  1. size():返回Map中的键-值对的数量。
  2. isEmpty():判断Map是否为空。
  3. containsKey(Object key):判断Map中是否包含指定的键。
  4. containsValue(Object value):判断Map中是否包含指定的值。
  5. get(Object key):根据指定的键获取对应的值,如果键不存在则返回null。
  6. put(K key, V value):将指定的键-值对添加到Map中。
  7. remove(Object key):根据指定的键删除Map中的键-值对,并返回被删除的值。
  8. clear():清空Map中的所有键-值对。

只要实现了Map接口的类,那么以上的方法都是可以使用的。



HashMap

HashMap是Java中Map接口的一种常用实现,它可以存储键值对,其中键是唯一的
HashMap类在java.util包中。


常用方法:

  1. 允许使用null键和null值。
  2. isEmpty():判断HashMap是否为空。
  3. containsKey(Object key):判断HashMap中是否包含指定的键。
  4. containsValue(Object value):判断HashMap中是否包含指定的值。
  5. get(Object key):根据指定的键获取对应的值,如果键不存在则返回null。
  6. put(K key, V value):将指定的键值对添加到HashMap中。
  7. remove(Object key):根据指定的键删除HashMap中的键值对,并返回被删除的值。
  8. remove(Object key):根据指定的键删除HashMap中的键值对,并返回被删除的值。


小细节: 在HashMap的put方法添加新的键值对时,如果此时的键已经在HashMap中存在,那么put方法还是会执行成功,且将键值对的值进行替换,将旧的值返回,将新的值覆盖之前的值。

在这里插入图片描述



TreeMap

TreeMap是Java中Map接口的一种实现,它可以存储键值对,其中键是唯一的。TreeMap类在java.util包中。

TreeMap的底层实现是红黑树(Red-Black Tree),这是一种自平衡的二叉搜索树。


特点:

  1. TreeMap中的键必须实现Comparable接口,或者提供一个Comparator对象作为构造函数的参数,用于指定键的排序顺序。
  2. TreeMap中的键值对是按照键的排序顺序进行存储的,因此可以根据键的顺序遍历TreeMap中的元素。
  3. 不允许使用null键和null值。
  4. 线程不同步,即不是线程安全的。如果需要多个线程同时访问TreeMap,需要使用Collections.synchronizedMap()方法来获取线程安全的Map。
  5. 底层实现是红黑树(Red-Black Tree),查询、插入和删除操作的时间复杂度都是O(log n)。

常用方法:

  1. size():返回TreeMap中的键值对数量。
  2. isEmpty():判断TreeMap是否为空。
  3. containsKey(Object key):判断TreeMap中是否包含指定的键。
  4. containsValue(Object value):判断TreeMap中是否包含指定的值。
  5. get(Object key):根据指定的键获取对应的值,如果键不存在则返回null。
  6. put(K key, V value):将指定的键值对添加到TreeMap中。
  7. remove(Object key):根据指定的键删除TreeMap中的键值对,并返回被删除的值。
  8. clear():清空TreeMap中的所有键值对。

双列集合的选用:如果不需要键值对排序的话,使用HashMap的效率会比TreeMap的效率高,如果需要排序的话,那么使用TreeMap的效果会更好。



End

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

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

相关文章

vue项目中使用特殊字体的步骤

写在前面 在项目中使用特殊字体&#xff0c;需要注意&#xff0c;所使用的特殊字体是否被允许商用或是个人开发&#xff0c;以及如何使用&#xff0c;切记不要侵权。 首先需要在对应字体网站下载字体文件&#xff0c;取出里面后缀名为.ttf的文件 然后把该文件放到src -> ass…

python自(2)切片 字典 遍历删除添加修改查询定义函数函数返回值作用域序列化异常报错urllib使用一个类型六个方法下载 视频音频图片

切片 # # 切片# s hello word# # 下标索引为0的 # print(s[0]) #h# # 左闭右开 &#xff08;左是下标开始的&#xff0c;右是几个索引值&#xff09;例如从0开始算 4个索引值 # print(s[0:4]) #hell# # 更改起始值的开始位置 # print(s[1:]) #ello word# # 下标结束位置 # p…

生成式人工智能在高等教育 IT 中的作用

作者&#xff1a;Jared Pane 通过将你大学的数据与公共 LLMs 和 Elasticsearch 安全集成来找到你需要的答案。 根据 2023 年 4 月 EDUCAUSE 的一项调查&#xff0c;83% 的受访者表示&#xff0c;生成式人工智能将在未来三到五年内深刻改变高等教育。 学术界很快就询问和想象生…

9月14日作业

实现myVector #include <iostream>using namespace std;template <typename T> class myVector { private:T* data;int size;int capacity; public:// 构造函数myVector() : data(nullptr), size(0), capacity(0) {}//拷贝构造函数myVector(const myVector& o…

Jetson Xavier NX开发板无屏幕远程连接

设备&#xff1a; jetson nx &#xff08;ubuntu20.04&#xff09;,win10 目标&#xff1a;实现jetson nx不连接屏幕实现远程连接并控制 网上比较多的答案都是使用vnc,但本人亲尝试过了vnc只有在jetson nx开发板连接有屏幕时候才有空&#xff0c;一旦不连接屏幕&#xff0c;…

千兆以太网网络层 ARP 协议的原理与 FPGA 实现

文章目录 前言一、ARP 帧的应用场景和存在目的二、ARP 帧工作原理三、以太网 ARP 帧发包实例设计四、以太网 CRC校验代码五、以太网 ARP 帧发包测试---GMII1.模拟数据发送2.仿真模块3.仿真波形六、以太网 ARP 帧发包测试---RGMII1.顶层文件2 .仿真代码七、上板测试(RGMII)前言…

浅显易懂理解傅里叶变换

说起电子硬件专业&#xff0c;那不得不提的就是傅里叶变换了。 大学课程中应该吓倒了很多人&#xff0c;谈傅里叶色变了。 本次就来重新认识一下电子硬件中的傅里叶变化。 首先理解之前&#xff0c;当然是需要先知道傅里叶这位大牛的人物百科啦。 傅里叶是法国数学家&#xff0…

【数据结构】平衡二叉搜索树(AVL树)——AVL树的概念和介绍、AVL树的简单实现、AVL树的增删查改

文章目录 平衡二叉搜索树&#xff08;AVL树&#xff09;1.AVL树的概念和介绍2.AVL树的简单实现2.1AVL树的插入2.2AVL树的旋转2.2.1左旋2.2.2右旋2.2.3右左双旋2.2.4左右双旋 全部源码 平衡二叉搜索树&#xff08;AVL树&#xff09; 为什么要引入平衡二叉搜索树&#xff1f; 在之…

jdk 中的 keytool 的使用,以及提取 jks 文件中的公钥和私钥

这里暂时只需要知道如何使用就可以了。 首先是生成一个密钥&#xff0c; keytool -genkeypair -alias fanyfull -keypass ffkp123456 -validity 365 -storepass ffsp123456 -keystore fanyfull.jks -keyalg RSA解释一下这里的选项&#xff0c; -alias 密钥对的名称-keypass …

等变性的AI:从离散到连续

这篇文章主要介绍了在科学问题中如何实现不变性或等变性&#xff0c;其中介绍了实现等变性的数学和物理基础&#xff0c;包括离散和连续对称变换的示例&#xff0c;并描述了在实践中如何使用张量积。文章还讨论了如何处理数据中的对称性&#xff0c;以及如何开发适应对称性约束…

喜报!Coremail荣获广东省信息技术应用创新优秀产品和解决方案

导语 近日&#xff0c;由广东省信息技术应用创新产业联盟组织的“2023 年广东省信息技术应用创新成果交流会”在广州顺利召开。 Coremail作为会员单位受邀出席此次交流会。会上&#xff0c;Coremail荣获优秀产品和解决方案奖项&#xff0c;CACTER邮件安全网关获评“2022年广东…

阿里云服务器操作系统怎么选择?阿里云镜像区别

阿里云服务器操作系统怎么选择&#xff1f;小白镜像选择攻略&#xff01;阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文…

想了解商品期权开户门槛?零门槛开户,不用担心!

商品期权不是零门槛开户&#xff0c;不过可以通过第三方期权分仓软件实现0门槛参与商品期权&#xff0c;股指期权&#xff0c;上证50ETF期权、沪深300ETF期权和创业板ETF期权交易&#xff0c;下文介绍想了解商品期权开户门槛&#xff1f;零门槛开户&#xff0c;不用担心&#x…

【Seata】04 - Seata TCC 模式 Demo 调用流程分析

文章目录 前言参考目录版本说明前置知识1、TCC 模式预留资源2、TCC 模式可能会出现的问题2.1、幂等性问题2.2、空回滚问题2.3、悬挂问题 测试 Demo1、数据库表结构2、模块说明3、调用逻辑说明4、分析流程说明 Seata TCC 模式 Commit 调用流程1、调用流程图2、TCC 动作拦截器&am…

【华为云云耀云服务器L实例评测|使用教学】一文带你快速入手华为云云耀云服务器L实例

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

DC/DC开关电源学习笔记(七)低压大电流DC/DC变换技术

低压大电流DC/DC变换技术 1. 无暂态要求的低压大电流DC/DC变换技术2. 负载极其快速变化的低压大电流DC/DC变换技术2.1 非隔离型 VRM2.2 隔离型VRM低压大电流高功率 DC/DC 变换技术,已从前些年的 3.3V 降至现在的 1.0V 左右,电流目前已可达到几十安至几百安。同时,电源的输出指标…

使用CFimagehost源码搭建免费的PHP图片托管私人图床,无需数据库支持

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

vue3+scss开启写轮眼

vue3scss开启写轮眼 一、相关技术二、使用步骤1.安装依赖2.眼球3 勾玉4 旋转动画5 综合 一、相关技术 采用vue3vitescss的技术内容进行开发 二、使用步骤 1.安装依赖 代码如下&#xff1a; npm install sass2.眼球 首先我们根据需要 将眼睛的基础形状描绘出来&#xff0c…

【AI+医疗】AI在医疗影像设备工作周期中的应用探索

导读 随着人工智能技术的飞速发展&#xff0c;越来越多的领域开始与人工智能技术深度融合&#xff0c;产生了一种新型的技术模式——AI。AI是指将人工智能技术与其他领域的技术或应用进行结合&#xff0c;在提高效率、精度和创新能力的同时&#xff0c;也为人工智能技术的发展提…

The Sandbox 和 Burrito 钱包达成合作!

我们很高兴宣布与 Burrito 钱包达成合作&#xff0c;这是韩国领先的区块链公司 Rotonda 推出的一款全新的 Web3 钱包。此次合作旨在丰富 The Sandbox 平台的用户体验&#xff0c;实现更无缝的资产管理和转移。 此次合作的主要优势之一是将 Burrito 钱包集成到 The Sandbox 生态…