我观察到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)。