누구든지 AbstractList (및 ArrayList )의 removeRange 메서드가 왜 어떤 아이디어 가 있습니까? 꽤 잘 정의되고 유용한 작업처럼 보이지만 여전히이를 사용하려면 List 구현을 하위 클래스로 만들어야합니다.protected
숨겨진 근거가 있습니까? 나에게는 설명 할 수없는 것 같다.
누구든지 AbstractList (및 ArrayList )의 removeRange 메서드가 왜 어떤 아이디어 가 있습니까? 꽤 잘 정의되고 유용한 작업처럼 보이지만 여전히이를 사용하려면 List 구현을 하위 클래스로 만들어야합니다.protected
숨겨진 근거가 있습니까? 나에게는 설명 할 수없는 것 같다.
답변:
예, 이것이 외부 코드에서 범위를 제거하는 방법이 아니기 때문입니다. 대신 다음을 수행하십시오.
list.subList(start, end).clear();
이것은 실제로 removeRange
무대 뒤를 호출 합니다. †
OP는 왜 공용 API의 removeRange
일부가 아닌지 묻습니다 List
. 그 이유는 Effective Java 2nd ed의 항목 40에 설명되어 있으며 여기에서 인용합니다.
너무 긴 매개 변수 목록을 줄이는 세 가지 기술이 있습니다. 하나는 메서드를 여러 메서드로 나누는 것입니다. 각 메서드에는 매개 변수의 하위 집합 만 필요합니다. 부주의하게 수행하면 메서드가 너무 많이 생성 될 수 있지만 직교성을 높여 메서드 수를 줄이는 데 도움이 될 수도 있습니다 . 예를 들어,
java.util.List
인터페이스를 고려하십시오 . 하위 목록에서 요소의 첫 번째 또는 마지막 색인을 찾는 방법을 제공하지 않으며, 둘 다 세 개의 매개 변수가 필요합니다. 대신subList
두 개의 매개 변수를 취하고 하위 목록 의 보기 를 리턴하는 메소드를 제공합니다 . 이 메소드는 각각 하나의 매개 변수를 가진indexOf
또는lastIndexOf
메소드 와 결합 하여 원하는 기능을 생성 할 수 있습니다. 또한subList
메서드는 인스턴스에서 작동하는 모든 메서드 와 결합하여List
하위 목록에서 임의의 계산을 수행 할 수 있습니다 . 결과 API는 중량 대 전력 비율이 매우 높습니다.
하나는 그 주장 할 수 removeRange
많은 매개 변수를 가지고 아마 때문에하지 않는이 치료 후보 만 호출하는 방법이 주어진하지 않으며 removeRange
관통 subList
, 위 어수선 할 이유가 없다 List
중복 방법과 인터페이스를.
†AbstractList.removeRange
문서는 말합니다 :
이 메서드는
clear
이 목록 및 하위 목록 에 대한 작업에 의해 호출됩니다 . 목록 구현의 내부를 활용하기 위해이 메서드를 재정의하면 이 목록과 하위 목록 에 대한 작업 성능을 크게 향상시킬 수 있습니다clear
.
또한 OpenJDK의 AbstractList.clear
및 SubList.removeRange
.
removeRange
호출 되는 것을 알았 습니까? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/... (가) 전체 arraycopy 코드를 하나 넣어 봤는데 수 있도록, 0 (에서 수행으로 ); 차이점은 a) arraycopy가 기본 호출이며 오버 헤드가 발생합니다. b) arraycopy는 항상 매개 변수의 정확성을 확인합니다. stackoverflow.com/questions/12594046/…arraycopy
ArrayList
numMoved
if
remove