arraylist.foreach()和arraylist.replaceall()之间的区别

pn9klfpd  于 2021-07-06  发布在  Java
关注(0)|答案(5)|浏览(262)

我有一个关于 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对我来说似乎最有意义。谢谢你的帮助。

tktrz96b

tktrz96b1#

记住字符串是不可变的。您没有指定的返回值 concat 当你打电话的时候 forEach() ,但是 replaceAll() 因为它每次都覆盖当前元素。

2w3rbyxf

2w3rbyxf2#

concat 返回一个新字符串,但是 forEach 忽略lambda表达式的返回值(它声明的参数是 Consumer ,没有返回值。) replaceAll 将其函数的返回值放回列表中。这就是为什么。

xkftehaa

xkftehaa3#

这些名字准确地解释了这些方法的作用。
foreach将每个元素传递给函数,但只要对象是不可变类型,它就不会修改数组成员。因此,它不期望函数返回值(void)。数组始终保持不变。字符串类型是不可变的,因此任何更改都不会影响数组中保存的对象。
replaceall将所有数组成员传递给函数,并检查该函数返回的对象,当然还将该对象存储回数组,即replace。注意,在这个方法中,函数必须返回一个对象。如果是string.concat,则返回连接的字符串,因此连接的字符串出现在数组中。

gywdnpxw

gywdnpxw4#

.forEach() 获取列表中的每个元素,然后应用函数。通常你会调用一个对象的函数。在这种情况下,您将丢弃返回值,而不更改对象。 .replaceAll() 获取列表中的每个元素并应用一个函数。之后,返回值将在特定位置设置。 .concat() 不会因为字符串不变性而更改字符串引用,但它将在新引用中返回更改的字符串。

eoxn13cs

eoxn13cs5#

我想这是因为
a、 foreach迭代arraylist中的每个元素,然后concat返回一个新字符串。它不会更改arraylist中的原始字符串。
a、 replaceall将替换arraylist中的原始字符串。

相关问题