Java-集合类

集合


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.rhkb.cn/news/132186.html

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

相关文章

C 编译原理

C 编译原理 目录 C 编译原理引入GCC 工具链介绍C运行库 编译准备工作编译过程1.预处理2.编译3.汇编4.链接 分析ELF文件1.ELF文件的段2.反汇编ELF C语言编译过程 - 摘录编译预处理编译、优化汇编链接过程 引入 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高…

(2023 最新版)IntelliJ IDEA 下载安装及配置教程

IntelliJ IDEA下载安装教程&#xff08;图解&#xff09; IntelliJ IDEA 简称 IDEA&#xff0c;由 JetBrains 公司开发&#xff0c;是 Java 编程语言开发的集成环境&#xff0c;具有美观&#xff0c;高效等众多特点。在智能代码助手、代码自动提示、重构、J2EE 支持、各类版本…

深度学习面试八股文(2023.9.06)

一、优化器 1、SGD是什么&#xff1f; 批梯度下降&#xff08;Batch gradient descent&#xff09;&#xff1a;遍历全部数据集算一次损失函数&#xff0c;计算量开销大&#xff0c;计算速度慢&#xff0c;不支持在线学习。随机梯度下降&#xff08;Stochastic gradient desc…

计算机竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…

电压放大器的应用范围有哪些

电压放大器是一种常见的电子设备&#xff0c;用于将输入信号的电压放大到更高的水平。它在各个领域中具有广泛的应用范围。本文将详细介绍电压放大器的应用。 音频放大器&#xff1a; 电压放大器在音频系统中起着重要作用&#xff0c;用于将来自音源&#xff08;如CD播放器、MP…

清华智能体宇宙火了;主流大语言模型的技术原理细节

&#x1f989; AI新闻 &#x1f680; 清华智能体宇宙火了 摘要&#xff1a;清华大学联合北邮、微信团队推出了AgentVerse&#xff0c;这是一个可以轻松模拟多智能体宇宙的环境。它专为大语言模型开发&#xff0c;智能体可以利用LLM能力完成任务。AgentVerse提供了几个示例环境…

Linux使用正则匹配配置文件有效内容

cat /etc/libvirt/libvirtd.conf|egrep -v "^#|^$" 这个正则表达式是在使用grep命令进行文本匹配过滤。下面是对该正则表达式的解释&#xff1a; ^#&#xff1a;^表示行的开头&#xff0c;#表示一个井号符号。这个部分匹配以井号开头的行。^$&#xff1a;$表示行的结…

聚精品,通全球 2024中国(杭州)国际电商物流包装产业展览会四月隆重开幕

2024中国&#xff08;杭州&#xff09;国际电商物流包装产业展览会 2024年4月12-14日 | 杭州国际博览中心 同期举办&#xff1a;2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09; 2024中国&#xff08;杭州&#xff09;国际数字物流技术与应用展览会 展会…

Unity 课时 4 : No.4 模拟面试题

课时 4 : No.4 模拟面试题 C# 1. 请说明字符串中 string str null string str “” string str string.Empty 三者的区别 第一个未作初始化没有值, 第二个为空字符串, 答案&#xff1a; str null 在堆中没有分配内存地址 str "" 和 string.Empty 一样都是…

《打造高可用PostgreSQL:策略与工具》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊

9月13日&#xff0c;Today消息&#xff0c;一位名叫Alex的4岁儿童得了一种浑身疼痛的怪病&#xff0c;每天需要服用Motrin&#xff08;美林&#xff09;才能止痛。3年的时间&#xff0c;看了17名医生无法确诊病因。&#xff08;新闻地址&#xff1a;https://www.today.com/heal…

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…

java 咖啡餐厅管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 咖啡餐厅管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

四叶草clover配置工具:Clover Configurator for Mac

Clover Configurator是一款Mac上的工具&#xff0c;用于配置和优化Clover引导加载器。Clover引导加载器是一种用于启动macOS的开源引导加载器。它允许用户在启动时选择操作系统和配置启动选项。 Clover Configurator提供了一个可视化的界面&#xff0c;让用户可以轻松地编辑和…

Java时间复杂度和空间复杂度(详解)

目录 1.复杂度分析 2.时间复杂度 大O的渐进表示法 3.空间复杂度 1.复杂度分析 当我们设计一个算法时&#xff0c;怎样衡量其好坏&#xff1f; 算法在编写为可执行程序后&#xff0c;运行时需要耗费时间资源和空间&#xff08;内存&#xff09;资源。因此&#xff0c;衡量一…

使用新版Maven-mvnd快速构建项目

目前我们项目的构建方式多数是 maven、gradle&#xff0c;但是 maven 相对 gradle 来说&#xff0c;构建速度较慢&#xff0c;特别是模块相对较多的时候&#xff0c;构建速度更加明显。但是我们将项目由 maven 替换为 gradle 相对来说会比较麻烦&#xff0c;成本较高。于是我们…

Qt的ui文件不能简单复制

在使用vsQt开发时&#xff0c;直接复制另外一个widget类的ui文件&#xff0c;简单改名成当前类对应的ui文件&#xff0c;会导致编译出错。尽可能使用添加的Qt class自带的ui文件&#xff0c;因为ui文件的配置文件中有许多与当前类相关的字符串&#xff0c;简单复制容易报错。

二刷力扣--字符串

字符串 摘自Python文档-标准库&#xff1a; 在Python中&#xff0c; 字符串是由 Unicode 码位构成的不可变序列。 由于不存在单独的“字符”类型&#xff0c;对字符串做索引操作将产生一个长度为 1 的字符串。 也就是说&#xff0c;对于一个非空字符串 s, s[0] s[0:1]。 不存…

分布式调度 Elastic-job

分布式调度 Elastic-job 1.概述 1.1什么是任务调度 我们可以思考一下下面业务场景的解决方案: 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算…

IP地址SSL证书的作用是什么?

IP地址SSL证书的作用是确保网站连接的安全性和可信度。具体而言&#xff0c;IP地址SSL证书的作用包括以下几个方面&#xff1a; 1. 数据加密&#xff1a;IP地址SSL证书使用SSL协议为网站提供了数据加密功能。通过加密传输&#xff0c;证书可以保护敏感信息&#xff08;如用户登…