java-jsp会话:ArrayList反映最新值,但对于String而言,它不
作者:互联网
我观察到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的变量,该变量指向内存中具有列表元素“ Item1”的位置(名称为locatino LOC123).
您还创建了一个名为name的变量,该变量指向内存中的某个位置(将其命名为locatino LOC456),其String值为“ String1”.
当您传递名称&列出变量到session.setAttribute方法中,您只传递了列表&的参考值名称变量.
现在,会话对象是指LOC123&内存中的LOC456,使其可以检索实际值.
当您执行list.add(“ Item2”);时该命令将一个元素添加到相同的存储位置LOC123.鉴于会话已指向LOC123,您设法看到了反映的更改值.
Java字符串是不可变的,一旦创建它们就无法更改.当您执行name =“ String2”;您在内存LOC789中创建了一个新位置,该位置的String值为“ String2”,并且名称变量现在已更改为指向LOC789.
假定会话对象仍指向LOC456并且对LOC789一无所知,则更新的“ String2”值未反映在会话中.
为了克服这个问题,您可以使用可编辑的StringBuffer(或StringBuilder).
标签:session-state,java,jsp 来源: https://codeday.me/bug/20191025/1929780.html