【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…

柔性数组(Flexible Array Members)在C语言中的应用

什么是柔性数组&#xff1f; 在C语言中&#xff0c;柔性数组&#xff08;Flexible Array Members&#xff0c;FAMs&#xff09;是C99标凈引入的一种便捷的数据结构&#xff0c;用于声明具有可变大小数组的结构体。柔性数组通常用于当结构体的大小在编译时不确定&#xff0c;但…

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

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

浅析SD-WAN技术如何加强企业网络安全

在这个数字化时代&#xff0c;企业组网的安全性已经成为许多企业所面临的一个重要挑战。特别是随着云计算、移动办公等新型信息技术的普及&#xff0c;企业网络的规模和复杂度不断增加&#xff0c;网络攻击和数据泄露的威胁也日益增加。因此&#xff0c;企业需要采取更加有效的…

西南科技大学C++程序设计实验三(类与对象二)

一、实验目的 1.理解类的复制构造函数的定义、说明与使用 2.扩充类的数据成员,为其增加静态数据成员、常(const)成员、其他类定义的成员等 3.理解组合类的相关知识点 二、实验任务 阅读分析、完善程序。下面是一个学生类student的定义,数据成员包括一个代表姓名字符个数的…

23.12.3日总结

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

c语言编程题经典100例——(61~65例)

1&#xff0c;写一个函数&#xff0c;判断一个数是否为正数。 #include <stdio.h> #include <stdbool.h> bool isPositive(int num) { if (num > 0) { return true; } else { return false; } }int main() { int num, cube; printf("请输入一个…

初始化 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 一…

c++遍历算法的transform算法

transform 算法函数用于对指定范围内的元素进行一个操作&#xff0c;并将结果存储到另一个范围中。 template<class InputIterator, class OutputIterator, class UnaryOperation> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator r…

共享智能指针shared_ptr

共享智能指针 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&#xff08;smart pointer&#xff09;。智能指针是存储指向动态分配&#xff08;堆&#xff09;对象指针的类&#xff0c;…

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

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

C++ 智能指针和内存管理:使用指南和技巧

C是一门强大的编程语言&#xff0c;但是在内存管理方面却存在着一些问题。手动管理内存不仅费时费力&#xff0c;而且容易出错。因此&#xff0c;C中引入了智能指针这一概念&#xff0c;以更好地管理内存。 什么是智能指针&#xff1f; 在C中&#xff0c;内存的分配和释放都是…

AttributeError: ‘FieldInfo‘ object has no attribute ‘required‘.

诸神缄默不语-个人CSDN博文目录 这个bug是在安装doccano包之后&#xff0c;在运行transformers代码时出现的。 核心报错信息&#xff1a; RuntimeError: Failed to import transformers.models.bert.modeling_bert because of the following error (look up to see its trac…

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…

服务器入侵如何防护,业务被攻击如何处理,服务器安全防护方案

服务器是算是家用电脑的一种使用方法,主机不在用户家中,需要远程使用,在目前互联网时代占用很重要的位置&#xff0c;当然生活中也是应用广泛。服务器比普通计算机运行更快、负载更高、价格更贵。很多娱乐,工作都需要依靠服务器来运行整个体系&#xff0c;因此服务器的安全防护…

虚拟化逻辑架构: 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.安…

SCAU:主对角线上的元素之和

主对角线上的元素之和 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 输入一个3行4列的整数矩阵&#xff0c;计算并输出主对角线上的元素之和输入格式 3行4列整数矩阵输出格式 主对角线上的元素之和输入样例 1 2 3 4 5 6 7 8 9 10 11 12输出…

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…