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. [程序员代码面试指南]数组和矩阵-求最短通路值(BFS)

    题意 给二维矩阵 1.0组成,问从左上角到右下角的最短通路值. 题解 BFS基础.头节点入队:对队内每个节点判断.处理,符合条件的入队:到了终点节点返回. 相关知识 Queue为接口,LinkedLi ...

  2. 基于Socket的编程

    2020/7/5 客户端步骤: 1.创建Socket. 根据指定服务端的IP地址或者端口号构造Socket类对象: Socket socket  =  new  Socket(InetAddress. ...

  3. python列表,字典,元组常用方法和集合

    python 目录 一.列表 列表格式 1.添加 列表取数(按照下标取,下标从0开始) 获取长度 append添加(直接添加) extend添加(分别添加) insert()insert(index, ...

  4. es创建普通索引以及各种查询

    创建索引 创建普通索引: PUT /my_index { "settings": { "index": { "number_of_shards&quo ...

  5. Python反转链表

    # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None ...

  6. C语言汇总3

    16-18 1.常量 整型常量:1: 2: 3: 实型常量(小数):单精度常量[3.14],双精度常量(默认情况下)[10.1f] 字符型常量 ' 5 ',只要在双引号的任意的唯一一个字符就为字符型常 ...

  7. Redis安装即python使用

    一:简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  8. python爬取链家二手房信息,确认过眼神我是买不起的人

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  9. 龙芯3a4000办公机安装软件及美化记录

    1.硬件平台: CPU:龙芯3a4000 Linux内核版本:4.19.90-1.lns7.2.mips64el 操作系统:Debian 10(buster) 使用过龙芯3a3000和3a4000两款 ...

  10. [De1CTF 2019]Giftbox 分析&&TPOP学习

    [De1CTF 2019]Giftbox 刚进来我以为是直接给了shell,恐怖如斯. 随便扔了个命令,之后就没然后了,hhh,截包发现可能存在sql注入. 然后我就不会了... what i lea ...