Java:关于Map的引用传递
高洛峰
高洛峰 2017-04-18 09:07:29
[Java讨论组]
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的数据作为原始值是不想被变更的,这种情况下应该怎么办呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
巴扎黑

实现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方法,如果有调用,马上抛个异常出来,如何监视,这个很容易的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号