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

2024-04-18

我有两个问题:
First:
我有一个返回 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 函数来创建一个矩阵。矩阵将是一个二维数组,包含:
[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 中的对象引用相同。如果修改这些对象之一,更改也会出现在所有其他参考点上。

如果你想完全分离副本,你将需要你自己的深度复制方法,因为在clone() 方法的 JavaDoc http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#clone%28%29它说:

返回此 HashSet 实例的浅表副本:元素本身不会被克隆。

数组也是如此。每个数组都是一个对象,因此如果修改一个元素,则对该数组的所有引用都会被修改。要创建延迟副本,请使用系统.arrayCopy http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何复制hashset和hashmap,Java是否使用指针? 的相关文章

随机推荐

  • Zookeeper 错过了连续更改的事件

    我目前有一个带有单个 Zookeeper 节点和 Curator 的设置来访问数据 读取数据是通过 Curator TreeCache 完成的 我有以下测试 public void test callback successive chan
  • GNU 链接器:适应名称修改算法的更改

    我正在尝试重新编译现有的 C 应用程序 不幸的是 我必须依赖一个专有库 我只有一个预编译的静态存档 我使用 g 版本 7 3 0 和 ld 版本 2 30 无论它是用什么 GCC 版本编译的 它都是古老的 头文件定义了方法 class fo
  • 如何将嵌入式 PostgreSQL Server Java 组件作为单独的服务使用?

    我正在尝试为基于 RESTful 服务 Java 的应用程序创建一个全面的集成测试套件 该应用程序在 Tomcat 7 x 中运行并依赖于 Postgresql 9 x 实例 此外 我希望能够将这个套件作为一个独立的进程运行 如果可能的话
  • 如何为 UILabel 指定日语编码?

    当我尝试在 iOS 上的 UILabel 中显示日语字符串时 它会使用中文编码而不是日语显示 这两个编码是nearly除少数特殊情况外 完全相同 例如 以下是字符 直 Unicode U 76F4 在中文 上 与日文 下 中的呈现方式 se
  • 在 Python 中设置系统日期(在 Windows 上)

    似乎有许多软件包用于获取 格式化当前日期 或查找从现在开始的 n 个时间间隔的日期 但我一定忽略了在 Python 中设置日期的简单方法 如 Windows 的 date exe 的存在 这样的功能肯定存在吗 我无法在 Google Pyt
  • 将字符串传递给 settimeout 是不好的做法吗?如果是,为什么? [复制]

    这个问题在这里已经有答案了 可能的重复 是否有充分的理由将字符串传递给 setTimeout https stackoverflow com questions 6081560 is there ever a good reason to
  • 无法获取动态导入的模块:

    我有一些延迟导入的 React 组件App tsx App tsx用于Index tsx它被渲染并附加到的地方body const IndexPage lazy gt import features IndexPage const Tags
  • 在 Playstore 中发布现成的 Kivy 应用程序之前的流程?

    我已经做了buildozer android debug并拥有 apk文件已安装并且工作正常 至少针对一个 两个设备进行了测试 这也是半默认的buildozer spec 例如 域名仍然是org test但随着应用程序的名称进行了调整 有了
  • 如何在可拖动和可放置之间划清界限?

    我正在使用优秀的 JQuery UI 进行 映射 以便用户可以 映射 来自一个计划的人员与来自另一计划的人员 使用这个简单的 JQuery document ready function div draggable draggable re
  • 如何在 iOS 上检测设备的方向?

    我有一个关于如何在 iOS 上检测设备方向的问题 我不需要接收更改通知 只需接收当前方向本身 这似乎是一个相当简单的问题 但我一直无法理解它 以下是我到目前为止所做的 UIDevice myDevice UIDevice currentDe
  • 插件 AppDomains 解决方法

    在处理自己的子目录中的插件程序集时 存在一个众所周知的问题 一旦这些程序集尝试从其子目录加载各自的依赖项 它们将无法加载 解决方案是在 AppDomains 中加载插件PrivateBinPath设置在他们的AppDomainSetup初始
  • 使用当前活动的 Google Drive 集成

    是否可以在不创建自己的 Activity 的情况下与 Google Drive 集成 而只是使用应用程序的当前 Activity 而不用 Google Drive 相关代码污染它 我有一个后台 服务 不是 Android 服务 只是一个与
  • 非 www 到 www htaccess 重定向

    我有一个 net 网址 它与前面的 www 完美配合 但是当网址只是http example net http example net它打开了一个正在建设的页面 我尝试了各种 htaccess 文件 但没有任何效果 帮助 我不是网络开发人员
  • CSS3 在动画元素上旋转导致不调用单击事件

    好吧 这个给我带来了很多问题 使用css3时 webkit transform具有任何类型 3d 旋转的样式 例如rotateY 30deg 给这个旋转的对象绑定点击事件是极其不可靠的 请参阅下面的示例代码或查看这把小提琴 http jsf
  • 序列化迁移执行顺序

    我似乎无法在任何地方找到这个问题的答案 我了解 Sequelize 迁移和播种器的工作原理 但我没有找到任何地方说明它们是否按某种特定顺序执行 因此 如果我从一个数据库开始 进行一系列迁移 然后决定从原始起点初始化一个全新的数据库 它将以完
  • 如何在Android应用程序中实现应用内计费?

    看来在Android应用程序中实现应用内计费是相当复杂的 我怎么能这样做呢 SDK 中的示例应用程序只有一个 Activity 这对于像我这样具有多个 Activity 的应用程序来说过于简化了 好吧 我会尝试解释一下我的经历 我不认为自己
  • Mac zip 压缩没有 __MACOSX 文件夹?

    当我在 Mac OSX 中使用内置 zip 压缩器压缩文件时 会导致在提取的 zip 中创建一个名为 MACOSX 的额外文件夹 我可以调整设置以防止创建此文件夹吗 或者我是否需要购买第三方压缩工具 UPDATE 我刚刚找到一个适用于 OS
  • 使用 simplexml_load_file 从 tumblr 中提取 - 每次都会超时

    我的网站加载时间约为 45 秒 这是因为我从 tumblr 中提取了一些 XML 但我无法确定这是我的服务器的错误 tumblr 的错误还是其他因素 我可以让这个脚本在 5 秒后超时并回显 tumblr 已关闭 吗 而不是在近一分钟后超时
  • 等待CSS中的背景图像完全加载[重复]

    这个问题在这里已经有答案了 我有一个网络应用程序 它使用外部 CSS 中加载的外部背景图像 现在 可以在图像完全渲染之前使用该应用程序 从而产生奇怪的视觉效果 如何停止脚本执行直到图像完全加载 它可以使用普通的 JavaScript 或 j
  • 如何复制hashset和hashmap,Java是否使用指针?

    我有两个问题 First 我有一个返回 HashMap 的函数 为了读取返回值 我这样写 HashMap