목록에서 정수를 올바르게 제거
내가 방금 만난 좋은 함정이 있습니다. 정수 목록을 고려하십시오.
List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(6);
list.add(7);
list.add(1);
당신이 실행할 때 무슨 일이 일어나는지에 대한 교육받은 추측 list.remove(1)
? 무엇에 대해 list.remove(new Integer(1))
? 이로 인해 일부 버그가 발생할 수 있습니다.
정수 목록을 다룰 때 remove(int index)
주어진 색인 remove(Object o)
에서 요소를 제거하는 요소와 참조로 요소를 제거하는 을 구별하는 올바른 방법은 무엇입니까 ?
여기서 고려해야 할 요점은 @Nikita가 언급 한 것입니다 . 정확한 매개 변수 일치는 자동 복싱보다 우선합니다.
Java는 항상 귀하의 주장에 가장 적합한 방법을 호출합니다. 자동 복싱 및 암시 적 업 캐스팅은 캐스팅 / 자동 복싱없이 호출 할 수있는 방법이없는 경우에만 수행됩니다.
List 인터페이스는 두 가지 remove 메소드를 지정합니다 (인수 이름 지정에 유의하십시오).
remove(Object o)
remove(int index)
즉 list.remove(1)
, 위치 1에서 오브젝트를 remove(new Integer(1))
제거하고이 목록에서 지정된 요소가 처음 나타나는 것을 제거합니다.
캐스팅을 사용할 수 있습니다
list.remove((int) n);
과
list.remove((Integer) n);
n이 int 또는 Integer인지 여부는 중요하지 않습니다. 메소드는 항상 예상 한 것을 호출합니다.
사용 (Integer) n
또는 것이 Integer.valueOf(n)
보다 효율적입니다 new Integer(n)
나중에 항상 객체를 생성하는 반면 처음 두가, 정수 캐시를 사용할 수있다.
나는 '적절한'방법에 대해 모르지만 제안한 방식은 잘 작동합니다.
list.remove(int_parameter);
주어진 위치에서 요소를 제거하고
list.remove(Integer_parameter);
주어진 객체를 목록에서 제거합니다.
VM은 처음에 정확히 동일한 매개 변수 유형으로 선언 된 메서드를 찾은 다음 오토 박스를 시도하기 때문입니다.
list.remove(4)
와 정확히 일치 list.remove(int index)
하므로 호출됩니다. 전화를 걸 list.remove(Object)
려면 다음을 수행하십시오 list.remove((Integer)4)
..
list.remove (1)을 실행할 때 어떤 일이 발생하는지에 대한 교육 된 추측이 있습니까? list.remove (new Integer (1))는 어떻습니까?
추측 할 필요가 없습니다. 첫 번째 경우가 List.remove(int)
호출되고 위치의 요소 1
가 제거됩니다. 두 번째 경우는 List.remove(Integer)
호출되고 값이 같은 요소는 Integer(1)
제거됩니다. 두 경우 모두 Java 컴파일러는 가장 일치하는 과부하를 선택합니다.
예, 여기에는 혼동 (및 버그)이있을 수 있지만 매우 드문 경우입니다.
두 List.remove
메소드가 Java 1.2에서 정의 되었을 때, 과부하는 모호하지 않았습니다. 이 문제는 Java 1.5에서 제네릭과 오토 박싱을 도입 한 경우에만 발생했습니다. 후시로, 제거 방법 중 하나에 다른 이름을 부여하면 더 좋을 것입니다. 그러나 지금 너무 늦었습니다.
VM이 올바른 작업을 수행하지 않더라도 remove(java.lang.Object)
임의의 개체에서 작동 하는 사실을 사용하여 올바른 동작을 보장 할 수 있습니다 .
myList.remove(new Object() {
@Override
public boolean equals(Object other) {
int k = ((Integer) other).intValue();
return k == 1;
}
}
#decitrig에서 제안한대로 첫 번째로 허용되는 답변은 다음과 같습니다.
list.remove(Integer.valueOf(intereger_parameter));
이것은 나를 도왔다. 귀하의 의견에 다시 #decitrig 감사합니다. 어떤 사람에게는 도움이 될 수 있습니다.
여기 트릭이 있습니다.
여기 두 가지 예를 들어 보자.
public class ArrayListExample {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<>();
List<Integer> arrayList = new ArrayList<>();
collection.add(1);
collection.add(2);
collection.add(3);
collection.add(null);
collection.add(4);
collection.add(null);
System.out.println("Collection" + collection);
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(null);
arrayList.add(4);
arrayList.add(null);
System.out.println("ArrayList" + arrayList);
collection.remove(3);
arrayList.remove(3);
System.out.println("");
System.out.println("After Removal of '3' :");
System.out.println("Collection" + collection);
System.out.println("ArrayList" + arrayList);
collection.remove(null);
arrayList.remove(null);
System.out.println("");
System.out.println("After Removal of 'null': ");
System.out.println("Collection" + collection);
System.out.println("ArrayList" + arrayList);
}
}
이제 출력을 보자.
Collection[1, 2, 3, null, 4, null]
ArrayList[1, 2, 3, null, 4, null]
After Removal of '3' :
Collection[1, 2, null, 4, null]
ArrayList[1, 2, 3, 4, null]
After Removal of 'null':
Collection[1, 2, 4, null]
ArrayList[1, 2, 3, 4]
이제 출력을 분석해 봅시다 :
When 3 is removed from the collection it calls the
remove()
method of the collection which takesObject o
as parameter. Hence it removes the object3
. But in arrayList object it is overridden by index 3 and hence the 4th element is removed.By the same logic of Object removal null is removed in both cases in the second output.
So to remove the number 3
which is an object we will explicitly need to pass 3 as an object
.
And that can be done by casting or wrapping using the wrapper class Integer
.
Eg:
Integer removeIndex = Integer.valueOf("3");
collection.remove(removeIndex);
참고URL : https://stackoverflow.com/questions/4534146/properly-removing-an-integer-from-a-listinteger
'IT story' 카테고리의 다른 글
페이지를 새로 고침하면 AngularJS HTML5 모드에서 잘못된 GET 요청이 발생합니다. (0) | 2020.05.12 |
---|---|
Java에서 2 개의 XML 문서를 비교하는 가장 좋은 방법 (0) | 2020.05.12 |
CLI를 사용하여 구성 요소를 삭제하는 가장 좋은 방법은 무엇입니까 (0) | 2020.05.12 |
PHP에서 구문 분석 오류가 표시되지 않는 이유는 무엇입니까? (0) | 2020.05.12 |
IIS 7, Windows 7에서 ASP.NET 4.0을 응용 프로그램 풀로 추가하는 방법 (0) | 2020.05.11 |