標題簡單描述:先將一個對象放入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:文章可能啰嗦,主要是想通過案例解釋該問題。另內存圖可能可能出錯(個人能力有限),但最終原理不錯。