ArrayList

Java 语法
第 7 级 , 课程 5
可用

“我来了。”

“嗨,艾莉!”

“今天我们将讨论一个有趣的主题。我要向你介绍 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);

“我们如何操作此 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 方法。”

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

评论 (15)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
4.0A 级别 9,China,Hong Kong
20 三月 2024
set和add不同 set是替换,add是添加
redpig 级别 7,上海,中国
20 十一月 2022
ArrayList<String> list = new ArrayList<String>(); 现在钻石语法都这样写了:ArrayList<String> list = new ArrayList<>(); 虽然没有错,但是可以少打6个字符,注重细节才会更加体现价值吧!
null 级别 12
14 二月 2022
这个示例代码有点笨
hello world 级别 22,shanghai,China
26 九月 2021
mark:String通过length()获取长度;String[] 通过length获取长度;ArrayList通过size()获取长度
wedfrgt 级别 8,China
27 二月 2021
"从数组中间插入或删除元素而不会留下孔。" 这句话的孔是什么意思啊?
wedfrgt 级别 8,China
27 二月 2021
孔的意思是array[i] = null的情况吗? 但这样的话,根据下文的ArrayList类不会删除孔,那是不是说如果执行了list.remove(i)方法后,在i后面的所有元素的索引都要减1?
null 级别 17,Chengdu
5 三月 2021
感觉是这样的,更像有向链表?
Yu 级别 16,Chongqing
7 三月 2021
应该是把后面的元素全部前移一位,数组最后一个设为null,而原始数组是直接在第i位设为null;
IWillTurnTheTide 级别 8,China
14 三月 2021
不是的,ArrayList在执行删除后,会创建一个新的内部数组然后把除了删除的元素全部拷贝进去。所以删除的元素后面的所有元素都往前了一位,但是最后不会留下null。相应的,ArrayList.size()也会减少一
一杯香梨 级别 10,Hangzhou
21 六月 2021
孔的意思就是,你删掉了元素,但是并不是完全删掉,删掉的元素被赋值为null,数组长度还是没有变,但是ArrayList,删掉就是删掉了,数组长度也会跟着-1.
Anonymous #10795181 级别 11,Hefei,China
26 八月 2021
清晰了
陈子煜 级别 10,Hong Kong,Hong Kong
19 三月 2020
What is the difference between set method and add method?
Tianhong Qi 级别 10,Orange,United States
30 三月 2020
set相当于把原来的位置替换掉 add相当于插进去后面的都往后移一位
陈子煜 级别 10,Hong Kong,Hong Kong
31 三月 2020
明白了 谢谢!
Fool 级别 8,Changsha,China
9 三月 2020
senior!!!