수집 처리


1. [필수] hashCode 및 equals 처리에 대해서는 다음 규칙을 따르십시오.

1) equals를 다시 작성하는 한 hashCode도 다시 작성해야 합니다.

2) Set은 고유한 개체를 저장하고 hashCode 및 같음을 기준으로 판단되므로 Set에 저장된

개체는 이 두 메서드를 재정의해야 합니다.

3) 사용자 정의 개체가 맵 키로 사용되는 경우 hashCode 및 같음을 재정의해야 합니다.

긍정적인 예: String은 hashCode 및 equals 메서드를 재정의하므로 String 개체 를 키로 사용할 수 있습니다.


2. ArrayList의 subList 결과는 ArrayList로 캐스팅될 수 없습니다. 그렇지 않으면 ClassCastException이 발생합니다. java util .

설명: subList는 ArrayList가 아닌 ArrayList의 뷰인 ArrayList의 내부 클래스 SubList를 반환합니다. SubList 하위 목록의 모든 작업은 결국 원본 목록에 반영됩니다.


3. subList 시나리오에서는 원본 컬렉션의 요소 수 수정에 주의하세요. 그러면 하위 목록의 순회, 추가 및 삭제 중에 ConcurrentModificationException 예외가 생성됩니다. .


4. [필수] 집합을 배열로 변환하는 방법을 사용하려면 집합의 toArray(T[] 배열)을 사용해야 하며, 입력은 정확히 동일한 유형의 배열입니다. 크기는 목록입니다.

Counter 예:

toArray 매개변수 없는 메서드를 직접 사용하는 데 문제가 있습니다. 이 메서드의 반환 값은 Object[] 클래스만 될 수 있습니다. 다른

유형 배열을 강제 캐스팅하면 ClassCastException 오류가 발생합니다. . 긍정적인 예:

List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
설명:

입력 매개변수에 의해 할당된 배열 공간이 충분히 크지 않은 경우 toArray 메소드는 내부적으로 메모리 공간을 재할당

하고 새 배열을 반환합니다. 배열 요소가 실제로 필요한 것보다 큰 경우 아래 첨자 [ list .size() ]가 있는 배열 요소는 null로 설정되고 다른 배열 요소는 원래 값을 유지합니다. 메서드에서 매개변수 그룹 크기와 컬렉션 요소 수를 정의하는 것이 가장 좋습니다.

5. 도구 클래스 Arrays.asList()를 사용하여 배열을 컬렉션으로 변환하는 경우 해당 메서드를 사용하여 컬렉션을 수정할 수 없습니다. .

참고: asList의 반환 개체는 Arrays 내부 클래스이며 컬렉션 수정 방법을 구현하지 않습니다. Arrays.asList는 인터페이스만 변환하는 어댑터 모드를 구현하며 배경 데이터는 여전히 배열입니다.

String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);

첫 번째 경우: list.add("c"); 런타임 예외.

두 번째 경우: str[0]= "gujin"; 그러면 list.get(0)도 이에 따라 수정됩니다.


6. [필수] 반환된 데이터를 받으려면 일반 와일드카드 문자 <? 확장 T >를 사용하세요.

참고: 사과를 포장한 후 <? 확장 과일 > 개체는 사과를 포함하여 어떤 과일도 추가할 수 없습니다.


7. [필수] foreach 루프의 요소에 대해 제거/추가 작업을 수행하지 마세요. 요소를 제거하려면 Iterator

메서드를 사용하세요. 동시에 작업하는 경우 Iterator 개체를 잠가야 합니다.

카운터 예:

List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
if("1".equals(temp)){
a.remove(temp);
}
}

설명: 위 코드의 실행 결과는 확실히 모든 사람의 기대를 뛰어넘을 것이므로 "1"을 "2"로 바꾸면 동일한결과가 나올까요?

긍정적인 예:

Iterator<String> it = a.iterator();
while(it.hasNext()){
String temp = it.next();
if(删除元素的条件){
it.remove();
}
}

8 [필수] JDK 7 이상에서는 Comparator가 반사성, 전이성 및 대칭성을 충족해야 합니다. 그렇지 않으면 Arrays.sort,

Collections.sort가 IllegalArgumentException 예외를 보고합니다.

설명:

1) 재귀성: x와 y의 비교 결과는 y와 x의 비교 결과와 반대입니다.

2) 이행성: x > y , y > z , x >

3) 대칭: x = y이면 x와 z의 비교 결과는 y와 z의 비교 결과와 같습니다.

카운터 예시: 다음 예시는 동등 상황을 처리하지 않으며 실제 사용 시 예외가 발생할 수 있습니다.

new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() > o2.getId() ? 1 : -1;
}
}

9. [권장 사항] 컬렉션을 초기화할 때 컬렉션의 초기 값 크기를 지정해 보세요.

참고: ArrayList(intinitialCapacity)를 사용하여 ArrayList를 초기화해 보세요.


10. [권장] keySet 대신 Map 클래스 컬렉션 KV를 탐색하려면 EntrySet을 사용하세요.

설명: keySet은 실제로 두 번 순회하는데, 하나는 이를 Iterator 객체로 변환하는 것이고, 다른 하나는 hashMap에서 key에 해당하는 값을 가져오는 것입니다. EntrySet은 한 번만 순회하여 키와 값을 모두 항목에 넣습니다. 이는 더 효율적입니다. JDK 8의 경우 Map foreach 메소드를 사용하십시오.

긍정적인 예: values()는 목록 컬렉션 개체인 V 값 집합을 반환합니다. keySet()는 Set 컬렉션 개체인 K 값 집합을 반환합니다. ;entrySet()은 K - V 값의 조합 세트를 반환합니다.


11 [권장] 다음과 같이 Map 클래스 컬렉션 K/V가 null 값을 저장할 수 있는지 주의 깊게 살펴보세요. 다음 표: #🎜 🎜#

QQ截图20170211092116.png

반대 예: HashMap의 간섭으로 인해 많은 사람들이 ConcurrentHashMap이 null 값을 입력할 수 있다고 생각합니다. , 저장에 주의하세요 값이 null이면 NPE 예외가 발생합니다.


12 [참고] 집합의 순서(정렬)와 안정성(순서)을 잘 활용하고 집합의 순서를 피하세요. 무질서(unsort) 및

불안정(unorder)의 부정적인 영향.

설명: 안정성은 컬렉션을 탐색할 때마다 컬렉션의 요소 순서가 확실하다는 것을 의미합니다. 질서정연함이란 특정 비교 규칙 에 따라 순회 결과가 순서대로 정렬됨을 의미합니다. 예: ArrayList는 순서/정렬 해제이고, HashMap은 정렬 해제/정렬 해제입니다. TreeSet은 order/정렬입니다.


13 [참고] Set 요소의 고유한 특성을 사용하면 집합을 빠르게 중복 제거하고 List # 사용을 피할 수 있습니다. 🎜🎜#contains 메소드는 순회, 비교 및 ​​중복 제거 작업을 수행합니다.