Java基础之集合类

news2025/2/22 2:51:35

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) {
        // 创建一个ArrayList
        Collection<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) {
        // 创建 ArrayList
        List<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));

        // 清空 ArrayList
        arrayList.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) {
        // 创建 LinkedList
        List<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));

        // 清空 LinkedList
        linkedList.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) {
        // 创建 Vector
        Vector<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));

        // 清空 Vector
        vector.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"));//true
        sites.remove("Taobao");  // 删除元素,删除成功返回 true,否则为 false
        sites.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.coloradmin.cn/o/1257426.html

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

相关文章

终于等到你!常用的组织架构图模板,高清图片一键导出

组织架构图是一种用来展示一个组织内部人员和职责关系的图表。通过组织架构图&#xff0c;我们可以清晰地了解一个组织的层级架构和各个部门之间的关系。在本文中&#xff0c;我们将向大家推荐8个常用的组织架构图模板&#xff0c;帮助你快速制作出专业的组织架构图。 1. 市场营…

数据结构——动态规划

动态规划&#xff1a;有很多重叠子问题&#xff0c;每一个状态一定是由上一个状态推导出来的 贪心&#xff1a;没有状态推导&#xff0c;而是从局部直接选最优的 动规五步曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 确定递推公式&#xff08;容…

招投标信息可以用CRM系统来查看吗?

对于B2B企业来说获客难、获客成本高是共识。做大客户的企业通过招投标获取商机是一个重要获客途径&#xff0c;然而传统方式管理招投标信息问题很多&#xff0c;例如资料丢失、手工录入出错、信息分散、信息查找费时费力。为了解决这些难题小编推荐CRM系统&#xff0c;CRM系统需…

非参数估计与参数估计的区别,以及详细列举了常用的非参数估计方法和参数估计方法,一网打尽非参数估计与参数估计!!!

文章目录 前言一、非参数估计与参数估计的区别二、常用的非参数估计方法三、常用的参数估计方法总结 前言 非参数估计和参数估计是统计学中的两种不同的估计方法。 一、非参数估计与参数估计的区别 参数估计是指&#xff0c;对于已知分布形式的数据&#xff0c;根据样本数据…

WinEdt打开.tex文件显示error reading错误

原因&#xff1a; 是因为.tex文件中包含了utf-8字符&#xff0c;而在打开的时候并没有指明utf-8打开方式 解决方法 在WinEdt中&#xff0c;【File】-【Open】&#xff08;或使用快捷键CtrlO&#xff09;&#xff0c;在弹出的打开对话框中&#xff0c;右下角【文件名】右侧有…

全面探讨HTTP协议从0.9到3.0版本的发展和特点

前言&#xff1a; 最近的几场面试都问到了http的相关知识点&#xff0c;博主在此结合书籍和网上资料做下总结。本篇文章讲收录到秋招专题&#xff0c;该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮…

EI期刊论文复现:考虑电动汽车可调度潜力的充电站两阶段市场投标策略程序代码!

本程序代码参考EI期刊论文《考虑电动汽车可调度潜力的充电站两阶段市场投标策略》&#xff0c;程序中基于历史数据评估可调度潜力&#xff0c;由联合报价模型确定节点边际电价&#xff0c;作为报价的参考&#xff0c;包含个体竞价模式&#xff0c;纳什博弈竞价&#xff0c;算例…

PC8231(CC/CV)5V/2.4A同步降压芯片 频率可调 限流欠压补偿

一&#xff0e;概述 PC8231 是一款同步降压转换器&#xff0c; 该转换器可驱动输出 2.4A 负载电流。 设计允许 PC8231 在 9V 到40V 宽输入电压范围内工作。通过将 COMP/EN 引脚逻辑电平拉低来实现外部关断功能&#xff0c;并进入待机模式。外部补偿使反馈控制环路具有良好的线…

相机内存卡照片删除怎么恢复?没有备份可这样操作

在使用相机时&#xff0c;不小心删除了重要的照片可能是每位摄影爱好者的噩梦。然而&#xff0c;通过一些恢复方法&#xff0c;我们有机会挽救被删除的照片。本文将详细介绍相机内存卡照片删除恢复的方法。 图片来源于网络&#xff0c;如有侵权请告知 如果您误删了相机内存卡中…

网络篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、说说 TCP 与 UDP 的区别,以及各自的优缺点二、说一下 HTTP 和 HTTPS 的区别三、说说HTTP、TCP、Socket 的关系是什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

在NAS上部署.NET版本的WOL远程开机服务

在本文中&#xff0c;我们将以部署基于.NET的WOL远程开机服务为例&#xff0c;详细介绍如何利用Docker技术在群辉部署ASP.NET服务。同时&#xff0c;我们还将展示如何对原有的控制台WOL进行改造&#xff0c;以及如何使用SignAuthorization简易URL验签类库。文章相关的代码开源地…

卤素灯和白炽灯哪个更护眼?精选高品质的护眼台灯

如果是放在以前&#xff0c;我觉得卤素灯会比白炽灯会眼一点。不过在如今这个高速发展的时代&#xff0c;灯源的迭代也经历了一轮又一轮&#xff0c;对于目前来说最护眼的还是LED护眼台灯 因为卤素灯和白炽灯产生的光线包含大量的红外线和紫外线&#xff0c;并且具有较高的亮度…

python树的孩子链存储结构

树的孩子链存储结构是一种树的存储方式&#xff0c;它使用孩子兄弟表示法来表示树的结构。在这种存储结构中&#xff0c;树的每个节点都有一个指向其第一个孩子的指针和一个指向其下一个兄弟的指针。这样&#xff0c;可以通过这些指针来表示树的层次结构和节点之间的关系。 具…

前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

前言 当我们重新部署前端项目的时候&#xff0c;如果用户一直停留在页面上并未刷新使用&#xff0c;会存在功能使用差异性的问题&#xff0c;因此&#xff0c;当前端部署项目后&#xff0c;需要提醒用户有去重新加载页面。 技术框架 vue、js、webpack 解决方案 编译项目时动…

C#、.net、asp.net 超快超简单(一看就会)将redis添加到自己的项目中

背景&#xff1a;凌晨两点&#xff0c;隔壁楼情侣闹得欢&#xff0c;本单身狗不服气&#xff0c;决定总结一下今晚添加到项目的redis。 我的使用场景&#xff1a;asp.net core web apivue3的项目中数据库的权限表是最经常读取的&#xff0c;所以权限表中的数据放到redis中最为…

java Swing UI设置统一字体大小

编写一个遍历组件设置字体大小的方法 public static void setUIFont() {Font f new Font("宋体", Font.PLAIN, 18);String names[] {"Label", "CheckBox", "PopupMenu", "MenuItem", "CheckBoxMenuItem", &quo…

基于springboot+Web实现社区医院管理服务系统项目【项目源码+论文说明】

基于springbootWeb实现社区医院管理服务系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括社区医院管理服务系统的网络应用&#xff0c;在外国线上管理系统已经是很普遍的方式&#xff0c;不过国内的管理系统可…

SAP是什么公司,开发什么系统软件?

SAP 是公司原德语名称 Systemanalyse Programmentwicklung 的首字母缩写&#xff0c;意思是系统分析程序开发 (System Analysis Program Development) 。现在&#xff0c;公司的注册名称为 SAP SE&#xff0c;其中 SE 代表 societas Europaea&#xff0c;是指根据欧盟公司法注册…

有关循环依赖和三级缓存的这些问题,你都会么?(面试常问)

一、什么是循环依赖 大家平时在写业务的时候应该写过这样的代码。 其实这种类型就是循环依赖&#xff0c;就是AService 和BService两个类相互引用。 二、三级缓存可以解决的循环依赖场景 如上面所说&#xff0c;大家平时在写这种代码的时候&#xff0c;项目其实是可以起来的&am…

leetcode:有效的括号

题目描述 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目给了我们三种括号&#xff1a;&#xff08;&#xff09;、{ }、[ ] 这里的匹配包括&#xff1a;顺序匹配和数量匹配 最优的思路就是用栈来解决&#xff1a; 括号依次入栈…