Peg*_*gah 2 java arrays pointers copy hashset
我有两个问题:
第一:
我有一个返回HashMap的函数.要读取返回的值,我这样写:
HashMap<Integer,String> hs=my_func2();
Run Code Online (Sandbox Code Playgroud)
如果函数返回HashSet,我也会这样做.
HashSet<Integer> hs=my_func();
Run Code Online (Sandbox Code Playgroud)
我想知道是否以这种方式将返回的值复制到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;
}
Run Code Online (Sandbox Code Playgroud)
Java总是通过引用传递对象,因此如果从函数返回HashMap-Object,则引用将传递给示例中的hs变量.将HashSet传递给新HashSet实例的构造函数将不起作用.它将使用与原始对象引用相同的对象引用创建一个新的HashSet.如果您修改其中一个对象,则更改也将显示在所有其他参考点上.
如果你想完全分离副本,你需要自己的深度复制方法,因为在clone()方法的JavaDoc中它说:
返回此HashSet实例的浅表副本:未克隆元素本身.
数组也是如此.每个数组都是一个对象,因此如果修改一个元素,它将被修改为对该数组的所有引用.要创建延迟副本,请使用System.arrayCopy