2012-04-23 3 views
2

두 가지 질문이 있습니다.
먼저 :
HashMap을 반환하는 함수가 있습니다. 반환 값을 읽으려면,이처럼 쓰기 함수가 HashSet의를 반환하는 경우해시 세트와 해시 맵을 복사하는 방법과 Java에서 포인터를 사용합니까?

HashMap<Integer,String> hs=my_func2(); 

나도 같은 않습니다.

HashSet<Integer> hs=my_func(); 

내가 이런 식으로 반환 된 값은 HS에 복사하는 경우 알고 싶어, 아니면 그것을 위해 깊은 사본을 작성해야하거나 내가 이런 식으로 작성해야 : HashSet에의 HS = 새로운 HashSet의 (my_func을()); HashMap hm = 새로운 HashMap (my_func2());

두 번째 질문 :
make_matrix_funciton을 호출하여 행렬을 만듭니다. 매트릭스를 포함하는 2 차원 배열이 woule :

[
0 0 0 0 1 1
0 0 0 다음에 I가 sort_vec이 매트릭스를 제공하고, 매트릭스의 변화의 기능의 요소. 나는 자바가 포인터 기반이 아니라고 생각한다. 그래서 sort_vec에서 나왔을 때 행렬은 그대로 있어야한다. 그러나, 그것은 바뀌었다! 이 [0 0 0 0 0

0 1 1 0]
인 sort_vec 함수 내에 적용된되었던 변화를 보여준다
. 정상적인가요? 그렇다면 예방하기 위해 무엇을해야합니까? 아래의 코드는 컴파일 할 수 있습니다.

public static void main(String args[]) { 
     int matrix[][]=new int[3][3]; 
     matrix=make_matrix("011000000"); 
     int indexes[]={2,1,0}; 
     int[][] mat=sort_vec(3,matrix,indexes); 
    } 

    private static int[][] sort_vec(int motifsize,int [][]mat,int[] indexes) 
    { 
     int[] main_index={0,1,2}; 

     int l=indexes.length; 
     for (Integer i=0;i<l;i++) 
      if(indexes[i]!=main_index[i]) 
      { 
       int j=indexes[i]; 
       int k=main_index[i+1]; 
       for(;k<l;k++) 
        if(indexes[k]==main_index[i]) 
         break; 

       indexes[k]=j; 
       mat=exchange(motifsize,mat,j,main_index[i]); 
      } 
     return mat; 
    } 
    private static int[][] exchange(int motifsize,int [][]matrix,int x,int y) 
    { 
     int temp; 

     for(int i=0;i<motifsize;i++) 
     { 
      temp=matrix[i][x]; 
      matrix[i][x]=matrix[i][y]; 
      matrix[i][y]=temp; 
     } 
     for(int i=0;i<motifsize;i++) 
     { 
      temp=matrix[x][i]; 
      matrix[x][i]=matrix[y][i]; 
      matrix[y][i]=temp; 
     } 

     return matrix; 
    } 
    private static int[][] make_matrix(String id) 
    { 
     int matrix[][]=new int[3][3]; 
     int c=0; 
     for(int x=0;x<3;x++) 
      for(int y=0;y<3;y++) 
      { 
       if(id.charAt(c)=='1' || id.charAt(c)=='5') 
        matrix[x][y]=1; 
       c++; 
      } 
     return matrix; 
    } 
+1

이 두 가지 질문이 있습니까 전혀 관련이 없습니까? 그렇지 않으면 두 가지 질문으로 질문해야합니다. – twain249

+3

나는 대답이 매우 유사하기 때문에 그들이 관련성을 가질 수 있다고 생각한다. – user3001

+0

사본이 필요하십니까? 그렇다면, 확실합니까? –

답변

6

자바는 항상 참조로 객체를 전달합니다, 그래서 당신은 함수에서의 HashMap 객체를 반환하는 경우, 기준이 예에서 HS 변수에 전달됩니다. 새 HashSet 인스턴스의 생성자에 HashSet을 전달하면 작동하지 않습니다. 원래 HashSet과 동일한 객체 참조를 갖는 새로운 HashSet을 생성합니다. 이 오브젝트 중 하나를 수정하면 다른 모든 참조 점에도 변경 사항이 나타납니다. 당신이 완전히 복사를 분리하려는 경우 JavaDoc for the clone() method에서 말하는 때문에

, 당신은 깊은 복사를위한 자신 만의 방법이 필요합니다 요소 자체는 복제되지 않습니다

는 HashSet 인스턴스의 샤로 코피를 돌려줍니다 .

배열에 대해서도 마찬가지입니다. 모든 배열은 객체이므로 요소를 수정하면이 배열에 대한 모든 참조에 대해 수정됩니다. 지연 복사본을 만들려면 System.arrayCopy

+1

내에서 수정 된 경우 함수 밖에서도 변경됩니다. java는 항상 값에 의한 전달입니다. 객체의 경우, 참조의 값. 미묘한 구별이 있습니다. http://javadude.com/articles/passbyvalue.htm – marathon

2

Java 참조가 어떻게 작동하는지 오해하고 있습니다. 첫 번째 부분에서는

, 당신의 개체는 HashMap에 대한 참조가 될 것 - 즉, 두 번째 부분에서 기능

에서 반환 한 어떤 개체, 당신의 int [] [에 대한 참조를 전달하는 ], 프리미티브 배열 일 때 값으로 전달되지 않습니다. 따라서 함수가 배열을 수정합니다. 입력 배열을 수정하지 않는 함수를 원하면 함수에 전달 된 것을 복사하거나 함수에 전달하기 전에 배열을 복사해야합니다.

Java 정렬 루틴의 동작은 원래 배열을 수정한다는 것입니다.

의 개체 또는 배열을 '값으로 전달'할 방법이 없습니다. 당신이 파악되면이 동작을 원하는 경우, 복제가 (예를 들어, 복사) 오브젝트를 수동으로 또는 user3001의 제안 @ 사용은

, 당신은뿐만 아니라이 글을 읽을 할 수 있습니다 : http://javadude.com/articles/passbyvalue.htm

+0

그래서 기본 유형 대신 Integer 유형의 배열을 정의해야한다고 생각하십니까? – Pegah

+0

아니, 기다려. 그건 중요하지 않아. 함수가 원본에 영향을주지 않는 복사 된 배열을 반환하도록 하시겠습니까? – dfb

+0

변수 mat은 행렬의 수정 된 버전 인 새 배열이어야합니다. 하지만 int [] [] mat = sort_vec (3, matrix, indexes) 다음에 줄을 긋을 때 행렬이 바뀌길 원하지 않습니다. 행렬이 sort_vec 내에서 변경되면 정상입니다. – Pegah

관련 문제