session中存放一个对象,只修改对象的属性,不将修改后的对象存放session,发现session中存放的对象也发生改变!

标题简单描述:先将一个对象放入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 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集合
    }

}

打印结果:

session中存放一个对象,只修改对象的属性,不将修改后的对象存放session,发现session中存放的对象也发生改变!_第1张图片

观察大致内存分析:

session中存放一个对象,只修改对象的属性,不将修改后的对象存放session,发现session中存放的对象也发生改变!_第2张图片

回归正文,通过小案例分析发现当map中存放一个对象时,其实存放的是一个内存地址。

故:request.getSession().setAttribute("person", person);存放的也是内存地址。

PS:文章可能啰嗦,主要是想通过案例解释该问题。另内存图可能可能出错(个人能力有限),但最终原理不错。


你可能感兴趣的:(问题解决)