【问题标题】:comparing arrays in java比较java中的数组
【发布时间】:2011-04-07 22:36:30
【问题描述】:
int [] nir1 = new int [2];
nir1[1] = 1;
nir1[0] = 0;


int [] nir2 = new int [2];
nir2[1] = 1;
nir2[0] = 0;

boolean t = nir1.equals(nir2);
boolean m = nir1.toString().equals(nir2.toString());

为什么 m 和 t 都是假的?在 Java 中比较 2 个数组的正确方法是什么?

【问题讨论】:

  • char[].equals 正在进行内存比较,而不是内容比较

标签: java arrays compare equals


【解决方案1】:

使用Arrays.equals 方法。示例:

boolean b = Arrays.equals(nir1, nir2); //prints true in this case

【讨论】:

    【解决方案2】:

    t 返回 false 的原因是因为数组使用了 Object 可用的方法。由于这是使用Object#equals(),它返回false,因为nir1nir2 不是同一个对象。

    m 的情况下,同样的想法也成立。 Object#toString() 打印出一个对象标识符。就我而言,当我将它们打印出来并检查它们时,结果是

    nir1 = [I@3e25a5
    nir2 = [I@19821f
    

    当然,它们不一样。

    CoolBeans 是正确的;使用静态Arrays.equals() 方法来比较它们。

    【讨论】:

      【解决方案3】:
      boolean t = Arrays.equals(nir1,nir2)
      

      【讨论】:

        【解决方案4】:

        使用Arrays.equals 代替array1.equals(array2)Arrays.equals(array1, array2) 会检查两个数组的内容,后面会检查引用。 array1.equals(array2) 仅表示 array1 == array2 在这种情况下不正确。

        public static boolean perm (String s, String t){
        
           if (s.length() != t.length()) {
        
                 return false;
        
           }
           char[] perm1 = s.toCharArray();
        
           Arrays.sort(perm1);
        
           char[] perm2 = t.toCharArray();
        
           Arrays.sort(perm2);
        
           return Arrays.equals(perm1, perm2);
         }
        

        【讨论】:

          【解决方案5】:

          我只是想指出失败的原因:

          数组不是对象,它们是原始类型。

          当您打印 nir1.toString() 时,您会以文本形式获得 nir1 的 java 标识符。由于 nir1 和 nir2 是分开分配的,它们是唯一的,这将为 toString() 产生不同的值。

          出于同样的原因,这两个数组也不相等。它们是单独的变量,即使它们具有相同的内容。

          就像其他发帖人建议的那样,要走的路是使用 Arrays 类:

          Arrays.toString(nir1);
          

          Arrays.deepToString(nir1);
          

          对于复杂的数组。

          另外,为了平等:

          Arrays.equals(nir1,nir2);
          

          【讨论】:

          • 数组实际上是对象;在此处查看 JLS。 java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
          • 这太奇怪了。如果它们是对象,那么为什么我不能扩展它们或改变它们的行为?如果可能的话,OP 可以覆盖 toString()、equals() 和 hashCode() 并且他的方法会起作用。
          【解决方案6】:

          使用这个:

          return Arrays.equals(perm1, perm2)
          

          改为:

          return perm1.equals(perm2);
          

          请一定要看this

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多