2016-05-16 58 views
1

我试图打印“包含”,但是,HashSet未检测到Integer []值。它是否与通过引用通过有关?如果我不想将实际的Integer []对象传递给方法的参数,我该如何克服这一点?HashSet为什么说它不包含这个对象?

import java.util.*; 

public class passByReference2{ 
    public static void method(HashSet<Integer[]> visited){ 
     Integer[] n = {1, 2}; 
     if (visited.contains(n)){ 
      System.out.println("Contains"); 
     } 
    } 

    public static void main(String[]args){ 
     HashSet<Integer[]> visited = new HashSet<Integer[]>(); 
     Integer[]v = {1, 2}; 
     visited.add(v); 
     method(visited); 
    } 


} 
+1

*没有*在Java通过引用传递。它只是传值。 –

回答

4

这是因为数组没有在比较元素的方式实现hashCode - 事实上,数组不会覆盖所有hashCode(或equals),因此使用从Object实施。

数组的hashCodeequals纯粹是基于身份。


如果要“克服”它,使用一种基于元素的值,例如,它计算hashCodeequalsArrayList<Integer>

+1

它们也没有实现'equals',因此它们继承了使用'=='的默认实现。 – user2357112

+0

@ user2357112为true,已更新。 –

0

在Java中,默认的hashCode实现是使用该对象的地址。

这一般是通过将该对象的内部地址转换成一个整数来实现的,但不是由的JavaTM编程语言不需要这种实现技巧。)

hashCode() javadocs

相关问题