Java基础之集合类

Java基础之集合类

  • 一、集合的框架
    • 1.1、集合概述
    • 1.2、集合与数组区别
    • 1.3、数组的缺点:
    • 1.4、常用集合分类
    • 1.5、Collection常用方法
  • 二、List集合
    • 2.1、ArrayList
    • 2.2、LinkedList
    • 2.3、Vector
    • 2.4、区别
  • 三、Set集合
    • 3.1、HashSet集合
    • 3.2、LinkedHashSet集合
    • 3.3、TreeSet集合
  • 四、Map集合
    • 4.1、HashMap
    • 4.2、TreeMap
    • 4.3、HashTable

一、集合的框架

1.1、集合概述

所有的集合类和集合接口都在java.util包下。在内存中申请一块空间用来存储数据,在Java中集合就是替换掉定长的数组的一种引用数据类型。

1.2、集合与数组区别

区别集合数组
长度大小可以变,用多少空间拿多少空间。长度固定,定义长了造成内存空间的浪费
定义短了不够用。
内容能存储引用数据类型(存储的为对象的内存地址)存储基本数据类型和引用数据类型
元素可以存储不同类型数据
(一般情况下也只存储同一种类型的数据)
只能存储同一种类型成员

1.3、数组的缺点:

  1. 数组一旦初始化长度、类型就不能再改变了,只能按照初始化的数据类型和长度进行存储数据了。
  2. 数组中提供的方法比较有限,对于数据的增删改查操作不方便,并且效率也不太高。
  3. 可以存储重复的值,并且有序特点单一。

1.4、常用集合分类

在这里插入图片描述


Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

注意:

①List接口,用于存储有序的、可重复的数据(可以想象成动态的数组)

②Set接口,存储无序的、不可重复的数据(类似于高中的集合)

//Collection源码如下
public interface Collection<E> extends Iterable<E> {

1.5、Collection常用方法

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class CollectionExample {public static void main(String[] args) {// 创建一个ArrayListCollection<String> stringList = new ArrayList<>();// 添加元素stringList.add("Apple");stringList.add("Banana");stringList.add("Orange");// 获取集合大小int size = stringList.size();System.out.println("Size: " + size);// 判断集合是否为空boolean isEmpty = stringList.isEmpty();System.out.println("Is Empty: " + isEmpty);// 判断集合是否包含元素boolean containsBanana = stringList.contains("Banana");System.out.println("Contains Banana: " + containsBanana);// 删除元素boolean removed = stringList.remove("Orange");System.out.println("Removed Orange: " + removed);// 获取集合迭代器并遍历Iterator<String> iterator = stringList.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println("Element: " + element);}// 添加多个元素Collection<String> anotherList = new ArrayList<>();anotherList.add("Grapes");anotherList.add("Pineapple");stringList.addAll(anotherList);// 转换为数组Object[] array = stringList.toArray();System.out.println("Array: " + java.util.Arrays.toString(array));// 清空集合stringList.clear();System.out.println("Size after clear: " + stringList.size());}
}

二、List集合

2.1、ArrayList

//ArrayList构造方法
public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。    
public ArrayList()      //默认构造一个初始容量为10的空列表。    
public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表

代码示例:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {// 创建 ArrayListList<String> arrayList = new ArrayList<>();// 添加元素arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Orange");// 获取元素String firstElement = arrayList.get(0);System.out.println("First Element: " + firstElement);// 修改元素arrayList.set(1, "Grapes");// 删除元素arrayList.remove("Orange");// 获取 ArrayList 大小int size = arrayList.size();System.out.println("Size: " + size);// 判断是否包含某个元素boolean containsBanana = arrayList.contains("Banana");System.out.println("Contains Banana: " + containsBanana);// 遍历 ArrayList(使用增强 for 循环)System.out.println("Iterating using enhanced for loop:");for (String fruit : arrayList) {System.out.println(fruit);}// 遍历 ArrayList(使用迭代器)System.out.println("Iterating using Iterator:");Iterator<String> iterator = arrayList.iterator();while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);}// 转换为数组Object[] array = arrayList.toArray();System.out.println("Array: " + java.util.Arrays.toString(array));// 清空 ArrayListarrayList.clear();// 判断是否为空boolean isEmpty = arrayList.isEmpty();System.out.println("Is Empty: " + isEmpty);}
}

2.2、LinkedList

LinkedList 是 Java 集合框架中 List 接口的另一个实现,基于链表实现。相比于 ArrayListLinkedList 在插入和删除元素的操作上更为高效,但在随机访问方面较慢。

代码示例:

import java.util.LinkedList;
import java.util.Iterator;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {// 创建 LinkedListList<String> linkedList = new LinkedList<>();// 添加元素linkedList.add("Apple");linkedList.add("Banana");linkedList.add("Orange");// 获取元素String firstElement = linkedList.get(0);System.out.println("First Element: " + firstElement);// 修改元素linkedList.set(1, "Grapes");// 删除元素linkedList.remove("Orange");// 获取 LinkedList 大小int size = linkedList.size();System.out.println("Size: " + size);// 判断是否包含某个元素boolean containsBanana = linkedList.contains("Banana");System.out.println("Contains Banana: " + containsBanana);// 遍历 LinkedList(使用增强 for 循环)System.out.println("Iterating using enhanced for loop:");for (String fruit : linkedList) {System.out.println(fruit);}// 遍历 LinkedList(使用迭代器)System.out.println("Iterating using Iterator:");Iterator<String> iterator = linkedList.iterator();while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);}// 转换为数组Object[] array = linkedList.toArray();System.out.println("Array: " + java.util.Arrays.toString(array));// 清空 LinkedListlinkedList.clear();// 判断是否为空boolean isEmpty = linkedList.isEmpty();System.out.println("Is Empty: " + isEmpty);}
}

以下情况使用 ArrayList :

  • 频繁访问列表中的某一个元素。
  • 只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList :

  • 你需要通过循环迭代来访问列表中的某些元素。
  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

2.3、Vector

//构造方法
public Vector()//使用指定的初始容量和等于0的容量增量构造一个空向量。    
public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。   
public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量    
public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量    

代码示例

import java.util.Vector;
import java.util.Enumeration;public class VectorExample {public static void main(String[] args) {// 创建 VectorVector<String> vector = new Vector<>();// 添加元素vector.add("Apple");vector.add("Banana");vector.add("Orange");// 获取元素String firstElement = vector.get(0);System.out.println("First Element: " + firstElement);// 修改元素vector.set(1, "Grapes");// 删除元素vector.remove("Orange");// 获取 Vector 大小int size = vector.size();System.out.println("Size: " + size);// 判断是否包含某个元素boolean containsBanana = vector.contains("Banana");System.out.println("Contains Banana: " + containsBanana);// 遍历 Vector(使用增强 for 循环)System.out.println("Iterating using enhanced for loop:");for (String fruit : vector) {System.out.println(fruit);}// 遍历 Vector(使用 Enumeration)System.out.println("Iterating using Enumeration:");Enumeration<String> enumeration = vector.elements();while (enumeration.hasMoreElements()) {String fruit = enumeration.nextElement();System.out.println(fruit);}// 转换为数组Object[] array = vector.toArray();System.out.println("Array: " + java.util.Arrays.toString(array));// 清空 Vectorvector.clear();// 判断是否为空boolean isEmpty = vector.isEmpty();System.out.println("Is Empty: " + isEmpty);}
}

2.4、区别

ArrayListLinkedListVector
实现方法动态数组双向链表动态数组
线程是否安全非线程安全非线程安全线程安全
适用场景适用于需要频繁随机访问元素,而且不涉及多线程的场景。适用于需要频繁插入和删除元素的场景,但不涉及多线程。由于线程安全性带来的性能损失,不推荐在单线程环境下使用。

(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

在多线程环境下,如果需要线程安全,可以考虑使用 Collections.synchronizedList() 来包装 ArrayListLinkedList

三、Set集合

Set 是 Java 集合框架中的一种接口,它代表无序、不允许重复元素的集合。需要实现类来进行操作。

特点:

  • 不允许有重复的值
  • 没有索引(不能使用普通for循环进行遍历)

3.1、HashSet集合

特点:

  • 底层结构为“哈希表”
  • 集合对读写顺序不做保证
  • 允许有null值
  • Set集合内容不允许重复
  • 没有索引

HashSet 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashSet; // 引入 HashSet 类

以下实例我们创建一个 HashSet 对象 sites,用于保存字符串元素:

HashSet<String> sites = new HashSet<String>();

代码示例:

import java.util.HashSet;/*** @BelongsProject: Test* @BelongsPackage: PACKAGE_NAME* @Author: Jorya* @CreateTime: 2023-11-22  16:20* @Description: TODO* @Version: 1.0*/
public class HashSetTest {public static void main(String[] args) {HashSet<String> sites = new HashSet<String>();sites.add("Google");sites.add("Jorya");sites.add("Taobao");sites.add("Zhihu");sites.add("Jorya");  // 重复的元素不会被添加System.out.println(sites.size());//计算元素数量System.out.println(sites);System.out.println(sites.contains("Taobao"));//truesites.remove("Taobao");  // 删除元素,删除成功返回 true,否则为 falsesites.clear();//删除集合所有元素}
}

3.2、LinkedHashSet集合

特点:

  • LinkedHashSet是哈希表和链表实现的Set接口,具有可预测的读写顺序。

  • 有链表来保证元素有序

  • 有哈希表来保证元素的唯一性

import java.util.HashSet;
public class LinkedHashSetTest {public static void main(String[] args) {LinkedHashSet<String> sites = new LinkedHashSet<String>();sites.add("Google");sites.add("Jorya");sites.add("Taobao");sites.add("Zhihu");sites.add("Jorya");  // 重复的元素不会被添加System.out.println(sites);}
}

3.3、TreeSet集合

特点:

  • 集合底层是二叉树
  • TreeSet集合中的元素,和TreeMap集合中的key部分一样
  • 元素是无序不可重复、可以按照大小顺序自动排序

四、Map集合

Map键值对集合,集合中按Key-Value键值对方式存储

在这里插入图片描述

4.1、HashMap

特点:

  • 无序,key不可重复
  • key,value都可以为null, key为null的时候存储在HashMap的第一个位置
  • 当key相同时,新的value会覆盖旧的value

4.2、TreeMap

特点:

  • 底层是红黑树 ,无序 key不可重复
  • 存储映射的关系过程中,需要key使用 自然排序或传递比较器(比较器根据key进行排序)
  • key不能为null ,value可以为null
  • 添加相同 key 时,新的value会覆盖旧的value(底层:自然排序的compareTo() 或比较器compare()
  • 方法返回值为0,调用t.setValue(value),实现新的值覆盖旧的值)

4.3、HashTable

特点:

  • 无序、key不可重复
  • key,value不可为空

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

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

相关文章

Qt 网络通信

获取本机网络信息 &#xff08;1&#xff09;在 .pro 文件中加入 QT network&#xff08;2&#xff09; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QLabel> #include <QLineEdit> #include <QPu…

C#中openFileDialog控件的使用方法

目录 一、OpenFileDialog基本属性 二、使用 OpenFile 从筛选的选择中打开文件 1.示例源码 2.生成效果 3. 其它示例 三、使用 StreamReader 以流的形式读取文件 1.示例源码 2.生成效果 四、一种新颖的Windows窗体应用文件设计方法 在C#中&#xff0c;OpenFileDialog控件…

vue3+tsx的使用

<template><div><xiaoman on-click"getItem" name"似懂非懂"></xiaoman></div> </template><script setup langts>import xiaoman from "./App"const getItem(item:any)>{console.log(item,it…

redis引发的一次生产事故,内存爆满

redis引发的一次生产事故 问题描述&#xff1a; 发版后回归测试&#xff0c;不定时出现token失效&#xff0c;导致自动退出到登录界面。如果操作的人员较多&#xff0c;token失效的就比较快&#xff0c;操作的人员较少token失效的相对较慢。 问题复现&#xff1a; 同一账号…

《C++PrimePlus》第10章 对象和类

10.1 过程性编程和面向对象编程 10.2 抽象和类 10.3 类的构造函数和析构函数 类的定义和使用&#xff08;买卖股票&#xff09; 头文件stock10.h #ifndef __STOCK00__H__ #define __STOCK00__H__#include <string>class Stock { // pravate的内容只能通过public访问 p…

js用到的算法

1.对象数组中&#xff0c;对象中有对象&#xff0c;数组根据对象中的对象打平 [{indexValueMap: { 68443: 0, 68457: 0 },rowName1: 固定收益类,rowName2: 交易类,rowName3: 次级},{indexValueMap: { 68443: 0, 68457: 0 },rowName1: 固定收益类,rowName2: 交易类,rowName3: 中…

虚幻学习笔记—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2&#xff0c;两种方式分别为&#xff1a;点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件&#xff1a;这一步很重要&#xff0c;如图2.1.1所示&#xff1a;在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

nacos集群开箱搭建-linux版本搭建

原创/朱季谦 nacos是一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台&#xff0c;简单而言&#xff0c;它可以实现类似zookeeper做注册中心的功能&#xff0c;也就是可以在springcloud领域替代Eureka、consul等角色&#xff0c;同时&#xff0c;还可以充当spri…

activiti工作流 定义 TaskListener 无效

使用activiti 5.22 想全局定义任务监听器&#xff0c;结果试了多次发现没有效果。 最后看了看activiti的相关源码发现&#xff0c;流程定义里边没有处理 TaskListener 相关的操作&#xff0c;发现TaskListener 处理是在Task里边处理的&#xff0c;所以把TaskListener 定义在Ta…

【ISP】噪声--sensor(2)

1.热噪声 也叫KT/C噪声&#xff0c;或者叫暗电流噪声。电子的热运动的导致&#xff0c;温度上升&#xff0c;噪声增大。 2.FPN固定模式噪声 由于每个像素点的元器件制造的会有偏差&#xff0c;也就是这些器件的工作参数相对理论值的漂移就构成一种固定模式噪声。 3.光子散粒噪…

Springboot+vue的客户关系管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的客户关系管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的客户关系管理系统&#xff0c;采用M&#xff08…

fastjson和jackson序列化的使用案例

简单记录一下一个fastjson框架和jackson进行序列化的使用案例&#xff1a; 原json字符串&#xff1a; “{“lockCount”:”{1:790,113:1,2:0,211:0,101:1328,118:8,137:0,301:0,302:0}“,“inventoryCount”:”{1:25062,113:2,2:10000,211:2,101:11034,118:9,137:40,301:903914…

Python实现定时任务的方案及其比较

目录 一、引言 二、基于time模块的定时任务 三、基于schedule库的定时任务 四、基于APScheduler库的定时任务 五、基于Celery库的定时任务 七、总结与比较 一、引言 在Python中&#xff0c;定时任务指的是在特定的时间间隔或者特定的时间点自动执行某些操作的任务。定时…

十大排序之冒泡排序与快速排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;冒泡排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现&#x1f387;4.代码优化&#xff08;添加标志量&#xff09; …

前端向后端传JSON数据,使用MyBatis查询

form中向后端传的是空字符串&#xff0c;并不是null 而在MyBatis的判断中应判断是否为空字符串&#xff0c;而并非null

【Rxjava详解】(四)线程切换

lift()变换原理 这些变换虽然功能各有不同&#xff0c;但实质上都是针对事件序列的处理和再发送。而在RxJava的内部&#xff0c;它们是基于同一个基础的变换方法&#xff1a;lift()。 首先看一下lift() 的内部实现&#xff08;仅显示了部分主要逻辑代码): public <R> …

盘点43个Android项目源码安卓爱好者不容错过

盘点43个Android项目源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1yHmkUeX4vxVag9Yr0yeQRg?pwd8888 提取码&#xff1a;8888 项目名称 Android NDK直播项…

Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))

目录 Lambda表达式 省略写法(要看懂) 正则表达式 语法 案例 正则表达式的搜索替换和分割内容 集合进阶 集合体系结构 Collection Collection的遍历方式 迭代器 增强for循环 Lambda表达式遍历Collection List集合 ArrayList LinkedList 哈希值 HashSet底层原理 …

(附源码)springboot电影售票系统小程序 计算机毕设36991

目 录 摘要 1 绪论 1.1课题目的与意义 1.2研究背景 1.3论文结构与章节安排 1.4小程序框架以及目录结构介绍 2 springboot电影售票系统小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据…

Elasticsearch集群部署

服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.57centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示例节点&#xff1a;10.3.145…