2012-03-01 4 views
4

두 값을 교환하고 싶을 때마다 실제 스왑을하기 위해 임시 사용해야합니다. 왜 Java는 두 클래스의 값을 바꾸기위한 클래스를 제공하지 않는 이유는 무엇입니까?Java가 간단한 스왑 기능을 제공하지 않는 이유는 무엇입니까?

+4

그래서 무엇이 문제입니까? 왜 자바는 그걸 위해 무언가가 없었습니까? 자바 제작자에게 물어보십시오. – shift66

+0

http://stackoverflow.com/questions/3624525/how-to-write-a-basic-swap-function-in-java 및 http://stackoverflow.com/questions/2393906/how-do-i- make-my-swap-function-in-java –

+0

@Ademiban은 문법을 수정합니다. – Juvanis

답변

12

자바는 Pass-by-Value입니다. 그래서 간단 스왑 방법 (ref)을 만들 수 없습니다.


당신은 그러나 다른 개체 내부 귀하의 참조를 포장하고 내부 심판을 교체 할 수 있습니다 : 그것은 수 없기 때문에

public static void main(String[] args) { 
    Ref<Integer> a = new Ref<Integer>(1); 
    Ref<Integer> b = new Ref<Integer>(2); 

    swap(a, b); 

    System.out.println(a + " " + b); // prints "2 1" 
} 

public static <T> void swap(Ref<T> a, Ref<T> b) { 
    T tmp = a.value; 
    a.value = b.value; 
    b.value = tmp; 
} 

static class Ref<T> { 
    public T value; 

    public Ref(T t) { 
     this.value = t; 
    } 

    @Override 
    public String toString() { 
     return value.toString(); 
    } 
} 
3

자바는 방법을 제공하지 않습니다. 변수가 값에 의해 메서드에 전달됩니다. 네, 이것들이 객체이더라도 말이죠. 이 경우 객체에 대한 참조를 값으로 전달합니다. 따라서이 변수를받은 메소드 내에서 소스 변수의 값을 매개 변수로 변경할 수 없습니다.

int a = 5; 
int b = 6; 
swap(a, b); 
// a is still 5, b is still 6! 


void swap(int first, int second) { 
    int tmp = first; 
    first = second; 
    second = tmp; 
} 
관련 문제