当前位置: 首页 > news >正文

java ArrayList

目录

一.简单介绍

二.ArrayList的底层结构

2.1ArrayList的底层结构和操作分析

2.ArrayList 底层源码分析

三.ArrayList 方法

 四.代码使用方法


一.简单介绍

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

ArrayList 继承了 AbstractList ,并实现了 List 接口。

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

import java.util.ArrayList; // 引入 ArrayList 类ArrayList<E> objectName =new ArrayList<>();  // 初始化
  • E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型
  • objectName: 对象名。

ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

二.ArrayList的底层结构

2.1ArrayList的底层结构和操作分析

1、ArrayList的底层结构是一个Object[] elementData,即一个Object类型的数组。
2、创建ArrayList对象时,如果采用的是无参构造器,则数组初始空间为0,第一次添加数组空间扩容至10,如需再次扩容,则扩容至原数组空间的1.5倍。
3、如果采用的是有参构造器,则数组初始空间为传入的参数值,如需再次扩容,则扩容至原数组空间的1.5倍。
4、添加元素的顺序与取出元素的顺序相同。
5、每个元素都有对应的索引,即可以通过索引查找元素。
6、ArrayList可以添加多个null,也可以添加相同元素。

2.ArrayList 底层源码分析

证明ArrayList的底层结构是一个Object类型的数组

1、Debug进入ArrayList arrayList = new ArrayList(),分析ArrayList的底层结构

文档注释表达: 构造一个初始容量为10的空列表

 2、再进入elementData,我们可以看见ArrayList的底层结构是一个Object[] elementData,即一个Object类型的数组。

文档注释: 数组缓冲区,数组列表的元素被存储在其中。
                数组列表的容量是这个数组缓冲区的长度。任何空数组列表与elementData ==                                 DEFAULTCAPACITY_EMPTY_ELEMENTDATA将在添加第一个元素时扩展为                                 DEFAULT_CAPACITY。

 3、因为采用的是无参构造器,所以数组初始空间为0,为了证实我们进入DEFAULTCAPACITY_EMPTY_ELEMENTDATA。

源码解释:  用于默认大小的空实例的共享空数组实例。我们将此与EMPTY_ELEMENTDATA区分,以了解何时膨胀多少第一个元素被添加。

 4、如果采用的是有参构造器,例如:ArrayList arrayList1 = new ArrayList(8);,Debug进入

文档注释:构造一个具有指定初始容量的空列表。
              * @param initialCapacity列表的初始容量
              * @抛出IllegalArgumentException如果指定的初始容量为负

 此时initialCapacity = 8,满足第一个if条件,所以elementData的初始空间为8。

 三.ArrayList的方法(api)

三.ArrayList 方法

Java ArrayList 常用方法列表如下:

方法描述
add()将元素插入到指定位置的 arraylist 中
addAll()添加集合中的所有元素到 arraylist 中
clear()删除 arraylist 中的所有元素
clone()复制一份 arraylist
contains()判断元素是否在 arraylist
get()通过索引值获取 arraylist 中的元素
indexOf()返回 arraylist 中元素的索引值
removeAll()删除存在于指定集合中的 arraylist 里的所有元素
remove()删除 arraylist 里的单个元素
size()返回 arraylist 里元素数量
isEmpty()判断 arraylist 是否为空
subList()截取部分 arraylist 的元素
set()替换 arraylist 中指定索引的元素
sort()对 arraylist 元素进行排序
toArray()将 arraylist 转换为数组
toString()将 arraylist 转换为字符串
ensureCapacity()设置指定容量大小的 arraylist
lastIndexOf()返回指定元素在 arraylist 中最后一次出现的位置
retainAll()保留 arraylist 中在指定集合中也存在的那些元素
containsAll()查看 arraylist 是否包含指定集合中的所有元素
trimToSize()将 arraylist 中的容量调整为数组中的元素个数
removeRange()删除 arraylist 中指定索引之间存在的元素
replaceAll()将给定的操作内容替换掉数组中每一个元素
removeIf()删除所有满足特定条件的 arraylist 元素
forEach()遍历 arraylist 中每一个元素并执行特定操作

 四.代码使用方法

Demo1:

/*** java.util.List接口* List继承自Collection.List集合是可重复集,并且有序,提供了一套可以通过下标操作元素的方法* 常用实现类:* java.util.ArrayList:内部使用数组实现,查询性更好,* java.util.LinkedList:内部使用链表实现,首尾增删元素效果更好。**/
public class ListDemo1 {public static void main(String[] args) {List<String>list=new ArrayList<>();// List<String>list=new LinkedList<>();list.add("one");list.add("two");list.add("three");list.add("four");list.add("five");System.out.println(list);/*E get(int index)获取当前list集合中指定下标中第三个元素*///获取集合第三个元素String str=list.get(2);System.out.println(str);//for循环遍历List集合for (int i=0;i<list.size();i++){str= list.get(i);System.out.println(str);}/*E set(int index ,E e)将给定元素设置到指定位置上,返回值为该位置原来对应的元素。替换操作*///two//[one two three four five]String old=list.set(1,"six");System.out.println(list);System.out.println("被替换的元素是:"+old);/*将集合反转*///[five four three six one]for (int i=0;i<list.size()/2;i++){//获取正数位置上的元素String e=list.get(i);//将正数位置上的元素放到倒数位置上e=list.set(list.size()-1-i,e);//再将原倒数位置上的元素设置到整数位置上list.set(i,e);}System.out.println(list);//将集合翻转for(int i=0;i<list.size()>>2;i++){//获取正数上位置的元素String  e=list.get(i);//将正数位置上的元素设置到整数位置上e=list.set(list.size()-1-i,e);list.set(i,e);}System.out.println(list);/*java.util.Collection 是集合工具类,里面提供很多静态方法,可以随便操作集合*///翻转List集合Collections.reverse(list);System.out.println(list);}

代码结果

 Demo2:

/*** list集合提供了一对重载的add,remove方法*/
public class ListDemo2 {public static void main(String[] args) {List<String>list=new ArrayList<>();list.add("one");list.add("two");list.add("three");list.add("four");list.add("five");System.out.println(list);/*void add(int index,E e)讲给定元素插入到指定位置*///[one two six three four five]list.add(2,"six");System.out.println(list);/*E remove(int index)删除并返回给定位置上的元素*/String old=list.remove(3);System.out.println(list);System.out.println("被删除的元素是:"+old);}
}

输出结果:

 Demo3

*** List集合支持获取子集操作** List subList(int start,int end)* 获取当前集合中指定范围内的子集,两个数字表示下标范围,含头不含尾*/
public class ListDemo3 {public static void main(String[] args) {List<Integer> list=new ArrayList<>();for (int i=0;i<10;i++) {list.add(i);}System.out.println(list);//获取[3-7]List<Integer>subList=list.subList(3,8);System.out.println(subList);//将数组扩大10倍//for (int i=0;i<subList.size();i++){//    int n=subList.get(i);//    n=n*10;//    subList.set(i,n);//}for (int i=0;i<subList.size();i++){subList.set(i,subList.get(i)*10);}//[30,40 50 60 70]System.out.println(subList);//对子集的操作就是对原集合对应元素的操作System.out.println(list);//删除list集合中[2-8]list.subList(2,9).clear();System.out.println(list);}
}

输出结果:

 

http://www.lryc.cn/news/4254.html

相关文章:

  • 前端——周总结系列四
  • Linux重定向符、管道符讲解
  • 【C++】多态
  • 分布式项目-品牌管理(5、6)
  • 自定义ESLint规则开发与使用
  • 【JavaScript】35_包装类与垃圾回收机制
  • 【CS224W】(task3)NetworkX工具包实践
  • ansible的模块详解
  • 《Terraform 101 从入门到实践》 Functions函数
  • 使用kubeadm快速部署一个K8s集群
  • 初探富文本之CRDT协同算法
  • Dubbo和Zookeeper集成分布式系统快速入门
  • 大数据工具Maxwell的使用
  • freesurfer如何将组模板投影到个体空间——如投影 Schaefer2018 到个体空间
  • Matlab傅里叶谱方法求解二维波动方程
  • 【深度学习】卷积神经网络
  • 【C++】六个默认成员函数——取地址重载,const成员函数
  • Win11浏览器无法上网,秒杀网上99.9%教程—亲测完胜
  • Vulkan Graphics pipeline Dynamic State(图形管线之动态状态)
  • CSP-《I‘m stuck!》-感悟
  • [实践篇]13.19 Qnx进程管理slm学习笔记(二)
  • (免费分享)基于 SpringBoot 的高校宿舍管理系统带论文
  • 运筹系列78:cbc使用介绍
  • RocketMQ底层源码解析——事务消息的实现
  • 学习802.11之MAC帧格式(一篇就够!)
  • 使用阿里云IoT Studio建立物模型可视化界面
  • HBase 复习 ---- chapter07
  • 跟我一起写Makefile--个人总结
  • 设计模式之为什么要学好设计模式
  • 大数据时代的小数据神器 - asqlcell