问题
As I have an ArrayList of int arrays which contains duplicates, I'd like to use HashSet. Unfortunately, I can't manage to use HashSet as I wish:
System.out.print("\nTESTs\n");
ArrayList<int[]> list = new ArrayList<int[]>();
list.add(new int[]{1,2,3});
list.add(new int[]{5,1,1});
list.add(new int[]{1,2,3});//duplicate
list.add(new int[]{5,1,3});
Set<int[]> set = new HashSet<int[]>(list);
System.out.println("Size of the set = "+set.size());
ArrayList<int[]> arrayList = new ArrayList<int[]>(set);
System.out.println("Size of the arrayList = "+arrayList.size());
for (int[] array:arrayList){
System.out.println(Arrays.toString(array));
}
It results in:
Size of the set = 4
Size of the arrayList = 4
[1, 2, 3]
[1, 2, 3] // duplicate still here
[5, 1, 1]
[5, 1, 3]
Could anybody tell me where I'm wrong ?
Thanks in advance Dominique (java newbie)
回答1:
Arrays don't override hashCode
and equals
implemented in Object
class, and therefore, two arrays a1 and a2 will be considered as identical to each other by HashSet
only if a1==a2, which is false in your case.
If you use ArrayList
s instead of arrays, your problem will be solved, since for ArrayList
s equality is determined by the equality of the members of the lists (and the order in which they appear).
回答2:
That's because HashSet
uses .equals()
to see if a new object is duplicated (and .hashCode()
to determine the "bucket").
When you work with arrays, please be aware that new int[]{1,2,3}
is NOT "equal to" new int[]{1,2,3}
.
The proper way to "deep compare" arrays is via Arrays.equals(a, b)
method.
To solve your problem situation effectively you should create a wrapper class which contains your int[]
array and then implement .hashCode()
and equals()
properly.
回答3:
Add each number individually. Don't add Arrays to HashSet
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1==arr2);//false
System.out.println(arr1.equals(arr2)); //false
Two arrays with same values need not be equal
(they use default equals()
method defined in Object
which compares references.)
来源:https://stackoverflow.com/questions/28344312/hashset-usage-with-int-arrays