Java常用类:ArrayList类详解

LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试) 本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。 阅读详情

作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)

ArrayList

ArrayList其实就是维护了一个数组,使用扩容机制使其长度可变,可以把它想象成是一个数组的工具类,能够快速的改变数组的元素和长度。

1.成员变量

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
	//类中有一个成员变量是数组,维护的就是这个数组
	transient Object[] elementData;
	//长度,记录的也是数组的长度
	private int size;
	//默认容量,这个不是集合的初始容量,这个是扩容时用来比较是否需要扩容的
	private static final int DEFAULT_CAPACITY = 10;
	private static final Object[] EMPTY_ELEMENTDATA = {};
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
}

2.构造方法

三种:
1.public ArrayList(int initialCapacity);给定初始化容量创建对象
2.public ArrayList();直接创建对象
3.public ArrayList(Collection<? extends E> c) 给定Collection创建对象
第三种构造方法之前一直不知道有什么用,后来才知道,这个可以让其他集合类转为Arraylist

public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    public ArrayList(Collection<? extends E> c) {
        ...
    }

直接贴一小段我刚写的业务代码,实现将set转为Arraylist

public String getParam(Map<String,Object> map){
        String param = "";
        if(map!=null && map.size()>0){
            Set<String> keySet = map.keySet();
            //构造函数直接转
            List<String> list = new ArrayList<>(keySet);
        }
        return null;
    }

3.常用方法

1.添加元素和扩容方法

	public boolean add(E e) {
		//判断是否需要扩容
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //把元素放到数组最后,把size+1
        elementData[size++] = e;
        return true;
    }
	private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    //计算目前的最大容量
	private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }
	private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    private void grow(int minCapacity) {
        int oldCapacity = elementData.length;
        //扩大长度为原来的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        //最终是使用的Arrays.copyOf来实现数组的扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

指定初始容量的好处在于不需要频繁的扩容,在第一次调用add方法时,如果没有初始化容量时,数组的长度会变为默认长度10,当添加元素个数超过10就会扩容,而如果指定了大小则会超过指定大小才会进行扩容。
2.get、remove、clear方法

	public E get(int index) {
		//检查下标是否越界
        rangeCheck(index);

        return elementData(index);
    }
     E elementData(int index) {
     	//返回数组元素
        return (E) elementData[index];
    }
 	public E remove(int index) {
 		//检查下标是否越界
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
       	//将对应下标的元素设为null,长度-1
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }
    //清除集合里的所有元素
    public void clear() {
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
    }

特别注意下remove方法,移除元素后会把集合的长度减1,所以在使用for循环遍历删除集合的元素时,会报下标越界的错误,因为当某个元素匹配后,删除完了,这时候集合的size-1,但是循环里的size是移除元素前的长度。
所以list在循环删除元素时,不能使用list的remove方法,需要使用迭代器的remove方法

public void startLiveRoom(Map<String, List<Integer>> userIdMap){
List<Integer> followList = userIdMap.get("followList");
List<Integer> appointmentList = userIdMap.get("appointmentList");
if (followList != null && followList.size() > 0 && appointmentList != null && appointmentList.size() > 0) {
      Iterator<Integer> iterator = followList.iterator();
      while (iterator.hasNext()) {
            Integer userId = iterator.next();
            if (appointmentList.contains(userId)) {
                  iterator.remove();
             }
		}
  	}
 }

3.contains和indexOf查询集合中是否存在某元素

	public boolean contains(Object o) {
		//不存在返回false
        return indexOf(o) >= 0;
    }
    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        //不存在返回-1
        return -1;
    }

4.toArray集合转数组

 	public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }

5.subList截取集合

	public List<E> subList(int fromIndex, int toIndex) {
        subListRangeCheck(fromIndex, toIndex, size);
        return new SubList(this, 0, fromIndex, toIndex);
    }

6.合并集合

boolean addAll(Collection<? extends E> c);

举例:

 public static void main(String[] args) {
 	   //不指定泛型时,表示ArrayList里的元素是Object
       List list = new ArrayList();
       list.add("aaa");
       list.add(1);
       list.add(2);
       //ArrayList是可以放null元素的
       list.add(null);
       //ArrayList里的元素不去重,按照先后依次放入
       list.add(null);
       list.add("aaa");
       System.out.println(list);//[aaa, 1, 2, null, null, aaa]
       System.out.println(list.contains(1));//true
       System.out.println(list.indexOf(78));//-1
       System.out.println(list.get(1));//1
       //注意remove方法,只会删除匹配到的第一个元素,不是删除集合里的所有“aaa"
       System.out.println(list.remove("aaa"));
       System.out.println(list);[1, 2, null, null, aaa]
       //这里只是返回sublist的结果,list还是不变
       System.out.println(list.subList(0,2));[1, 2]
		List<Integer> list2 = new ArrayList<>();
        list2.add(42);
        list2.add(543);
        list2.add(1);
        list2.add(21);
        list.addAll(list2);
        //合并集合
        System.out.println(list);//[1, 2, null, null, aaa, 42, 543, 1, 21]
    }

因为ArrayList底层是数组实现的,添加元素默认是添加到数组的最后,如果要插入元素,底层是复制数组实现的,移除元素也是采用复制数组的方式,所以ArrayList不适合插入删除多的场景,适合查询多的场景。

public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

4.集合类型是对象,需要按照对象的某个属性排序

1.如果集合类型是整数,浮点类型时,可以直接使用Collections.sort(List list)来排序,默认是正序排列

		List<Integer> list2 = new ArrayList<>();
        list2.add(42);
        list2.add(543);
        list2.add(1);
        list2.add(21);
        Collections.sort(list2);
        System.out.println(list2);//[1, 21, 42, 543]

如果需要倒叙排列的话,可以先正序排列,然后反转集合

Collections.reverse(list2);
System.out.println(list2);//[543, 42, 21, 1]

2.当集合的类型是自定义的对象时,需要根据对象的某个属性进行排序

@Data
public class User implements Serializable {
    private static final long serialVersionUID = 9093453312L;
    private String name;
    private Integer age;
    public  User(String name,Integer age){
        this.name = name;
        this.age = age;
    }

    public User(){

    }

    public static void main(String[] args) {
        List<User> listUser = new ArrayList<>();
        User user1 = new User("李四",29);
        User user2 = new User("张三",18);
        User user3 = new User("王五",30);
        User user4 = new User("李天一",40);
        listUser.add(user1);
        listUser.add(user2);
        listUser.add(user3);
        listUser.add(user4);
        Collections.sort(listUser, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if(o1.getAge()>o2.getAge()){
                    return 1;
                }
                if(o1.getAge()<o2.getAge()){
                    return -1;
                }
                return 0;
            }
        });

        System.out.println(listUser);
        //[User(name=张三, age=18), User(name=李四, age=29), User(name=王五, age=30), User(name=李天一, age=40)]
    }
}

5.与Vector的区别

两者底层数据结构是一样的,用法也是一致的,只是ArrayList是线程不安全的,Vector是线程安全的。
因为Vector在常用方法中使用了synchronized关键字,使得在非多线程环境中,Vector对于元素的查询、添加、删除和更新操作效果不是很好。
虽然ArrayList是非线程安全的,要想实现线程安全的ArrayList,可在ArrayList的基础上通过同步块来实现,或者使用同步包装器(Collections.synchronizedList),还可以使用J.U.C中的CopyOnWriteArrayList。

YOLOv11缝合改进Conv | SAConv在YOLOv11中的应用可切换空洞卷积与性能提升(附代码) 在本篇文章中,我们将深入探讨如何通过引入**SAConv**(Switchable Atrous Convolution,可切换空洞卷积)来优化YOLOv11网络结构,特别是在卷积操作方面的创新。我们会解析SAConv的核心原理和架构设计。 阅读详情

相关推荐

ArcGIS通过已知坐标点转面(通过excel文件,有工具可批量生成面要素)

通过使用ArcGIS中的工具,将坐标点XY数据转换成可视化的点线面矢量数据,更加方便快捷有效的获取对应信息

qq_41046162的博客 3万+

ArrayList的详细讲解

1、ArrayList 定义: ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 2、ArrayList是接口List的实现类,他的方法如下: 查看API类在: https://www.runoob.com/manual/jdk11api/java.base/java/util/ArrayList.html 3、ArrayList的简单使用,如增加元素,先new出一个方法,然后使用其方法就可以了 import java.util.Arra

weixin_43360488的博客 4710

告别复杂配置!用GuidosToolbox 3.0做MSPA景观格局分析,从安装到出图全记录

本文详细介绍了如何使用GuidosToolbox 3.0进行MSPA景观格局分析,从安装配置到出图全流程。涵盖环境准备、数据预处理、参数设置、结果解读及可视化技巧,帮助用户快速掌握这一生态安全评估工具。特别针对安装教程中的常见问题提供解决方案,提升分析效率。

weixin_29248313的博客 488

【数据结构】Array 数组

数据结构 Array数据结构: public class Array<E> { private E[] data; // 数组实体,此时data.length为数组总容量 private int size; // 元素个数 /** * 无参构造函数,默认数组容量size为10 */ public Array() { this(10); } /** * 构造函数,传入数组的容量size构造Ar

锥栗的博客 447

华为服务器RAID配置避坑指南:如何通过iBMC快速识别阵列卡型号并完成初始化

本文详细解析华为服务器RAID配置全流程,重点介绍通过iBMC快速识别阵列卡型号、硬盘健康诊断及RAID级别选择的场景化策略。提供从iBMC登录到缓存策略调优的实战技巧,帮助工程师避免常见配置陷阱,提升服务器存储系统性能和稳定性。

weixin_28475533的博客 490

别再手动填序号了!用Python脚本在Arcgis属性表里实现分组自动编号(附完整代码)

本文详细介绍了如何利用Python脚本在Arcgis属性表中实现分组自动编号,告别低效的手工操作。通过核心代码解析和实战教程,帮助GIS工程师快速掌握自动化编号技术,提升工作效率并降低错误率。特别适合城市规划、国土调查等需要处理大量分组数据的场景。

weixin_42532473的博客 306

Java-自定义ArrayList类

Java-自定义ArrayList类

qq_52998673的博客 2104

GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

本文将介绍在Google Earth Engine (GEE)平台上进行随机森林分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量,运行随机森林分类器教程,计算随机森林分类结果的精度,优化随机森林分类算法的参数,打印各个变量特征的贡献度等步骤的方法和代码。本教程可以应用于多种分类场景,包括土地利用分类、种植区提取(大蒜、小麦、玉米等)、局部气候区分类、植被分类等多种场景。

养乐多的博客 1万+

java源码阅读——ArrayList

目录IterableCollectionListArrayList构造函数添加元素和扩容删除元素迭代操作线程同步 ArrayList类是一个我们经常要使用到的容器,它其实就是一个大小可以自动调整的数组 还是先来看一下ArrayList继承的类和实现的接口 Iterable 实现了这个接口的对象允许使用增强 for 语句来进行迭代 Collection collection是java容器实现的根接口,collection代表了一组对象(object),collection中的对象称为该collectio

Campsisgrandiflora的博客 297

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

高分六号WFV预处理详细步骤(辐射校正、大气校正、几何校正)

高分六号WFV传感器获得的影像的预处理分为两个步骤:辐射校正和大气校正,辐射校正为了消除传感器的自身误差,大气校正为了消除大气的折射误差。 一、辐射校正 按照红框中信息进行更改。 辐射校正前地物光谱反射率: 校正后的地物光谱曲线的变化: 二、大气校正 ENVI中大气校正一般采用Flaash模型,但是这个模型需要设置许多的参数十分的麻烦,所以采用ENVI商店(app store,这个也需要下载的)里的Flaash Easy To Use 这个插件,可以快速地进行大气校正。 大气校正后的地物反射率 这

qq_41828818的博客 1万+

学习之路Day07

类的定义和使用 类是对现实事物的抽象描述,组织代码的基本单元; 引用类型使用步骤: 1.导包,同一个文件夹下不用导包 2.定义变量并赋值 数据类型 变量名 = new 数据类型(); 3.调用属性和方法 数据类型 变量名 = 对象.属性;获取属性值 对象.属性 = 数值; 为对象的属性赋值. 对象.方法; 类包括属性和方法,属性又叫做成员变量,方法叫做成员方法 类的定义格式 创建java文件,与类名相.

weixin_53543718的博客 225

2025.05.30【转录组】|Ribo-seq数据流程详解(一 质量控制)

本文详细介绍了Ribo-seq数据的质控分析流程,重点讲解了使用fastp进行原始数据质控的关键步骤和参数设置。作者通过Snakemake自动化流程示例,展示了如何去除接头序列、过滤低质量reads、生成质控报告等操作。文章强调高质量的Ribo-seq数据对转录后调控和翻译动态研究的重要性,并提供了兼顾数据质量和下游分析需求的参数配置建议。该流程有助于研究人员规范高效地完成Ribo-seq数据质控,为后续分析提供可靠数据基础。

784

Java ArrayList 类(详解)

ArrayList一、ArrayList 是什么?二、Java ArrayList 方法三、案例演示结果: 一、ArrayList 是什么? ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下: import java.util.ArrayList; // 引入 Array

diaolove的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

怀旧版电脑GBC模拟器

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

Java ArrayList 类

ArrayList 类继承了 AbstractList 并实现了 List 接口。 ArrayList 支持可以根据需要增长的动态数组。 标准 Java 数组是固定长度的。 数组创建后不能增长或缩小,这意味着我们必须提前知道一个数组将包含多少个元素。 数组列表是使用初始大小创建的。 当超过这个大小时,集合会自动放大。 移除对象后,数组可能会缩小。 以下是 ArrayList 类提供的构造函数列表。 ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下: import jav

迹忆客 2万+

OV9734 DATASHEET,完整规格书

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

java常用类介绍及源码阅读(ArrayList)

java.util 类 ArrayList<E> 继承关系: java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.ArrayList<E> List接口的动态数组的实现。 ...

少说,多做。 7814

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java中的常用类

Java中的基本类型我们应该都知道,例如,int、float、double、boolean、char 等。为了让基本类型也具有对象特性,Java为每个基本数据类型都提供了一个包装类,这样就可以像操作对象那样操作基本数据类型。包装类其实就是提供类型转换的方法。以Integer为例看一下。Integer包装类的构造方法:Integer(int value):创建一个Integer对象,表示指定的int值。

weixin_42098295的博客 1368

Java集合ArrayList详解

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。

weixin_62458944的博客 8081

【Java】ArrayList用法详解

文章目录一、ArrayList类的使用方式二、ArrayList类的声明三、ArrayList类的属性四、ArrayList类的构造器1. 构造指定初始容量空列表2. 无参构造器五、ArrayList类添加元素的方法1. add(E e)2. add(int index, E element)六、ArrayList类查询元素方法1. get()方法——查询指定位置的元素2. indexOf()方法——查询元素第一次出现位置3. lastIndexOf()——查询元素最后一次出现位置4. contains()

ZhShy 1万+

Java ArrayList类详解

java.util简而言之:它是Java函数库中数百个类中的一个,可以将它直接当作自己的类使用ArrayList类的基础(部分)方法add(Object elem):向list中加入对象参数,remove(int index):移除对应索引的对象contains(Object elem):检查是否包含该对象:有的话返回"true",否则返回"false"isEmpty():如果list中没有元素则返回"true"

asdssadddd的博客 2531

Java中ArrayList类详解

1、什么是ArrayList  ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:  动态的增加和减少元素  实现了ICollection和IList接口  灵活的设置数组的大小 2、如何使用ArrayList  最简单的例子:  ArrayList List = new ArrayList();  for( int i

lskyne的专栏 9万+

【java-集合框架】ArrayList类

读源码,掌握java集合框架中的ArrayList类。

m0_74284629的博客 1432

Java重要类详解之ArrayList类

一.ArrayList概述 ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess[随机访问], Cloneable[可克隆], java.io.Serializable[序列化]这些接口。ArrayList 继承了AbstractList,实现了List。它是

生命奇迹泉的专栏 5241

Java中使用ArrayList类-创建动态的二维数组<>

本文通过实例讲解Java中如何使用ArrayList类。 Java.util.ArrayList类是一个动态数组类型,也就是说,ArrayList对象既有数组的特征,也有链表的特征。可以随时从链表中添加或删除一个元素。ArrayList实现了List接口。 大家知道,数组(平常你们最爱的new[]这些)是静态的,数组被初始化之后,数组长度就不能再改变了。ArrayList是可以动态改变大小的。那么,什么时候使用Array(数组),什么时候使用ArrayList?答案是:当我们不知道到底有多少个数据元素的时候

Hrenhua的博客 1万+

java arraylist类型_详解Java中ArrayList类

ArratList 类:存放同一数据类型容器(只能为引用数据类型,因实际其内部存放的是地址)1.导入其所在包  import java.util.ArratList2.创建对象 ArrayList 对象名=new ArrayList<>();E:泛型数据类型,指定对象名中存放指定类型的数据,不可省略,需为引用数据类型3.使用  即对象名.方法(参数可能有可能无)注意:当打印对象名时,非...

weixin_39524247的博客 1401

Java 常用类详解:从基础到实战,提升开发效率的必备知识

本文系统介绍了Java开发中常用的核心类及其应用场景。字符串处理推荐使用StringBuilder(单线程)和StringBuffer(多线程);日期时间处理建议采用Java8的LocalDateTime等新API;集合类根据需求选择ArrayList(动态数组)、HashMap(键值对)或HashSet(去重);工具类Arrays和Collections可简化数组与集合操作。文章通过实例演示了这些类的关键方法,强调熟练掌握这些基础类能显著提升开发效率,建议结合实践深入理解其底层实现原理。

Pretend________的博客 1214
上一篇: Java对象作为方法参数传递
下一篇: Java常用类:LinkedList类详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值