这就是代码:
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[]args) {
changeList();
System.out.println(Arrays.toString(example().toArray()));
}
public static void changeList() {
example().set(2, "Hi!");
}
public static List<String> example () {
String str = new String("word1|word2|word3|word4|word5");
return Arrays.asList(str.split("\\|"));
}
}
我希望ArrayList如下所示:[word1, word2, Hi!, word4, word5]
但它没有改变......它打印[word1, word2, word3, word4, word5]
甚至可以这样改变吗? 提前谢谢!
答案 0 :(得分:1)
问题在于example
每次调用都会给出一个全新的List
。当您在changeList
中创建列表时,它与您在List
中创建的列表不同main
,对一个List
所做的更改不会影响另一个。{/ p>
解决此问题的一种方法是:
changeList
方法执行上述操作:接受List
(而不是从头开始生成)并更改List
。main
方法传递到List
至changeList
。public static void main(String[]args) {
List<String> list = example();
changeList(list);
System.out.println(Arrays.toString(list.toArray()));
}
public static void changeList(List<String> list) {
list.set(2, "Hi!");
}
答案 1 :(得分:0)
但它没有改变......是否有可能以这种方式改变它?
是的,您更改了列表但是丢失了返回集合的引用,因为方法public E set(int index, E element)
返回E而不是列表本身..请参阅doc
正如我所说,将example()的返回移动到一个你可以操作的变量......
public static void main (String[] args) {
List<String> retVal = example();
System.out.println(retVal);
retVal.set(2, "Hi!");
System.out.println(retVal);
}
public static List<String> example () {
String str = new String("word1|word2|word3|word4|word5");
return Arrays.asList(str.split("\\|"));
}
答案 2 :(得分:0)
public static void main(String[]args) {
System.out.println(Arrays.toString(changeList().toArray()));
}
public static List<String> changeList() {
List<String> list = example();
list.set(2, "Hi!");
return list;
}
public static List<String> example () {
String str = new String("word1|word2|word3|word4|word5");
return Arrays.asList(str.split("\\|"));
}
答案 3 :(得分:0)
让我们一次一行地执行您的代码,以了解它正在做什么:
public static void main(String[]args) {
changeList();
这会调用changeList()
方法:
public static void changeList() {
example().set(2, "Hi!");
首先致电example()
:
public static List<String> example () {
String str = new String("word1|word2|word3|word4|word5");
return Arrays.asList(str.split("\\|"));
}
这会创建一个新的List
并将其返回changeList()
:
example().set(2, "Hi!");
现在我们通过将索引2处的元素设置为List
来修改返回的"Hi!"
。但是,修改后的列表会立即被丢弃,因为您不再引用它。
然后我们返回main:
System.out.println(Arrays.toString(example().toArray()));
现在我们再次调用示例:
public static List<String> example () {
String str = new String("word1|word2|word3|word4|word5");
return Arrays.asList(str.split("\\|"));
}
这会创建新List
。这个新列表与我们上一次调用example()
时创建的列表无关。
如果您想保留相同的列表,则需要将其分配给changeList()
中的引用,然后将其返回:
public static void changeList() {
List<String> theList = example();
theList.set(2, "Hi!");
return theList;
}
现在main()需要保存对changeList()
返回的列表的引用:
public static void main(String[]args) {
List<String> mainList = changeList();
System.out.println(mainList);
}
(注意:您可以直接打印List
。原始版本比必要复杂得多。)