1. 성능을 고려하면 어레이가 선호됩니다.
배열은 프로젝트 개발, 특히 비즈니스 중심 개발에서 점점 덜 사용됩니다. 우선 배열에는 List 및 Set과 같은 컬렉션에서 제공하는 메서드가 많지 않습니다. 그러나 List, Set 등의 컬렉션은 제네릭 지원을 사용하기 때문에 모두 래퍼 클래스에 저장되며, 배열은 기본 데이터 유형의 실행 속도가 래퍼 유형보다 훨씬 빠릅니다. 컬렉션 클래스의 최하위 레이어 또한 배열을 통해서도 구현됩니다.
2. 필요한 경우 가변 길이 배열을 사용하십시오.
컬렉션 클래스를 학습할 때 배열의 고정 길이와 컬렉션 유형의 가변 길이를 비교하는 것을 좋아하는 사람들이 많지만 실제로 이러한 비교는 ArrayList와 같은 컬렉션 클래스의 구현을 관찰해보면 알 수 있습니다. 소위 컬렉션이 길어지는 것은 실제로 원래 배열을 재치 있게 확장하는 것입니다.
다음과 같이 코드 코드를 복사합니다 .
공개 정적 T[] ExpandCapacity(T[] 데이터, int newLength) {
// 음수인지 판단
newLength = newLength < 0 : newLength;
// 새 배열을 생성하고 원래 값을 복사한 후 길이를 지정합니다.
return Arrays.copyOf(data, newLength);
}
성능 요구 사항이 높을 경우 배열 캡슐화를 고려할 수 있습니다. 배열의 길이가 일정하다는 것은 이를 사용하지 않는 이유가 되지 않습니다.
3. 배열의 얕은 복사본에 주의하세요.
배열의 얕은 복사는 Java 프로그래밍의 기본이기도 합니다. 즉, 배열을 복사할 때 기본 유형은 값을 복사하고 참조 유형은 참조 주소를 복사합니다. 얕은 복사본이므로 사용 시 주의가 필요합니다.
4. 명확한 시나리오에서는 컬렉션의 초기 용량을 지정합니다.
일상적인 사용에서는 컬렉션 유형의 길이가 자동으로 변경되므로 객체를 생성할 때 초기 값이 컬렉션 클래스에 첨부되지 않습니다. 가장 일반적으로 사용되는 ArrayList를 예로 들어 보겠습니다. 용량에 도달하면 중요한 시점에 기본 어레이가 copyOf 연산은 새로운 배열을 생성하는데, 새 배열의 용량은 기존 배열의 1.5배, 기본 배열 길이는 10이다. 컨테이너에 담을 데이터의 양이 크다는 것을 분명히 알면, copyOf 시간을 사용하여 발생하는 과도한 성능 오버헤드를 방지하려면 초기 값을 지정해야 합니다.
5. 적절한 최적의 알고리즘을 선택하세요
데이터의 최대값 또는 최소값을 검색하는 것은 데이터 구조에 대한 가장 기본적인 지식입니다. 또한 이를 Java로 구현하는 방법에는 두 가지가 있습니다.
다음과 같이 코드 코드를 복사합니다 .
공개 정적 int getMaxByArray(int[] 데이터) {
//가장 간단한 자체 구현 검색 방법
int max = 데이터[0];
for (int i = 1, 크기 = data.length; i < 크기; i++) {
최대 = 최대 < 나는 ? : 최대;
}
최대 반환;
}
다음과 같이 코드 코드를 복사합니다 .
공개 정적 int getMaxByArray(int[] 데이터) {
// 먼저 정렬한 다음 마지막 비트를 가져옵니다.
Arrays.sort(data);
반환 데이터[data.length - 1];
}
6. 기본형 배열 변환 트랩!
다음 코드를 준수하세요.
다음과 같이 코드 코드를 복사합니다 .
공개 정적 무효 메인(String[] args) {
int[] nums = 새로운 int[] { 1, 2, 3, 4, 5 };
목록 목록 = Arrays.asList(nums);
System.out.println(list.size());
//이때 출력 크기는 1이다.
}
우리가 예상한 결과는 Arrays.asList를 통해 배열에 있는 요소들을 컬렉션 클래스로 변환하는 것이었지만, 이때는 기대와는 달리 배열 자체만 추가했을 뿐 배열에 있는 값을 분리하지 않았습니다. 컬렉션이 List에 제네릭을 추가하면 컴파일 중에 오류 메시지가 표시되거나 배열 자체를 Integer로 변경하면 문제를 해결할 수 있습니다.
7. asList 메소드에 의해 생성된 List 객체는 변경할 수 없습니다.
위의 예를 통해 Arrays.asList 메소드를 사용하면 배열을 List로 변환할 수 있음을 알 수 있습니다. 그러면 asList 메소드가 반환한 List의 특별한 점은 asList 메소드가 반환하기 때문에 변경 사항을 지원하지 않는다는 점입니다. java.util.ArrayList가 아니라 Array s 도구 클래스의 정적 비공개 내부 클래스는 ArrayList와 동일한 상위 클래스 AbstractList를 가지고 있지만 add 및 기타 메서드를 재정의하면 UnsupportedOperationException이 발생합니다. 이 정적 비공개 내부 클래스는 크기, toArray, Get만 구현합니다. 행동 양식
8. 다양한 데이터 구조에 대해 다양한 탐색 방법을 사용하세요.
다음 코드를 시청해 보세요
다음과 같이 코드 코드를 복사합니다 .
공개 정적 무효 메인(String[] args) {
//다음은 ArrayList 컬렉션의 순회 메서드입니다.
정수 숫자 = 80 * 10000;
목록 arrayList = new ArrayList(num);
for (int i = 0, size = arrayList.size(); i < size; i++) {
arrayList.get(i);
}
//다음은 LinkedList 컬렉션의 순회 방법입니다.
목록 linkedList = new LinkedList();
for (정수 정수 : linkedList) {
}
}
LinkedList와 ArrayList에 대해 서로 다른 순회 방법을 선택하는 이유는 무엇입니까?
1. ArrayList는 RamdomAccess 인터페이스(랜덤 액세스 인터페이스)를 구현하기 때문에 RamdomAccess 인터페이스는 Java의 Serialized 및 Cloneable 인터페이스와 동일한 표시 인터페이스입니다. 이는 이 클래스가 무작위로 액세스될 수 있음을 의미합니다. ArrayList의 경우 데이터 사이에 있습니다. 상관 관계가 없습니다. 즉, 인접한 두 위치는 상호 의존 관계가 없으며 무작위로 액세스할 수 있습니다.
2. Java의 foreach 구문은 반복자(iterator)의 변형된 사용법입니다. 반복자는 23가지 디자인 패턴 중 하나이지만 반복자는 두 요소 간의 시간 관계를 알아야 합니다. 그렇지 않으면 hasNext 지원을 제공하는 방법은 무엇입니까? 왜냐하면 이전 요소가 다음 요소가 존재하는지를 확인해야 하는데, 이 관계가 강제로 성립되기 때문인데, 이는 ArrayList 랜덤 액세스의 특수한 특성에 위배됩니다.
3. LinkedList는 이중 연결 리스트 형태로 저장되기 때문에 Iterator 지원이 매우 좋습니다. LinkedList에는 인접한 두 요소 사이에 고유한 관계가 있기 때문에 LinkedList와 ArrayList에는 서로 다른 순회 방법을 채택해야 합니다. 관심 있는 독자는 아래 첨자의 형태로 LinkedList에 액세스해 보면 둘 사이의 효율성에 큰 차이가 있음을 알게 될 것입니다.
8. 적절한 경우 ArrayList 또는 LinkedList를 선택하십시오.
ArrayList와 LinkedList의 주요 차이점은 다음과 같습니다.
1. ArrayList의 기본 데이터 구조는 배열인 반면 LinkedList의 기본 구조는 이중 연결 목록입니다.
2. 데이터를 삽입할 때 ArrayList는 각 삽입 후 배열 요소를 뒤로 이동해야 하기 때문에 LinkedList는 삽입 작업을 완료하기 위해 헤드 노드와 테일 노드만 변경하면 되므로 삽입 작업이 더 자주 발생하는 경우 LinkedList가 선호됩니다.
3. 데이터를 삭제할 때 ArrayList는 배열의 순서를 유지해야 하기 때문에 삭제 후 요소도 앞뒤로 이동해야 하지만 LinkedList는 여전히 헤드 및 테일 노드를 변경합니다.
4. 업데이트할 때 LinkedList는 위치가 지정된 요소를 찾은 다음 업데이트하기 위해 반 순회 방법을 사용하므로 ArrayList가 위치가 지정된 아래 첨자 요소를 직접 교체하는 것과 비교하여 ArrayList가 업데이트하는 데 더 효율적입니다.
5.LinkedList는 LinkedList의 addFirst 및 addLast와 같은 작업을 통해 대기열을 시뮬레이션할 수 있습니다.
9. 목록이 같으면 요소 데이터만 신경 쓰면 됩니다.
List, Set, Map 등의 인터페이스를 안심하고 프로그래밍할 수 있도록 Java에서는 컬렉션 클래스의 equlas를 재정의했기 때문에 두 컬렉션이 같은지 비교할 때 요소 데이터가 같은지 비교하면 됩니다. 이는 컬렉션 구현 클래스 교체로 인해 발생하는 잘못된 Java 코드 수정을 방지합니다.
다음과 같이 코드 코드를 복사합니다 .
공개 정적 무효 메인(String[] args) {
목록 arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(2);
목록 linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
System.out.println(arrayList.equals(linkedList));
// 특정 구현에 대해서는 신경 쓰지 마세요. 출력은 true입니다.
}