gpt4 book ai didi

java - 如何复制hashset和hashmap,Java是否使用指针?

转载 作者:行者123 更新时间:2023-12-02 03:33:36 25 4
gpt4 key购买 nike

我有两个问题:
第一:
我有一个返回 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 来创建一个矩阵。矩阵将是一个二维数组,包含:
[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 对象,则该引用将传递给示例中的 hs 变量。将 HashSet 传递给新 HashSet 实例的构造函数将不起作用。它将创建一个新的 HashSet,其对象引用与原始 HashSet 中的对象引用相同。如果您修改这些对象之一,则更改也会出现在所有其他引用点上。

如果您想完全分离副本,您将需要自己的深度复制方法,因为在 JavaDoc for the clone() method 中它说:

Returns a shallow copy of this HashSet instance: the elements themselves are not cloned.

数组也是如此。每个数组都是一个对象,因此如果修改一个元素,则对该数组的所有引用都会被修改。要创建延迟副本,请使用 System.arrayCopy

关于java - 如何复制hashset和hashmap,Java是否使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10289682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com