【Java 基础】17 集合

文章目录

    • 1.基本概念
    • 2.核心接口
    • 3.常见实现
      • 1)List 接口的实现类
        • ArrayList
        • LinkedList
        • Vector
      • 2)Set 接口的实现类
        • HashSet
        • LinkedHashSet
        • TreeSet
      • 3)Queue 接口的实现**类**
        • ArrayQueue
      • 4)Map 接口的实现类
        • HashMap
        • LinkedHashMap
        • TreeMap
    • 4.最佳实践

集合框架(Collection Framework)是一组 用于存储操作数据的类和接口。它提供了一种灵活、高效的数据结构,适用于各种编程场景。

1.基本概念

集合就是把分散的 “东西” 聚集到一起。

集合框架就是为集合提供了一套通用的操作方式供使用。

Java 集合框架的设计目标是提供一组通用的、类型安全的接口和实现,使得我们能够轻松地操作和管理数据
在这里插入图片描述

2.核心接口

在这里插入图片描述

集合框架的常用核心接口:

接口名称功能描述常见实现
Collection表示一组对象,Map所有集合的根接口,定义了基本的集合操作,如添加、删除、遍历等-
List表示一个有序的集合,允许重复元素ArrayListLinkedListVector
Set表示一个不包含重复元素的集合HashSetLinkedHashSetTreeSet
Queue表示一个有序的集合,是一个先进先出的队列ArrayDeque
Map表示键值对的集合,每个键都唯一HashMapLinkedHashMapTreeMap

3.常见实现

1)List 接口的实现类

ArrayList

基于动态数组实现,支持快速随机访问。

public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("b");arrayList.add("a");arrayList.add("a");System.out.println(arrayList);
}

输出结果:[b, a, a]

LinkedList

基于双向链表实现,适合插入和删除操作。

public static void main(String[] args) {List<String> linkedList = new LinkedList<>();linkedList.add("b");linkedList.add("a");linkedList.add("a");System.out.println(linkedList);
}

输出结果:[b, a, a]

Vector

类似于 ArrayList,但是是线程安全的。

public static void main(String[] args) {List<String> vector = new Vector<>();vector.add("b");vector.add("a");vector.add("a");System.out.println(vector);
}

输出结果:[b, a, a]

这样简单的存储操作,结果都是相同的,只不过内部的实现方式不同而已。

2)Set 接口的实现类

HashSet

基于哈希表实现,无序且不允许重复元素。

public static void main(String[] args) {Set<String> hashSet = new HashSet<>();hashSet.add("b");hashSet.add("a");hashSet.add("a");System.out.println(hashSet);
}

输出结果:[a, b]

LinkedHashSet

基于哈希表和链表实现,有序且不允许重复元素。

public static void main(String[] args) {Set<String> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add("b");linkedHashSet.add("a");linkedHashSet.add("a");System.out.println(linkedHashSet);
}

输出结果:[b, a]

TreeSet

基于红黑树实现,有序且不允许重复元素( 有序是指可以按照元素的大小顺序自动排序 )。

public static void main(String[] args) {Set<String> treeSet = new TreeSet<>();treeSet.add("b");treeSet.add("a");treeSet.add("a");System.out.println(treeSet);
}

输出结果:[a, b]

3)Queue 接口的实现

ArrayQueue

双端队列,是一种具有队列和栈的性质的数据结构 。 双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

  • 将其用作

    public static void main(String[] args) {Deque<Integer> stack = new ArrayDeque<>();stack.push(0);stack.push(1);stack.push(2);System.out.println(stack);System.out.println(stack.pop());System.out.println(stack);
    }
    

    输出结果:

    [2, 1, 0]
    2
    [1, 0]

  • 将其用作队列

    public static void main(String[] args) {Deque<Integer> deque = new ArrayDeque<>();deque.offer(0);deque.offer(1);deque.offer(2);System.out.println(deque);System.out.println(deque.poll());System.out.println(deque);
    }
    

    输出结果:

    [0, 1, 2]
    0
    [1, 2]

4)Map 接口的实现类

HashMap

基于哈希表实现,键值对无序。

public static void main(String[] args) {Map<String, String> hashMap = new HashMap<>();hashMap.put("b", "bb");hashMap.put("a", "aa");hashMap.put("a", "aa");System.out.println(hashMap);
}

输出结果:{a=aa, b=bb}

LinkedHashMap

基于哈希表和链表实现,键值对有序。

public static void main(String[] args) {Map<String, String> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("b", "bb");linkedHashMap.put("a", "aa");linkedHashMap.put("a", "aa");System.out.println(linkedHashMap);
}

输出结果:{b=bb, a=aa}

TreeMap

基于红黑树实现,键值对有序( 有序是指可以按照元素的大小顺序自动排序 )。

public static void main(String[] args) {Map<String, String> treeMap = new TreeMap<>();treeMap.put("b", "bb");treeMap.put("a", "aa");treeMap.put("a", "aa");System.out.println(treeMap);
}

输出结果:{a=aa, b=bb}

4.最佳实践

  • 选择合适的集合类型: 根据需求选择不同的集合类型

    例如:需要有序且不允许重复元素,可以选择 TreeSetLinkedHashSet

  • 遍历集合: 使用增强型 for 循环或迭代器进行集合遍历,提高代码的可读性。

    for (String item : list) {System.out.println(item);
    }
    
  • 使用泛型: 在集合中使用泛型能够提高代码的类型安全性,避免在运行时出现类型转换错误。

  • 注意线程安全性: 根据程序的多线程需求选择合适的集合实现

    例如:需要线程安全的集合可以选择 Vector 或使用 Collections.synchronizedList

  • 使用 stream: Java 8 引入了一些便利的集合处理方法

    例如: stream()filter()map() 等,可以简化集合操作。

    public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Test");list.add("Hello world");System.out.println("list: " + list);List<String> helloList = list.stream().filter(s -> s.startsWith("Hello")).collect(Collectors.toList());System.out.println("helloList: " + helloList);
    }
    

    输出结果:

    list: [Test, Hello world]
    helloList: [Hello world]

  • 注意集合的性能: 根据集合的使用场景选择合适的实现

    例如:需要高性能的随机访问可以选择 ArrayList,而频繁插入和删除操作可以选择 LinkedList

  • 谨慎使用原始类型: 尽量避免在集合中使用原始类型,使用泛型可以提高代码的可维护性和可读性。

集合框架为我们提供了丰富的工具和选项,能够满足不同场景下的数据存储和操作需求。了解不同集合的特性和使用场景,合理选择和使用集合框架,将有助于编写出高效、可维护的 Java 代码

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

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

相关文章

GateWay的路由与全局过滤器

1.断言工厂 我们在配置文件中写的断言规则只是字符串&#xff0c;这些字符串会被Predicate Factory读取并处理&#xff0c;转变为路由判断的条件 例如Path/user/**是按照路径匹配&#xff0c;这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePr…

shell编程-awk命令详解(超详细)

文章目录 前言一、awk命令介绍1. awk命令简介2. awk命令的基本语法3. 常用的awk命令选项4. 常用的awk内置变量 二、awk命令示例用法1. 打印整行2. 打印特定字段3. 根据条件筛选行4. 自定义分隔符5. 从文件中读取awk脚本 总结 前言 awk命令是一种强大的文本处理工具&#xff0c…

【C++】异常处理 ⑦ ( 异常类的继承层次结构 | 抛出 / 捕获 多个类型异常对象 | 抛出子类异常对象 / 捕获并处理 父类异常对象 )

文章目录 一、抛出 / 捕获 多个类型异常对象1、抛出 / 捕获 多个类型异常对象2、操作弊端3、完整代码示例 二、异常类的继承层次结构1、抛出子类异常对象 / 捕获并处理 父类异常对象2、完整代码示例 - 抛出子类异常对象 / 捕获并处理 父类异常对象 自定义的 异常类 , 可能存在 …

23.12.3日总结

饿了么项目进度 新建菜品的添加属性&#xff1a; 适应不同尺寸的媒体查询&#xff1a; 菜品详细页面&#xff1a; 项目上遇到的问题 媒体查询遇到的问题&#xff1a; 关于媒体查询不能生效的原因-CSDN博客 答辩总结 js中声明变量的关键字&#xff08;const&#xff0c;let…

初始化 Clouder Manager 数据库报错Unable to find JDBC driver for database type: MySQL

CDH部署初始化 Clouder Manager 数据库报错。 解决方法&#xff1a; 把mysql驱动放到 /usr/share/java/目录下面(没有的新建&#xff09;&#xff0c;驱动名称也要修改为mysql-connector-java.jar 再次执行后成功&#xff1a; sudo /opt/cloudera/cm/schema/scm_prepare_data…

SpringBoot之自定义Starter

目录 一、自己的理解 1. 理解一 2. 理解二 二、自定义starter&#xff08;重点&#xff09; 三、以mybatis-spring-boot-starter为例进行分析 1. 写好自己的自动配置类逻辑 2. 创建自己的starter项目并引入自动配置类项目的依赖 3. 在其它项目中使用自定义的starter 一…

[ 云计算 | AWS 实践 ] 使用 Java 检查指定的密钥是否存在于给定的 Amazon S3 存储桶中

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

Java 数组另类用法(字符来当数组下标使用)

一、原因 看力扣的时候发现有位大佬使用字符来当数组下标使用。 class Solution {public int lengthOfLongestSubstring(String s) {int result 0;int[] hash new int[130];int i 0;for(int j 0; j < s.length(); j) {while(hash[s.charAt(j)] > 0) {hash[s.charAt…

虚拟化逻辑架构: VM VirtualBox 指定6.0.24版本开启硬件辅助虚拟化功能

目录 一、实验 1.安装VM VirtualBox-6.0.24 2.安装VM VirtualBox-6.1.26 3.再次重新安装VM VirtualBox-6.0.24 二、问题 1.系统开机报错 2.Ubuntu系统无法自适应VM VirtualBox系统边框 3.VirtualBox如何开启无缝模式 3.Ubuntu如何查询软件是否已经安装 一、实验 1.安…

react二次封装Modal和Drawer组件

目录 react二次封装Modal和Drawer组件01&#xff1a;Modal组件01-1 BaseModal.jsx01-2 使用BaseModal组件01-3 效果 02&#xff1a;Drawer组件02-1 BaseDrawer.jsx组件02-2 使用BaseDrawer组件02-3效果 react二次封装Modal和Drawer组件 npm i styled-components 01&#xff1…

移除元素、合并两个有序数组(leetcode)

一、移除元素 思路三&#xff1a; while(src<numsSize) 使用一个 while 循环来遍历数组。循环的条件是 src 必须小于 numsSize&#xff0c;以确保不会越界。 if(nums[src]!val) 如果当前 src 指向的元素不等于给定的值 val&#xff0c;则执行以下操作&#xff1a; nums[ds…

[RoFormer]论文实现:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING

文章目录 一、完整代码二、论文解读2.1 注意力机制2.2 绝对位置编码2.3 相对位置编码2.4 旋转位置编码Long-term decayAdaption for linear attention 2.5 模型效果 三、过程实现四、整体总结 论文&#xff1a;ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING …

Java 使用itextpdf创建Pdf文件

DOM文件添加Maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.0</version><type>pom</type></dependency> 主要代码&#xff1a; PdfFont font PdfFo…

yo!这里是智能指针相关介绍

目录 前言 内存泄漏 RAII 智能指针原理 智能指针分类 auto_ptr unique_ptr shared_ptr 两个问题 线程安全 循环引用 后记 前言 对于智能指针&#xff0c;听起来很高大上&#xff0c;其实本质上就是一个类。为什么叫指针呢&#xff1f;因为可以像指针一样管理一块资…

linux 应用开发笔记---【I/O文件/基础篇 】

文章笔记来自于【速学Linux】手把手教你学嵌入式Linux C应用编程_哔哩哔哩_bilibili 一&#xff0c;什么是linux应用程序 1.运行在linux操作系统用户空间的程序 2.内核程序运行在内核空间&#xff0c;应用程序运行在用户空间 在终端执行的命令ls,ps。。。。。。都是运行在用…

【MySQL的DQL查询语句】

MySQL的DQL查询语句-----在Navicat下 将学生表导入Navicat中查询语句查询一整张表查询年龄大于22年龄大于22的女生查找文科的学生查找六班的学生计算学生的总分 &#xff08;group by&#xff09;合并两表 &#xff08;join on xxxx&#xff09;合并两张表 并求总分先合并在聚合…

Java+springboot+avue医院绩效考核系统源码支持二次开发

公立医院改革要求建立公立医疗卫生机构绩效考核体系&#xff0c;借助绩效考核来引导各级公立医院把社会效益摆在首位&#xff0c;提高医疗服务质量&#xff0c;规范医疗服务行为&#xff0c;加强医院内部管理&#xff0c;促进医院高质量发展 医院绩效考核系统&#xff0c;建立以…

python 运用pandas 库处理excel 表格数据

文章目录 读取文件查看数据数据选择数据筛选创建新列计算并总结数据分组统计 读取文件 Pandas 是一个强大的数据分析库&#xff0c;它提供了丰富的数据结构和数据分析工具&#xff0c;其中之一是用于读取不同格式文件的 read_* 函数系列。以下是一个简单介绍如何使用 Pandas 读…

Siemens-NXUG二次开发-C/C++/Python环境配置[20231204]

Siemens-NXUG二次开发-C/C/Python运行方式[20231204] 1.NX/UG C/C/Python API官方开发文档2.运行方式2.1内部模式2.2 外部模式2.3 许可证书服务器启动 3.C/C环境配置4.Python环境配置5.第三方环境配置 1.NX/UG C/C/Python API官方开发文档 西门子NX/UG Python api开发文档&…

Spring学习笔记:Day2

昨天定的学习计划发现通过文心4.0来实现不靠谱&#xff0c;坑太多&#xff0c;今天开始跟随B站进行学习&#xff0c;争取10-15天学习一遍&#xff0c;冲啊&#xff01; 地址&#xff1a;001-课程介绍_哔哩哔哩_bilibili 今日规划&#xff1a; pt 001 - pt 018&#xff0c;提到…