2020-10-20        longzqa@163.com        stronglzq

【摘要】针对数组容量固定无法扩展的问题,引入数组列表(ArrayList)。主要对数组列表的声明及基本操作等内容进行介绍,基本操作包括增加元素、插入元素、删除元素以及元素的访问与修改。

  • 为什么要引入数组列表(ArrayList)
  • 数组列表容量为什么能变动
  • 如何声明数组列表
  • 数组列表的增加、插入、删除、修改、访问操作
  • 数组列表的缺陷
  • 如何灵活的扩展数组,又能方便的访问元素
  • 如何降低数组列表的内存消耗 -- 预设列表容量

为什么要引入数组列表(ArrayList)

数组在创建后容量固定,而实际解决问题的过程中,元素的数量是变动的,此时采用数组来存储数据难以满足业务需求,因此引入数组列表。

数组列表容量为什么能变动

在创建数组时,需确定数组长度,此时数组中产生一个个“萝卜坑”(有初始值,若为int类元素,初始值为0),增加元素即为往“萝卜坑”中放入“萝卜”;数组列表可在声明时预估容量,或不预估容量,当不预估容量,或者元素超过预估容量时,若增加一个元素,则会自动申请一个新的数组,将原先数组列表的内容复制到新数组中,并在末端放入新元素。

如何声明数组列表

数组列表是具有类型参数(type parameter)的泛型类(genetic class),故需要在声明数组列表时,指明元素类型,语法为ArrayList<element type>。数组列表的声明语法有三种:

  • ArrayList<element type> name = new ArrayList<element type>();
  • ArrayList<element type> name = new ArrayList<>();,相对于第一种声明方法,省略了等号右侧数组列表的元素类型;
  • var name = new ArrayList<element type>();使用var则一定不能省略等号右侧数组列表的元素类型。
public class Person{
private String name;
private int age; public Person(String name, int age){
this.name = name;
this.age = age;
}
} public class ArrayListTest{
// 用数组列表来存储Person数据
var person = new ArrayList<Person>();
// ArrayList<Person> person = new ArrayList<Person>();
// ArrayList<Person> person = new ArrayList<>();
person.add(new Person("Peter", 20));
person.add(new Person("Tom", 23));
person.add(new Person("Lucy", 26));
}

数组列表的增加、插入、删除、修改、访问

(1)数组列表的增加为在列表末端增加元素,使用add()方法;(2)对位置i的元素修改为e,语句为set(i, e);(3)访问位置i的元素,语句为get(i);(4)在位置i,插入元素e,则原先位置i及之后的元素均向后移一位,语句为add(i, e);(5)删除位置i的元素,语句为remove(i)

注:数组列表的插入、删除效率低。

public ArrayListTest{
// 用数组列表来存储Person数据
var person = new ArrayList<Person>();
// ArrayList<Person> person = new ArrayList<Person>();
// ArrayList<Person> person = new ArrayList<>();
person.add(new Person("Peter", 20));
person.add(new Person("Tom", 23));
person.add(new Person("Lucy", 26)); // 修改元素
person.set(1, new Person("Peter Long", 25));
// 插入元素
person.add(2, new Person("Jack", 30));
// 删除元素
person.remove(0);
// 访问元素
person.get(1);
}

数组列表的缺陷

使用数组列表存在两个缺陷,(1)无法直接通过元素下标来访问元素,不方便;(2)数组列表由于每变动一个元素,均需要重新申请一个新的数组来存放,对内存消耗大;(3)数组列表元素的插入、删除效率低,解决方案为采用链表的数据类型;

如何既灵活的扩展数组,又能方便的访问数组元素?

数组无法灵活的扩展,故引入了数组列表,但数组列表元素访问繁琐,针对各自的问题,有一解决方法:(1)创建一个数组列表,并填充元素;(2)创建一个数组,数组大小为数组列表实际元素的数量;(3)使用toArray方法,将数组列表的元素复制到该数组中。

public class ArrayListTest{
// 用数组列表来存储Person数据
var person = new ArrayList<Person>();
// ArrayList<Person> person = new ArrayList<Person>();
// ArrayList<Person> person = new ArrayList<>();
person.add(new Person("Peter", 20));
person.add(new Person("Tom", 23));
person.add(new Person("Lucy", 26)); // 创建一个数组,大小为数组列表的大小
Person[] personArray = new Person[person.size()];
// 将数组列表的元素复制到数组中
person.toArray(personArray);
}

注:数组列表的size()方法返回数组列表实际元素的数量,而数组的size()方法返回数组容量。

如何降低数组列表的内存消耗?-- 预设列表容量

针对数组列表内存消耗大的问题,可以预设一个列表容量,在元素数量不超过预设容量时,元素的增加不需要重新分配空间。预设列表容量有两种方式:(1)在构造数组列表时,确定列表容量;(2)使用数组列表的ensureCapcity()方法。

public class ArrayListTest{
// 预设数组列表的容量为100
var person = new ArrayList<Person>(100);
// 或 var person = new ArrayList<Person>(); person.ensureCapcity(100);
}

数组列表(ArrayList)的更多相关文章

  1. Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  2. 泛型数组列表 ArrayList

    为什么使用泛型数组列表而不使用普通数组? 1.普通数组经常会发生容量太大以致浪费的情况 2.普通数组无法动态更改数组 基本概念: 1.采用[类型参数]的[类]---->[泛型类] 2.[泛型类型 ...

  3. 变长数组列表ArrayList

    简介:此数据结构定义为一个ArrayList结构体类型,维护了一个内部堆数组.通过realloc函数实现了数组容量自动扩充,每次扩充到原来的2倍. 通过函数指针实现了使用者根据自己的需求按条件按查找目 ...

  4. 「JavaSE 重新出发」05.02 泛型数组列表、包装类

    泛型数组列表 ArrayList 是一个采用类型参数(type parameter)的泛型类(generic class). java ArrayList<Employee> staff ...

  5. ArrayList数组列表

    ArrayList数组列表 Collection接口和List接口的区别 List接口扩充了Collection接口,添加了索引相关的方法. code example Object get(int i ...

  6. C#.NET中数组、ArrayList和List三者的区别

    数组在C#.NET中是最早出现的,在内存中是顺序连续存储的,所以它的索引速度非常快,赋值与修改元素也很简单:但是,也正因为数组是顺序连续存储的,在两个数据间插入数据是很不方便的,而且在声明数组的时候必 ...

  7. C#中数组、ArrayList和List三者的区别

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  8. 在Java中怎样把数组转换为ArrayList?

    翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...

  9. 数组、ArrayList、List、LinkedList的区别

    一.数组 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 1.一维数组 声明一个数组: ]; 初始化一个数组: ] { , , , , }; //定长 声明并初始化: ...

随机推荐

  1. LevelDb 101学习

    转自http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html LevelDb日知录之一:LevelDb 101 说起LevelDb也许 ...

  2. java虚拟机5 字节码

    java字节码本质是java程序的格式化表示,便于机器处理.所以他是java程序的另一种表示,java程序包含的信息他都包含并且更加结构化. java虚拟机字节码格式: magic 魔数,标识该文件是 ...

  3. 解Bug之路-记一次对端机器宕机后的tcp行为

    解Bug之路-记一次对端机器宕机后的tcp行为 前言 机器一般过质保之后,就会因为各种各样的问题而宕机.而这一次的宕机,让笔者观察到了平常观察不到的tcp在对端宕机情况下的行为.经过详细跟踪分析原因之 ...

  4. Linux安装软件总结

    1.安装jdk1.8 1.首先去官网下载jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  5. 想要搭建个论坛?Guide哥调研了100来个 Java 开源论坛系统,发现这 5 个最好用!

    大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 最近有点小忙.但是,由于前几天答应了一位读者自己会推荐一些开源的论坛系统,所以,昨晚就简单地熬了个夜,对比了很多 ...

  6. C#设置装配加载选项

    NX在打开装配时,需要设置加载方式,如下图所示: 因此,当装配进行了拷贝之后,PART路径变化,再次用NX打开时,会报无法加载的错误.这时需要重新设置从搜索文件夹打开,再次保存之后,之后再按照保存打开 ...

  7. (转)ServletConfig与ServletContext

    出处:http://blog.csdn.net/cl05300629/article/details/9362601 作者:伫望碧落 一.Servlet配置对象(ServletConfig):Serv ...

  8. java 判断jsonObject 对象为null的天坑问题

    jsonObject = {"mmbRetrieveBookingResponse":{"bookingData":null,"isAfterTran ...

  9. Java基础——消息队列

    1.消息队列的适用场景:商品秒杀.系统解耦.日志记录等 2.使用Queue实现消息对列 双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取阻塞队列指 ...

  10. IdentityServer4系列 | 初识基础知识点

    前言 我们现在日常生活中,会使用各式各样的应用程序,层出不穷,其中有基于网页浏览方式的应用,有基于手机端的App,甚至有基于流行的公众号和小程序等等,这些应用,我们不仅要实现各个应用的功能之外,还要考 ...