[java] List <Integer>에서 정수를 올바르게 제거

내가 방금 만난 좋은 함정이 있습니다. 정수 목록을 고려하십시오.

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에서 정의 되었을 때, 과부하는 모호하지 않았습니다. 이 문제는 자바 1.5에서 제네릭과 오토 박싱 (autoboxing)을 도입했을 때만 발생했다. 후시로, 제거 방법 중 하나에 다른 이름을 부여하면 더 좋을 것입니다. 그러나 지금 너무 늦었습니다.


답변

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 감사합니다. 어떤 사람에게는 도움이 될 수 있습니다.