I have following two scenarios:
1. int value as parameter
int intNum = 2;
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.remove(intNum);
System.out.println(list.size());
// output: 2
2. long value as parameter
long longNum = 2;
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.remove(longNum);
System.out.println(list.size());
// output: 3
I am passing 2 as the value in both cases, but I am getting a different size value of the List. What is the actual reason for this behavior?
Properly removing an Integer from a List does not explain about build-in data type having same value but having behavior differently as asked above
解决方案
Autoboxing
The list.remove method is overloaded, and the two different signatures are used for different purposes. One, list.remove(int), removes an item based on its index, and the other one, list.remove(Object), removes an item based on object equality.
Your first situation triggers the first type, and your second example (with a long longNum), triggers the second type, autoboxing the long primitive to a java.lang.Long object. This is not equal to the java.lang.Integer (autoboxed) values added to the list, and thus will not remove anything from the list and the size will remain same.