我观察到ArrayList反映了最新的值,但是对于String而言,它没有

//Initializing List and String
ArrayList<String> list = new ArrayList<String>();
list.add("Item1");
String name = "String1";

//Setting Attribute for both
session.setAttribute("mylist", list);
session.setAttribute("myname", name);

//getting attribute for both
out.println("<br> Printing intial valus <br>");
list = (ArrayList<String>)session.getAttribute("mylist");
for (String s:list){
 out.println(s);
}
name = (String) session.getAttribute("myname");
out.println(name);

//updating the values for both
list.add("Item2");
name = "String2";

//Need to add session.setAttribute again for String
//for it to reflect updated value "String 2"
//session.setAttribute("myname", name);

//getting attribute value after the update
list = (ArrayList<String>)session.getAttribute("mylist");
name = (String) session.getAttribute("myname");

//printing the value for both again
out.println("<br><br><br> Prining updated values <br><br>");
for (String s:list){
 out.println(s);
}
out.println(name);

下面的输出是
Printing intial valus
 Item1 String1

 Prining updated values
 Item1 Item2 String1 Session 2

在更新的值部分中,它不应该打印“String2”,但对于ArrayList,它也要打印“Item2”。如果我在更新字符串名称值后立即手动添加session.setAttribute("myname", name),那么它将打印“String2”。但是ArrayList不需要此session.setAttribute

最佳答案

ArrayList<String> list = new ArrayList<String>();
list.add("Item1");
String name = "String1";

上面的几行创建了一个名为 list 的变量,该变量指向内存中的位置(名称为locatino LOC123 ),该变量具有列表元素“Item1”
您还创建了一个名为的名称变量,该变量指向内存中的某个位置(将其命名为locatino LOC456 ),其字符串值为“String1”。

当您将名称列表变量传递给 session.setAttribute 方法时,您仅传递了列表名称变量的参考值。
现在,会话对象将引用内存中的 LOC123 LOC456 ,从而可以检索实际值。

当执行 list.add(“Item2”);时命令,您向同一内存位置 LOC123 中又添加了一个元素。鉴于会话已指向 LOC123 ,您设法看到了反映的更改值。

Java字符串是不可变的,一旦创建它们就无法更改。当您执行 name =“String2”时; 您已在内存 LOC789 中创建了一个新位置,其字符串值为“String2”,并且名称变量现在已更改为指向 LOC789

鉴于会话对象仍指向 LOC456 ,并且由于它对 LOC789 一无所知,因此更新的“String2”值未反映在会话中。

为了克服这个问题,您可以使用一个可编辑的StringBuffer(或StringBuilder)。

10-01 06:12
查看更多