“我来了。”

“嗨,艾莉!”

“今天我们将讨论一个有趣的主题。我要向你介绍 ArrayList 类。”

“一个新类?太酷了!它有什么功能?”

“让我从背景故事开始讲起。程序员唯一不喜欢数组的地方就是无法更改它们的大小。如果你需要向只有一个空闲插槽的数组中再添加三个元素,该怎么办?

“解决此问题的唯一方法是创建非常大的数组,以确保为所有元素留出足够的空间。但是,这通常意味着浪费内存。如果一个数组通常包含三个元素,但是即使它有极小的可能需要容纳 100 个元素,也必须创建一个 100 元素数组。”

“那么,程序员想出了什么办法呢?”

“他们编写了 ArrayList 类,其功能与 Array 相同,但可以更改大小。”

“有趣的操作。他们怎么做的?”

“每个 ArrayList 对象存储一个常规的元素数组。当你从 ArrayList 中读取元素时,它将从内部数组中读取这些元素。将元素写入 ArrayList 时,它将这些元素写入内部数组。现在,我们来比较这些列:”

Array ArrayList
创建包含元素的容器
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
获取元素的数量
int n = list.length;
int n = list.size();
从数组/集合中获取元素
String s = list[3];
String s = list.get(3);
将元素写入数组
list[3] = s;
list.set(3, s);

“那么,为什么 ArrayList 更好呢?据我所知,现在的代码更长了。”

“首先,ArrayList 支持程序员必须始终执行的一些附加操作。普通数组不支持这些操作。例如,从数组中间插入或删除元素而不会留下孔。”"

“第二,可以更改数组的大小。当你需要再添加一个元素但内部数组没有任何空闲插槽时,ArrayList 内部会发生下述情况:

a) 创建另一个数组,该数组比当前内部数组大 50% 外加一个元素。

b) 旧数组中的所有元素都将复制到新数组中。

c) 新数组将被另存为 ArrayList 对象的内部数组。旧数组被声明为垃圾(我们只是停止存储对它的引用)。”

Array ArrayList
在数组末尾添加元素
不支持此操作
list.add(s);
在数组中间添加元素
不支持此操作
list.add(15, s);
在数组开头添加元素
不支持此操作
list.add(0, s);
从数组中删除元素
我们可以使用 list[3] = null 删除元素。但这会在数组中留下一个“孔”。
list.remove(3);
2
任务
Java 语法,  第 7 级课程 5
已锁定
输入代码
有时你不需要思考,只需要敲击键盘把它打出来!尽管看似矛盾,但有时候你的手指会比你的意识有更好的“记忆力”。这就是为什么在秘密 CodeGym 中心进行培训时,有时会要求你完成一些输入代码的作业。通过输入代码,你将习惯这些语法,并获得一些暗物质。更重要的是,你会与懒惰作斗争!

“我们如何操作此 ArrayList?”

“实际上,就像操作普通数组一样。请看。我们来比较一下 ArrayList 和数组的操作情况。假设我们需要‘读取 10 个字符串并以相反顺序在屏幕上显示它们’。”

“请看以下示例:

对于数组
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// 从键盘读取字符串
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// 显示数组内容
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
对于 ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// 从键盘读取字符串
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// 显示集合内容
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

我使用了相同的颜色来突出显示每一列中的类似操作。”

“一方面,一切都不相同。而另一方面,它仍然是相同的。”

"是的。除了在操作 ArrayList 时不使用方括号,而是使用 getsetadd 方法。”

“是的,我发现这一点了。不过看起来还是非常相似。”