public static void swapEqual(int[] a,int[] b){
int[] temp=new int[b.length];
temp=b;
b=a;
a=temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] c={1,2};
int[] d={3,4};
swapEqual(c,d);
System.out.println(c[1]);
}
为什么打印出来的C[1]还是原来的2啊,为什么没有交换。数组的=不就是复制引用吗?通过函数可以把a,b的引用交换,这样不就是把内容交换了吗?
干嘛非要这样写?
public static void swap(int[] a,int[] b){
int[] temp=new int[b.length];
for(int i=0;i<b.length;i++){
temp[i]=b[i];
}
for(int i=0;i<b.length;i++){
b[i]=a[i];
}
for(int i=0;i<b.length;i++){
a[i]=temp[i];
}
}
这样子我试了一下,就可以达到交换的目的了
好困惑啊,求解!!
PHPz2017-04-18 10:49:30
swapEqual(int[] a,int[] b):
시작 부분:
a --> (주소 1)
b --> ,4} (주소 2)
귀하의 코드로 처리한 후 (a와 b가 가리키는 주소가 교환됨):
b --> {1,2} (주소 1)
a - -> ; {3,4} (주소 2)
그러나 c, d에는 영향을 미치지 않습니다.
c --> d --> {3,4} (주소 2)
swap(int[] a,int[] b):
시작 부분:
a --> (주소 1)
b --> ,4}(주소 2)
는 코드에 의해 처리됩니다(주소 1과 2의 값이 교환됨):
a --> {3,4}(주소 1)
b -- > {1,2} (주소 2)
c와 d가 가리키는 주소에는 영향을 미치지 않지만 원래 주소 아래의 값이 변경되었습니다.
c --> 4} (주소 1)
d --> {1,2} (주소 2)
제가 이해한 바는 이렇습니다. 쓰고 보니 @lianera님의 표현과 같은 뜻이라 보충설명으로 다루었습니다.
//======================================
return을 사용하여 swapEqual(int[] a, int[] b)에서 교환된 a와 b의 값을 c와 d에 할당하고 결과를 확인할 수 있습니다.
PHP中文网2017-04-18 10:49:30
swapEqual 함수에서는 형식 매개변수 a, b의 참조만 변경되고, 실제 매개변수 c, d의 참조는 변경되지 않습니다.
스왑에서는 c와 d에 해당하는 영역의 값이 변경됩니다.
추가하자면, Java의 배열도 객체이므로 a, b, c, d는 모두 참조입니다.
伊谢尔伦2017-04-18 10:49:30
Java의 참조 개념은 C++의 개념과 조금 다릅니다. Java의 참조는 C++의 포인터와 동일하므로 형식 매개변수에 직접 값을 할당하여 실제 매개변수를 변경할 수 없습니다.
阿神2017-04-18 10:49:30
Java 참조(기본 유형, 객체 참조 유형 포함)는 선언, 메서드 호출 등 중에 새 참조를 생성합니다. 참조를 등호 오른쪽에 복사합니다. 다음 3가지 상황으로 나누어집니다.
레퍼런스에는 기본타입으로 표현되는 값이 저장되는데, 이 값을 저장할 수 있는 특별한 영역이 있어서 복사할 때 해당 값도 동시에 복사됩니다.
참조형의 이 영역은 힙 메모리에 객체의 메모리 주소를 저장하는데, 참조가 복사될 때 가리키는 메모리 주소가 동일하므로 값을 복사합니다(즉, , 개체)는 관여하지 않습니다
배열에는 저장된 참조(기본 유형 및 객체 참조 유형 포함)가 포함됩니다.
참조 정보: Java에서는 참조 데이터 유형이 메모리를 차지합니까?
이 문제를 명확히 하려면 먼저 JAVA에는 4가지 범주와 8가지 기본 유형이 있다는 점을 이해해야 합니다. 기본 유형을 제외하면 모두 참조 유형입니다. 예를 들어 int i = 1;
라고 쓰면 메모리 할당은 다음과 같습니다. 메모리에 공간이 할당되고 이 공간의 이름은 i, 내부 내용은 1입니다.
i를 이용하시면 이 공간의 콘텐츠에 접근하실 수 있습니다. 참조 유형은 메모리에서 두 개의 메모리 블록을 차지합니다. 예를 들어, String s; 또는 String s = null을 쓰면 메모리 조각이 메모리에 할당됩니다. 이 메모리는 null 값으로 로드됩니다. 이는 아무것도 로드되지 않았음을 의미합니다. 아직 초기화되지 않았기 때문입니다. 이전 사진:
이 s의 구체적인 할당은 선언된 위치에 따라 다릅니다. s가 지역 변수로 선언되면 s는 스택 공간에 있습니다. 지역 변수가 아니면 스택에 할당되지 않습니다. 그러나 s를 사용하여 String 유형의 객체를 가리키면 뭔가가 변경됩니다. 즉, 다음에 s = new String("zhihu");를 쓸 때입니다. 이전 사진:
원본 s에는 값이 있을 것입니다. s의 공간에 있는 이 값을 기반으로 힙에서 또 다른 메모리 조각을 찾을 수 있습니다. 모든 새로운 것은 힙 메모리에 있습니다. 문자열 속성은 힙의 이 메모리에 할당됩니다. 힙 메모리는 동적으로 할당된 메모리입니다. 따라서 힙에 할당되므로 실제로는 새 개체가 차지하는 메모리 양이 확실하지 않으며 개체가 할당되는 크기를 이해하기 위해 런타임 중에만 할당할 수 있습니다. 점유된 메모리를 확인할 수 없는 또 다른 이유는 메서드가 실행될 때만 메모리를 할당하기 때문입니다. 메소드가 호출되지 않으면 메소드는 단지 코드 묶음일 뿐이며 메모리를 차지하지 않습니다.