Java基础语法(十五):List、Set和Map

news2024/9/25 11:11:59

目录

前言

一、List

二、Set

三、Map

总结


前言

Java是一种很流行的编程语言,拥有很多被广泛应用的数据结构,其中List、Set和Map是最常用的几个。本文将为您介绍这三种数据结构的基本概念和用法。

从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象

  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。


一、List

List是一种有序的数据集合,允许重复元素。它是一个接口,由Java提供,可以通过实现它的类来建立一个List实例。List接口的方法包括添加、插入、删除、替换和获取元素。

List接口提供了如下几种常用的实现:

  • ArrayList:基于数组实现,支持快速随机访问,但是对于插入和删除操作较慢。
  • LinkedList:基于链表实现,支持快速的插入和删除操作,但是对于随机访问的效率较低。
  • Vector:类似于ArrayList,但是是线程安全的,不过效率较低,不推荐使用。

代码示例:

import java.util.*;
 
public class Test{
 public static void main(String[] args) {
     List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用 For-Each 遍历 List
     for (String str : list) {            //也可以改写 for(int i=0;i<list.size();i++) 这种形式
        System.out.println(str);
     }
 
     //第二种遍历,把链表变为数组相关的内容进行遍历
     String[] strArray=new String[list.size()];
     list.toArray(strArray);
     for(int i=0;i<strArray.length;i++) //这里也可以改写为  for(String str:strArray) 这种形式
     {
        System.out.println(strArray[i]);
     }
     
    //第三种遍历 使用迭代器进行相关遍历
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())//判断下一个元素之后有值
     {
         System.out.println(ite.next());
     }
 }
}

二、Set

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。

Set接口提供了如下几种常用的实现:

  • HashSet:基于哈希表实现,性能比较高,但是不保证元素的顺序。
  • TreeSet:基于红黑树实现,保证元素的顺序,但是性能相对较低。
  • LinkedHashSet:基于哈希表和链表实现,保证元素的插入顺序。

代码示例:

public static void main(String[] args) {

    Set<String> set = new HashSet<String>();
    set.add("A");
    set.add("B");
    set.add("C");

    List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12));
    Set<Integer> sets = new HashSet<>(16);
    sets.addAll(list);

    //foreach遍历
    System.out.println("\n遍历1: foreach:");
    for (Integer i : sets) {
        System.out.print(i + " ");
    }

    //iterator遍历
    System.out.println("\n遍历2: iterator:");
    Iterator<Integer> iterator = sets.iterator();
    while (iterator.hasNext()) {
        System.out.print(iterator.next() + " ");
    }

    //stream流遍历
    System.out.println("\n遍历3: stream流");
    sets.forEach(s -> System.out.print(s + " "));

    //for循环遍历
    System.out.println("\n遍历4:for循环");
    Iterator<Integer> iterator2 = sets.iterator();
    for (int i = 0; i < sets.size(); i++) {
        System.out.print(iterator2.next() + " ");
    }
    
	// forEachRemaining:底层实现while (hasNext()) action.accept(next());  
	System.out.println("\n遍历5:forEachRemaining");
    sets.iterator().forEachRemaining(s -> System.out.print(s + " "));

}

三、Map

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。每个元素都包含一个键和一个值,键不能重复。

Map接口提供了如下几种常用的实现:

  • HashMap:基于哈希表实现,性能比较高,但是不保证元素的顺序。
  • TreeMap:基于红黑树实现,保证元素的顺序,但是性能相对较低。
  • LinkedHashMap:基于哈希表和链表实现,保证元素的插入顺序。

代码示例:

import java.util.*;
 
public class Test{
     public static void main(String[] args) {
      Map<String, String> map = new HashMap<String, String>();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
      
      //第一种:普遍使用,二次取值
      System.out.println("通过Map.keySet遍历key和value:");
      for (String key : map.keySet()) {
       System.out.println("key= "+ key + " and value= " + map.get(key));
      }
      
      //第二种
      System.out.println("通过Map.entrySet使用iterator遍历key和value:");
      Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
      while (it.hasNext()) {
       Map.Entry<String, String> entry = it.next();
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
      
      //第三种:推荐,尤其是容量大时
      System.out.println("通过Map.entrySet遍历key和value");
      for (Map.Entry<String, String> entry : map.entrySet()) {
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
    
      //第四种
      System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
      for (String v : map.values()) {
       System.out.println("value= " + v);
      }
     }
}


总结

List、Set和Map 都是 Java 中的常用数据结构,它们各自具有不同的特点和应用场景。当需要存储有序的、可重复的元素时,可以使用 List;当需要存储无序的、不可重复的元素时,可以使用 Set;当需要存储键值对时,可以使用 Map。

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

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

相关文章

企企通携手「大自然家居」,启动供应链与采购数字化项目启动

“大自然家居_我爱大自然”。健康环保&#xff0c;是大自然家居独特价值&#xff0c;也是大自然发展的DNA。 当大家对家居行业还停留在低效耗能、环境污染的传统印象时&#xff0c;作为“亚洲品牌500强”的「大自然家居&#xff08;中国&#xff09;有限公司」&#xff08;以下…

【LLM系列之FLAN-T5/PaLM】Scaling Instruction-Finetuned Language Models

论文题目&#xff1a;《Scaling Instruction-Finetuned Language Models》 论文链接&#xff1a;https://arxiv.org/pdf/2210.11416.pdf github链接&#xff1a;https://github.com/google-research/text-to-text-transfer-transformer#released-model-checkpoints huggingface…

量子计算(13)基础知识4:量子测量

量子测量是量子电路中最后一个元素&#xff0c;在电路中我们经常用到。下面&#xff0c;我将描述量子测量的数学依据以及与量子测量相关的科学定理。 目录 一、量子测量 1、理论知识 2、计算基下测量单量子比特 二、两个原理 1、延迟测量原理 2、隐含测量原理 一、量子测…

RDA5850蓝牙多合一芯片之测试与调试

上次说到一款比较经典的蓝牙芯片《一款非常经典的蓝牙多媒体芯片RDA5850》,于是就用那块二手音箱小板来试试能不能调通。首先看芯片手册发现 有HST_TXD和HST_RXD两个引脚。通过以往的经验就可以分析出 这两个就是用来调试烧写的引脚。 再看前篇文章(同下图)的引脚分布,同样…

[论文笔记]SimMIM:a Simple Framework for Masked Image Modeling

文章地址&#xff1a;https://arxiv.org/abs/2111.09886 代码地址&#xff1a;https://github.com/microsoft/SimMIM 文章目录 摘要文章思路创新点文章框架Masking strategyPrediction headPrediction targetEvaluation protocols 性能实验实验设置Mask 策略预测头目标分辨率预…

科大讯飞股价迅飞 大模型逊色

5月8日&#xff0c;科大讯飞的股价开盘后放量涨停&#xff0c;报63.86元。5月6日&#xff0c;这家公司赶在A股周末休市前一天发布了自家的自然语言大模型“讯飞星火认知大模型”&#xff08;以下简称“星火”&#xff09;。 自OpenAI发布GPT-4后&#xff0c;国内的百度、华为、…

Linux Crontab 使用详解

什么是 crontab&#xff1f; crontab 是一个定时执行任务的工具&#xff0c;在 Linux 系统中广泛使用。它可以让用户在指定的时间自动执行某个指令或脚本&#xff0c;例如自动备份数据、清除日志、定时运行程序等。 crontab 的工作原理 crontab 依赖于系统 crond 守护进程&a…

视频监控系统选择硬盘,绿盘、蓝盘、紫盘、黑盘、红盘到底选择哪个?

前言 随着科技的不断进步和安全意识的提高&#xff0c;视频监控系统越来越普及&#xff0c;同时对于视频存储设备的要求也越来越高。硬盘作为视频存储设备的核心部件之一&#xff0c;选择一款适合的硬盘是保证视频存储和播放效果的关键。但是&#xff0c;市面上各种类型的硬盘…

C++ 类的继承与派生

目录 1、继承的概念 2、继承&#xff08;Inherit&#xff09; 3、继承方式 4、父子同名成员并存 5、虚函数&#xff08;virtual&#xff09; 6、纯虚函数 1、继承的概念 以李白为例 类1是类2的基类&#xff08;父类&#xff09;&#xff0c;类2是类3的基类&#xff08;父类…

Java实现数组求和

1 问题 在日常生活中&#xff0c;我们有时需要求解一些数据的和&#xff0c;那么我们能否通过java写出一个程序计算出一串数组之和呢&#xff1f; 2 方法 采用while循环的方法&#xff0c;将每位数上每个数字单独提取出来进行相加 public class Sum { public static void ma…

有或没有共享组件团队

在许多组织里&#xff0c;有专门的团队来负责共享组件&#xff08;平台和中台都属于共享组件&#xff09;。同时会有多个业务/产品团队&#xff0c;他们都向共享组件团队提要求。下图显示了一种典型的情况。 与共享组件团队关联的最大痛苦是等待&#xff0c;由此导致更长的端到…

基于ChatGPT的视频智能摘要实战

随着在 YouTube 上提交的大量新视频&#xff0c;很容易感到挑战并努力跟上我想看的一切。 我可以与我每天将视频添加到“稍后观看”列表中的经历联系起来&#xff0c;只是为了让列表变得越来越长&#xff0c;实际上并没有稍后再看。 现在&#xff0c;像 ChatGPT 或 LLaMA 这样的…

常见信号质量问题、危害及其解决方法-信号完整性-过冲、噪声、回勾、边沿缓慢

概述 在电路设计中&#xff0c;“信号”始终是工程师无法绕开的一个知识点。不管是在设计之初&#xff0c;还是在测试环节中&#xff0c;信号质量问题都值得关注。在本文中&#xff0c;主要介绍信号相关的四类问题&#xff1a;信号过冲、毛刺&#xff08;噪声&#xff09;、回…

springboot第18集:SpringMVC我的春天

mybatis-spring http://mybatis.org/spring/zh/index.html mybatis-ehcache http://mybatis.org/ehcache-cache/ MVC是一种常用的软件设计规范&#xff0c;它将一个应用程序分为三个不同的部分&#xff1a;模型(Model)、视图(View)、控制器(Controller)。这三个部分相互协作&am…

计算机毕业论文内容参考|基于三维建模和卷积神经网络的人脸转正的技术设计

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计人脸转正方法卷积神经网络的训练和优化数据预处理技术实现总结与展望本文总结导文 基于java开发汽车销售系统资料 文章重点 摘要 在实际应用中,人脸图像往往具有旋转、…

基于线特征的图像配准

一、线特征提取 1.1 模板检测 使用模板在一幅图像上移动&#xff0c;他会对特定方向上的&#xff08;一个像素宽&#xff09;线响应强烈。下面是常见检测模板&#xff1a; 1.2 边缘检测 边缘检测的基本思想是使用如下两个准则之一找到图像中快速变换的位置&#xff1a; 1.…

Flutter框架:从入门到实战,构建跨平台移动应用的全流程解析

第一章&#xff1a;Flutter框架介绍 Flutter框架是由Google推出的一款跨平台移动应用开发框架。相比其他跨平台框架&#xff0c;Flutter具有更高的性能和更好的用户体验。本章将介绍Flutter框架的概念、特点以及与其他跨平台框架的比较&#xff0c;以及Flutter开发环境的搭建和…

MathGPT是什么,MathGPT与ChatGPT的区别是什么,MathGPT十大应用场景

MathGPT是一种基于自然语言处理技术的数学语言模型&#xff0c;其目的是通过自动化生成数学公式、证明和解题步骤等来辅助数学学习和研究。 与ChatGPT相比&#xff0c;MathGPT主要关注数学领域而非通用性的自然语言理解&#xff0c;因此其训练语料库和预测任务都与数学有关&…

Ubuntu20.04安装Vtk9.2.6+PCL1.12.1(成功无报错)

成功不报错的原因&#xff1a;VTK和PCL版本需要对应正确.. 错误可参考&#xff1a;Ubuntu20.04 编译 pcl1.8可能出现的问题 安装参考1&#xff1a;ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客 安装参考2&#xff1a;Ubuntu20.04 安装pcl详细教程_ubuntu20…

构造函数,析构函数,拷贝构造函数与运算符重载简图总结,赋值运算符重载与前置++后置++的重载参数区分

构造函数简图 析构函数简图 拷贝构造函数简图 运算符重载简图 赋值运算符重载与拷贝构造函数的区别 即为赋值运算符这涉及到两个已经存在的实例化对象之间的复制拷贝。这个与拷贝构造函数是完全不一样的&#xff0c;拷贝构造函数它的本质上就是一个构造函数&#xff0c;主要是用…