标题简单描述:先将一个对象放入session,只对对象属性值进行修改,但不将修改后的对象存放session中,发现session中存放的对象属性值也相对应的改变。
Person person=new PerSon();
request.getSession().setAttribute("person", person);
person.setName("张三");
取值时发现是可以取到的,这里大家可能就疑惑了,因为是先添加到session中在进行取值的。
创建一个Person类:
package JavaTest;public class Person {
private String name;
private String sex;
private Integer age;
public Person(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// 重写toString方法,方便查看打印效果
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
创建一个Test类:
public class Test {public static void main(String[] args) {
Person person=new Person(); //创建一个Person对象-->person。
person.setName("张三"); //只修改person的name属性值。
Map<String, Person> map=new HashMap<>(); //创建一个Map集合,String为Key(此案例随意,主要是Value),Person为value。
map.put("p1", person); //将person添加到map中,key取p1(key取值随意)
System.out.println(map); //打印map集合
person.setAge(18); //再次修改person的age属性
System.out.println(map); //再次打印map集合
}
}
打印结果:
观察大致内存分析:
回归正文,通过小案例分析发现当map中存放一个对象时,其实存放的是一个内存地址。
故:request.getSession().setAttribute("person", person);存放的也是内存地址。
PS:文章可能啰嗦,主要是想通过案例解释该问题。另内存图可能可能出错(个人能力有限),但最终原理不错。