Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undesired behavior of ArrayList remove() in Java [duplicate]

I have following two scenarios:

1. int value as parameter

int intNum = 2;
List<Integer> list = new ArrayList<Integer>();
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<Integer> list = new ArrayList<Integer>();
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

like image 290
Farooque Avatar asked May 20 '15 12:05

Farooque


People also ask

Does ArrayList allow duplicates in Java?

ArrayList allows duplicate values in its collection. On other hand duplicate elements are not allowed in Hashset.

Does ArrayList have a remove method?

remove(int index) method removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).

Does list allow duplicates in Java?

List allows duplicates while Set doesn't allow duplicate elements . All the elements of a Set should be unique if you try to insert the duplicate element in Set it would replace the existing value. List permits any number of null values in its collection while Set permits only one null value in its collection.


1 Answers

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.

like image 169
beetstra Avatar answered Sep 19 '22 18:09

beetstra