java集合 - list

OpenCV实战:如何用Debevec算法搞定相机响应函数(附完整代码) 本文详细介绍了如何使用OpenCV实现Debevec算法计算相机响应函数(CRF),并应用于HDR图像合成。通过完整的代码示例和工程实践问题解决方案,帮助开发者掌握从原理到实现的关键步骤,提升高动态范围成像和计算机视觉任务的处理能力。 阅读详情

目录

一、集合定义

二、java中的集合Collection

2.1 list

2.1.1 ArrayList:

2.1.2 LinkedList

2.1.3 ArrayList和LinkedList对比

2.1.4 创建list

2.1.5 遍历List

2.1.6 List和Array(数组)转换


一、集合定义

集合:在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。


二、java中的集合Collection

Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。Java的java.util包主要提供了以下三种类型的集合:

 

java.util包List可重复,有序。例如,按索引排列的Student的List;
 Set不重复,无序。
 Map通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。

Java集合设计有几个特点:

  • 一是实现了接口和实现类相分离,例如,有序表的接口是List,具体的实现类有ArrayList,LinkedList等;
  • 二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素,例如:
List<String> list = new ArrayList<>(); // 只能放入String类型
  • 最后,Java访问集合总是通过统一的方式——迭代器(Iterator)来实现,它最明显的好处在于无需知道集合内部元素是按什么方式存储的。

2.1 list

  • List:在集合类中,是最基础的一种集合:它是一种有序链表。
  • List的行为和数组几乎完全相同:List内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组一样,从0开始。
  • 数组的增删操作,实际是挪位置:数组和List类似,也是有序结构,如果我们使用数组,在添加和删除元素的时候,会非常不方便。例如,从一个已有的数组{'A', 'B', 'C', 'D', 'E'}中删除索引为2的元素:这个“删除”操作实际上是把'C'后面的元素依次往前挪一个位置,而“添加”操作实际上是把指定位置以后的元素都依次向后挪一个位置,腾出来的位置给新加的元素。这两种操作,用数组实现非常麻烦。
  •  

2.1.1 ArrayList:

实际上,ArrayList在内部使用了数组来存储所有元素。例如,一个ArrayList拥有5个元素,实际数组大小为6(即有一个空位):

size=5
┌───┬───┬───┬───┬───┬───┐
│ A │ B │ C │ D │ E │   │
└───┴───┴───┴───┴───┴───┘

当添加一个元素并指定索引到ArrayList时,ArrayList自动移动需要移动的元素:

size=5
┌───┬───┬───┬───┬───┬───┐
│ A │ B │   │ C │ D │ E │
└───┴───┴───┴───┴───┴───┘

然后,往内部指定索引的数组位置添加一个元素,然后把size加1:

size=6
┌───┬───┬───┬───┬───┬───┐
│ A │ B │ F │ C │ D │ E │
└───┴───┴───┴───┴───┴───┘

继续添加元素,但是数组已满,没有空闲位置的时候,ArrayList先创建一个更大的新数组,然后把旧数组的所有元素复制到新数组,紧接着用新数组取代旧数组:

size=6
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ F │ C │ D │ E │   │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

现在,新数组就有了空位,可以继续添加一个元素到数组末尾,同时size加1:

size=7
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ F │ C │ D │ E │ G │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

可见,ArrayList把添加和删除的操作封装起来,让我们操作List类似于操作数组,却不用关心内部元素如何移动。

2.1.2 LinkedList

实现List接口并非只能通过数组(即ArrayList的实现方式)来实现,另一种LinkedList通过“链表”也实现了List接口。在LinkedList中,它的内部每个元素都指向下一个元素:

        ┌───┬───┐   ┌───┬───┐   ┌───┬───┐   ┌───┬───┐
HEAD ──>│ A │ ●─┼──>│ B │ ●─┼──>│ C │ ●─┼──>│ D │   │
        └───┴───┘   └───┴───┘   └───┴───┘   └───┴───┘

2.1.3 ArrayList和LinkedList对比

 

 ArrayListLinkedList
获取指定元素速度很快需要从头开始查找元素
添加元素到末尾速度很快速度很快
在指定位置添加/删除需要移动元素不需要移动元素
内存占用少较大

2.1.4 创建list

1、使用ArrayList和LinkedList;

2、我们还可以通过List接口提供的of()方法,根据给定元素快速创建List:

List<Integer> list = List.of(1, 2, 5);

但是List.of()方法不接受null值,如果传入null,会抛出NullPointerException异常

 

2.1.5 遍历List

1、效率不高的for循环 + get方法:和数组类型一样,遍历一个List可以用for循环根据索引配合get(int)方法遍历;但这种方式并不推荐,一是代码复杂,二是因为get(int)方法只有ArrayList的实现是高效的,换成LinkedList后,索引越大,访问速度越慢。

import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<String> list = List.of("apple", "pear", "banana");
        for (int i=0; i<list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }
    }
}

2、效率较高,使用迭代器Iterator来访问List:Iterator本身也是一个对象,但它是由List的实例调用iterator()方法的时候创建的。Iterator对象知道如何遍历一个List,并且不同的List类型,返回的Iterator对象实现也是不同的,但总是具有最高的访问效率。

Iterator对象有两个方法:

  • boolean hasNext()判断是否有下一个元素
  • E next()返回下一个元素。
import java.util.Iterator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = List.of("apple", "pear", "banana");
        for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
            String s = it.next();
            System.out.println(s);
        }
    }
}

由于Iterator遍历是如此常用,所以,Java的for each循环本身就可以帮我们使用Iterator遍历。把上面的代码再改写如下,最常用遍历list代码:

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = List.of("apple", "pear", "banana");
        for (String s : list) {
            System.out.println(s);
        }
    }
}

实际上,只要实现了Iterable接口的集合类都可以直接用for each循环来遍历,Java编译器本身并不知道如何遍历集合对象,但它会自动把for each循环变成Iterator的调用,原因就在于Iterable接口定义了一个Iterator<E> iterator()方法,强迫集合类必须返回一个Iterator实例。

2.1.6 List和Array(数组)转换

  • list转换为数组

1、toArray()方法直接返回一个Object[]数组

2、toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中

3、通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法

  • 数组转换为list

1、把Array变为List就简单多了,通过List.of(T...)方法最简单:

Integer[] array = { 1, 2, 3 };
List<Integer> list = List.of(array);

 

  • 1、toArray()方法直接返回一个Object[]数组

这种方法会丢失类型信息,所以实际应用很少。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = List.of("apple", "pear", "banana");
        Object[] array = list.toArray();
        for (Object s : array) {
            System.out.println(s);
        }
    }
}
  • 2、toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中
public class Main {
    public static void main(String[] args) {
        List<Integer> list = List.of(12, 34, 56);
        Integer[] array = list.toArray(new Integer[3]);
        for (Integer n : array) {
            System.out.println(n);
        }
    }
}

注意到这个toArray(T[])方法的泛型参数<T>并不是List接口定义的泛型参数<E>,所以,我们实际上可以传入其他类型的数组,例如我们传入Number类型的数组,返回的仍然是Number类型:

public class Main {
    public static void main(String[] args) {
        List<Integer> list = List.of(12, 34, 56);
        Number[] array = list.toArray(new Number[3]);
        for (Number n : array) {
            System.out.println(n);
        }
    }
}

但是,如果我们传入类型不匹配的数组,例如,String[]类型的数组,由于List的元素是Integer,所以无法放入String数组,这个方法会抛出ArrayStoreException。

如果我们传入的数组大小和List实际的元素个数不一致怎么办?根据List接口的文档,我们可以知道:

如果传入的数组不够大,那么List内部会创建一个新的刚好够大的数组,填充后返回;如果传入的数组比List元素还要多,那么填充完元素后,剩下的数组元素一律填充null。

实际上,最常用的是传入一个“恰好”大小的数组:

Integer[] array = list.toArray(new Integer[list.size()]);
  • 3、通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法
Integer[] array = list.toArray(Integer[]::new);

 

注意:

返回的List不一定就是ArrayList或者LinkedList,因为List只是一个接口,如果我们调用List.of(),它返回的是一个只读List:

public class Main {
    public static void main(String[] args) {
        List<Integer> list = List.of(12, 34, 56);
        list.add(999); // UnsupportedOperationException
    }
}

对只读List调用add()、remove()方法会抛出UnsupportedOperationException。

C++ 核电站 问题描述 一个核电站有n个放核物质的坑,排列在一条直线上。如果连续m个坑中放入核物质就会发生爆炸,所以某些坑中不能放核物质。 本题的任务:对于给定的n和m,求不发生爆炸的放置核物质的方案总数。 输入格式 第一行两个正整数n和m,之间用一个空格隔开。2≤n≤50,2≤m≤5。 输出格式 一行一个正整数,表示方案总数。 输入样例 4 3 输出样例 13 数据规模与约定 2≤n≤50,2≤m≤5 CODE #include<bits/stdc++.h> using namespace 阅读详情

相关推荐

别再手动搬数据了!用rclone一键同步MinIO到华为云OBS的保姆级教程

本文详细介绍了如何使用rclone工具实现MinIO到华为云OBS的数据迁移,包括环境准备、双端配置、迁移前验证、实战迁移及后期监控等步骤。通过rclone的增量同步、断点续传等功能,确保数据迁移高效安全,特别适合需要跨云存储迁移的用户。

weixin_30839881的博客 524

ideallij使用备忘

1.快捷键 2.导入工程 3.导入工程后文件结构问题

Chloezhao的专栏 1863

USB 3.0 高清音视频采集芯片——MS2130

MS2130 是一款 USB 3.0 高清视频和音频采集芯片,内部集成 USB3.0 Device 控制器、数据收发模块、音视频处理模块。

YOU_SeMi的博客 7864

Intellij IDEA Debug调试技巧

1、这里以一个web工程为例,点击图中按钮开始运行web工程。

西楚小羽的专栏 7万+

Axure RP9汉化+授权全攻略:从下载到激活一步到位(附最新授权码)

本文提供Axure RP9从下载安装到界面汉化的完整指南,帮助设计师和产品经理快速上手这款原型设计工具。详细讲解了如何安全获取软件、执行汉化操作、理解核心界面布局,并介绍了创建交互原型和生成HTML文件的基础步骤,助力用户高效开展设计工作。

cuda7parallel的博客 1144

论文理解【LLM-OR】——【Step-Opt】Training LLMs for Optimization Modeling via Iterative Data Synthesis and

本文提出 Step-Opt-Instruct 方法,针对用 LLM 做 OR 问题求解任务,用迭代问题生成 + 分步验证机制实习更可靠的训练数据合成,从而微调开源 LLM 得到 Step-Opt。在多个 OR 建模基准提升性能,尤其在复杂问题上提升更明显

佚失的诗篇 806

ideallij之Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Filter

spring boot项目在eclipse能够启动,但是当你忍受不了eclipse或sts的慢时, 激情澎湃的将项目用ideallij启动时,有没有遇到这个磨人的小妖精: Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Filter ......   是不是很纳闷,为什么eclipse跑得好...

江黎 2554

从TTL到RS485:一颗CH342芯片搞定三种串口通信的硬件连接实战

本文详细介绍了CH342芯片在TTL、RS232和RS485三种串口通信模式下的硬件连接实战。通过精选的电路设计示例和配置技巧,展示了CH342在工业控制和智能硬件开发中的灵活应用,帮助开发者高效实现多协议通信,显著提升项目开发效率。

weixin_30709061的博客 509

List集合的定义和原理

1、List集合是有序的;2、List集合中可以有重复元素 (通过元素的equals方法来比较元素是否重复);3、List集合是一个带有索引的集合,可以通过索引来访问集合中的指定元素;特点:元素有放入顺序,元素可重复存储结构:底层采用数组实现的注意:①:数组的时间复杂度:查询时间复杂度是O(1),插入和删除的时间复杂度为O(N)②:add方法默认特性是从末尾插入数据,故ArrayList中的add插入方法的时间复杂度是O(1)。2、LinkedList 特点:元素有放入顺序,元素可重复,存储结构:底层采用

eg1107的博客 1120

同花顺PC端逆向解析:Hook注入与加密破解实战指南

在Windows客户端数据采集场景中,当常规HTTP爬虫失效时,内存级逆向分析成为获取实时行情数据的关键路径。其核心涉及进程注入、运行时解密、反调试绕过等底层技术,本质是理解PE加载机制、函数调用约定与内存保护策略的协同过程。同花顺作为典型加固客户端,采用ASPack加壳+自研解密+多线程校验三重防护,迫使开发者转向APC注入、动态密钥提取与XXTEA算法复刻等高阶手段。本文聚焦于DLL注入选型依据、解密函数定位方法及二进制Blob结构化解析,最终实现从内存读取到Pandas DataFrame的端到端数据

weixin_32234493的博客 1207

《计算机视觉:从入门到精通》技术手册 第1章 计算机视觉概述与历史演进

视觉感知与机器视觉在工程实践中常被混用,但二者存在本质差异。视觉感知强调对光学信号的语义理解与场景解释,核心在于从二维投影重建三维世界的物理与语义属性。该领域关注遮挡处理、光照变化、材质反射等复杂因素的建模,其目标是实现类似人类视觉系统的场景理解能力。机器视觉则侧重于工业场景中的精密测量与控制,通常基于结构化光源、已知几何约束与标定参数,执行边缘检测、尺寸测量、位置定位等任务。前者面向开放环境的通用理解,后者面向受控环境的精确执行。

u012133341的博客 269

基于HanLP和Java的汉语言处理包

*** 演示用户词典的动态增删*/// 动态增加CustomDictionary.add("攻城狮");// 强行插入CustomDictionary.insert("白富美", "nz 1024");// 删除词语(注释掉试试)// CustomDictionary.remove("攻城狮");System.out.println(CustomDictionary.add("单身狗", "nz 1024 n 1"));

毕业作品网站 5637

【系统分析师】第6章-基础知识:企业信息化(核心总结)

企业信息化是数字化转型的核心,涵盖战略规划、技术应用和实施路径等方面。关键内容包括ERP、CRM、SCM等系统的定义与实施,以及数据仓库、商业智能等技术的应用。备考系统分析师需掌握信息化战略规划方法(如BSP、SDP)、系统建模工具,并能分析解决信息孤岛等问题。论文可围绕ERP实施、数据仓库应用等主题展开。企业信息化面临组织变革、技术选型等挑战,但能显著提升运营效率和竞争力。

数据知道的博客 6934

java集合进阶篇-《List集合》

List集合与Collection集合的相同之处还是挺多的,不过有些小细节又不太一样,其中有一个挺有意思的地方,就是删除元素的那个地方,希望能够给大家讲明白。最近更新速度可能会特别的慢,希望大家多多理解。在Java中,List是一种常用的集合类型,它允许存储任意类型的对象,并且提供了按照插入顺序来维护元素的有序集合。List接口是 Java 集合框架的一部分,定义了可以用于任何列表实现的一组方法。List的主要实现包括ArrayListLinkedList和Vector(以及它的子类Stack。

欢迎大家一起讨论交流 1355

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Java集合】单列集合List详解

List接口属于单列集合Collection接口下的其中一条分支,它最常用的三个实现类分别是——。这三个实现类各有各的特点,但又有着一些相同的特性。本文将从List集合的介绍、特点、使用,再到它的三个常用实现类的底层源码分析,完完整整地梳理清楚List位于,是单列集合Collection接口下的一个子接口。接口不能直接被实例化,因此需要通过创建其子类对象来完成该接口的实例化(即多态List 接口最常用的3个子类有。本文以ArrayList类为例演示List接口中的常用方法。

m0_55908255的博客 1086

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中的集合——List集合

①.add(Object element) 向列表的尾部添加指定的元素。②.size() 返回列表中的元素个数。③.get(int index) 返回列表中指定位置的元素,index从0开始。 ④.add(int index, Object element) 在列表的指定位置(从0开始)插入指定元素 ⑤.set(int i, Object element) 使用元素element替换索引i位置的元素,并返回替换元素。 ⑥.clear() 从列表中移除所有元素。⑦.isEmpty() 判断列表是否

jukuya的博客 1386

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java—— List集合

本文介绍了Java中List集合的创建、核心操作及实际应用。List作为有序可重复集合,主要有ArrayList、LinkedList和Vector三种实现方式,分别适用于查询频繁、增删频繁和多线程场景。文章详细讲解了元素的添加、查询、删除和遍历方法,包括索引操作、批量处理及多种遍历方式的对比。在实际应用中,List常用于数据展示、批量操作、数据过滤排序等场景。通过性能对比实验和数据处理实战,可以深入理解不同List实现类的特性差异和灵活用法。

MEVREX的博客 1281

java集合体系——有序集合list

要学习有序集合list之前,首先我们要先知道java集合体系整体架构。集合体系被分为两大类,一是单列集合体系,二是双列集合体系,而今天要讲的有序集合list就属于Collection体系中最重要的一员,Collection体系结构如下图所示:list集合继承了Colleection的所有方法。

duehebfbf的博客 3320

Java 集合分页 Java List集合分页 List 分页 Java List集合笛卡尔积

在Java开发中,若单次展示的数据量太大,会造成程序响应缓慢,就需要用到分页功能,每一页展示一定量的数据,分多次展示...那么在List集合中,如何实现分页功能呢?本文将以3种方式,分别是。......

HaHa_Sir的博客 9565

Java集合之 List 集合

List 集合代表一个元素有序、可重复的集合,集合中的每个元素都有对应的顺序索引。 本文包含如下内容: java 8 改进的List 接口和 ListIterator 接口 ArrayList 和 Vector 实现类 固定长度的 List 1. java 8 改进的List 接口和 ListIterator 接口 List 作为 Collection 接口的子接口,当然可以使用 Collec...

黑白灰的博客 309

Java 集合之List

List是有序的集合,就像数组一样。而List可以理解为是一个长度可变的数组,而且提供了丰富的API。List集合底层就是数组。//创建一个List的集合//向末尾添加元素list.add("张三");//0list.add("李四");//1list.add("王五");//2//我们在1处的索引位置来插入元素,我们插入一个元素,该索引后面的元素都会向后一位list.add(1,"晁盖");//创建一个集合list1.add("一");list1.add("二");

rc1596919047的博客 1348

Java中List集合的面试试题及答案解析

Java集合类是Java编程中非常重要的一部分,主要用于存储和管理对象。以下是一些常见的Java集合类及其简要介绍:List接口Set接口Map接口Queue接口

HappyAcmen 3817

java集合List解析

作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求; Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。 Java集合主要由2大体系构成,...

weixin_30475039的博客 1105

Java中List集合的常用方法

10.Java中List集合的常用方法 List接口是继承Collection接口,所以Collection集合中有的方法,List集合也继承过来。 1、void add(int index, E element) 在指定位置插入元素,后面的元素都往后移一个元素。 public static void main(String[] args) { List list1 = new ArrayList<>(); list1.add("aaa"); list1...

Jiali的博客 1843

Java List 集合笔记

基于双向链表实现,适合频繁的插入和删除操作,尤其是在列表的开头或结尾进行操作时。接口的一个子接口,提供了许多有用的方法来操作集合中的元素。接口的一个子接口,提供了许多有用的方法来操作集合中的元素。接口是一个有序的集合,允许存储重复的元素,并且可以通过索引访问元素。是 Java 集合框架中的一个接口,用于存储不包含重复元素的集合。接口是一个有序的集合,允许存储重复的元素,并且可以通过索引访问元素。是 Java 集合框架中的一个接口,用于存储不包含重复元素的集合。不允许存储重复的元素。不允许存储重复元素。

2403_85083313的博客 1038

Java集合:List集合详解

本文摘要:本文系统介绍了Java集合框架中的Collection和List接口及其实现类。主要内容包括:1) Collection集合的特点、常用方法和遍历方式(迭代器、增强for、lambda);2) List集合的特有方法(索引操作)和五种遍历方式;3) ArrayList和LinkedList的底层实现原理(数组/链表结构)及特有方法;4) 数据结构基础(栈、队列、数组、链表);5) 重要源码分析(ArrayList扩容机制、LinkedList节点结构、迭代器原理)。文章通过代码示例详细演示了集合操

2301_79949064的博客 1061
上一篇: java访问修饰符号 - 作用域
下一篇: java基础知识总结 - 导航
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值