我有一个关于 Arraylist.forEach()
以及 Arraylist.replaceAll()
. 我知道 Arraylist.forEach()
用于对列表中的每个元素执行操作,但是 Arraylist.replaceAll()
做同样的事。但出于某种原因,当你决定 a.forEach(e -> e.concat("test");
假设a是字符串的arraylist,arraylist不会将“test”连接到arraylist中每个字符串的末尾。但是,如果你这样做 a.replaceAll(e -> e.concat("test");
,串联工作。为什么会这样?我所说的例子如下:
.
答案是b,但c对我来说似乎最有意义。谢谢你的帮助。
5条答案
按热度按时间tktrz96b1#
记住字符串是不可变的。您没有指定的返回值
concat
当你打电话的时候forEach()
,但是replaceAll()
因为它每次都覆盖当前元素。2w3rbyxf2#
concat
返回一个新字符串,但是forEach
忽略lambda表达式的返回值(它声明的参数是Consumer
,没有返回值。)replaceAll
将其函数的返回值放回列表中。这就是为什么。xkftehaa3#
这些名字准确地解释了这些方法的作用。
foreach将每个元素传递给函数,但只要对象是不可变类型,它就不会修改数组成员。因此,它不期望函数返回值(void)。数组始终保持不变。字符串类型是不可变的,因此任何更改都不会影响数组中保存的对象。
replaceall将所有数组成员传递给函数,并检查该函数返回的对象,当然还将该对象存储回数组,即replace。注意,在这个方法中,函数必须返回一个对象。如果是string.concat,则返回连接的字符串,因此连接的字符串出现在数组中。
gywdnpxw4#
.forEach()
获取列表中的每个元素,然后应用函数。通常你会调用一个对象的函数。在这种情况下,您将丢弃返回值,而不更改对象。.replaceAll()
获取列表中的每个元素并应用一个函数。之后,返回值将在特定位置设置。.concat()
不会因为字符串不变性而更改字符串引用,但它将在新引用中返回更改的字符串。eoxn13cs5#
我想这是因为
a、 foreach迭代arraylist中的每个元素,然后concat返回一个新字符串。它不会更改arraylist中的原始字符串。
a、 replaceall将替换arraylist中的原始字符串。