簡體   English   中英

如何復制hashset和hashmap,Java是否使用指針?

[英]How to copy hashset and hashmap, and does the Java use pointers?

我有兩個問題:
第一:
我有一個返回HashMap的函數。 要讀取返回的值,我這樣寫:

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

如果函數返回HashSet,我也會這樣做。

    HashSet<Integer> hs=my_func();

我想知道是否以這種方式將返回的值復制到hs中,或者我應該為它寫一個深層副本,或者我應該這樣寫:HashSet hs = new HashSet(my_func()); HashMap hm = new HashMap(my_func2());

第二個問題:
我通過調用make_matrix_funciton制作一個矩陣。 矩陣woule是一個二維數組,包含:
[0 1 1
0 0 0
0 0 0]
然后我將此矩陣賦予sort_vec,並在此函數中更改矩陣的元素。 我認為java不是基於指針的,所以當我從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;
    }

Java總是通過引用傳遞對象,因此如果從函數返回HashMap-Object,則引用將傳遞給示例中的hs變量。 將HashSet傳遞給新HashSet實例的構造函數將不起作用。 它將使用與原始對象引用相同的對象引用創建一個新的HashSet。 如果您修改其中一個對象,則更改也將顯示在所有其他參考點上。

如果你想完全分離副本,你需要自己的深度復制方法,因為在clone()方法JavaDoc中它說:

返回此HashSet實例的淺表副本:未克隆元素本身。

數組也是如此。 每個數組都是一個對象,因此如果修改一個元素,它將被修改為對該數組的所有引用。 要創建延遲副本,請使用System.arrayCopy

您誤解了Java的引用是如何工作的。

在第一部分中,您的對象將是對HashMap的引用 - 即,您從函數返回的任何對象

在第二部分中,您將傳遞對int [] []的引用,當它是一個基元數組時,它不會通過值傳遞。 因此,您的函數將修改數組。 如果您想要一個不修改輸入數組的函數,您需要復制傳入函數的函數,或者在將數組傳遞給函數之前需要復制該數組。

Java排序例程中的行為是它們修改原始數組。

總而言之, 沒有辦法在Java中“按值傳遞”對象或數組 如果您需要此行為,則必須手動克隆(例如,復制)對象或使用@ user3001的建議

一旦你弄明白了,你可能也想讀這個: http//javadude.com/articles/passbyvalue.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM