java map 引用传递参数_Java:关于Map的引用传递

public class Student {

private int id;

private String name;

public Student() {

}

public Student(int id, String name) {

this.id = id;

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "[" + id + ", " + name + "]";

}

}

Student one = new Student(1, "Tim");

Student two = new Student(2, "Jack");

Map<Integer, Student> map = new HashMap<Integer, Student>();

map.put(one.getId(), one);

map.put(two.getId(), two);

Student tmp = map.get(1);

tmp.setName("New"); // {1=[1, New], 2=[2, Jack]}

可以发现我将Map中的某项取出来并进行了修改,那么Map中的相应项也会被修改,所以说是引用传递的,但是有些情况我就是想把这个东西拿出来用并作些修改,但是Map的数据作为原始值是不想被变更的,这种情况下应该怎么办呢?

实现Cloneable接口,覆盖clone方法,克隆一个新的对象出来做修改

java中实现clonable接口 c#实现IClonable接口,实现clone方法。调用该克隆方法得到一个引用与原对象不同但值相同的object。

两种方法:用工具;自己重写clone方法

各种工具:

Spring BeanUtils

commons-beanutils

BeanCopier

重写clone方法

见 CloneDemo.java

Student下:

@Override

public Student clone(){

Student student = new Student(id, name);

return student;

}

使用

Student one = new Student(1, "Tim");

Student two = new Student(2, "Jack");

Map<Integer, Student> map = new HashMap<Integer, Student>();

map.put(one.getId(), one);

map.put(two.getId(), two);

Student tmp = map.get(1);

Student student2 = tmp.clone();

student2.setName("New");

方法1,新建一个对象,只有get方法,你问题里的Student继承这个对象,有set方法,这样你在Map里放的没有set方法的对象,固然就是不可修改的

方法2,麻烦点啊,监视Student的set方法,如果有调用,马上抛个异常出来,如何监视,这个很容易的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值