찾다

 >  Q&A  >  본문

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的数据作为原始值是不想被变更的,这种情况下应该怎么办呢?

高洛峰高洛峰2889일 전558

모든 응답(4)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-18 09:09:29

    Cloneable 인터페이스 구현, 복제 방법 재정의, 새 객체 복제 및 수정

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 09:09:29

    Java C#에서 복제 가능 인터페이스 구현 IClonable 인터페이스와 복제 메소드를 구현합니다. 원본 객체와 참조는 다르지만 값은 동일한 객체를 가져오려면 이 복제 메서드를 호출하세요.

    회신하다
    0
  • 阿神

    阿神2017-04-18 09:09:29

    두 가지 방법: 도구를 사용하고 복제 방법을 직접 다시 작성하세요

    다양한 도구:

    Spring BeanUtils
    commons-beanutils
    BeanCopier

    복제 방법 재정의

    CloneDemo.java 참조

    학생 이하:

    으아악

    사용

    으아악

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 09:09:29

    방법 1, get 메소드만 사용하여 새 객체를 만듭니다. 질문에 있는 Student는 이 객체를 상속하고 set 메소드를 가지고 있으므로 set 메소드 없이 Map에 넣은 객체는 물론 수정할 수 없습니다.

    방법 2, 번거로운데, Student의 설정된 메서드를 모니터링하면 즉시 예외를 발생시킵니다. 모니터링하는 방법은 매우 쉽습니다.

    회신하다
    0
  • 취소회신하다