>  기사  >  Java  >  Java 목록: ArrayList 및 LinkedList 구현 인터페이스에 대한 간략한 소개

Java 목록: ArrayList 및 LinkedList 구현 인터페이스에 대한 간략한 소개

php是最好的语言
php是最好的语言원래의
2018-07-26 14:22:003171검색

ArrayList는 배열을 기반으로 구현되어 C언어에서 메모리를 동적으로 적용하고 메모리를 동적으로 늘리는 것과 유사하게 자동으로 용량을 늘릴 수 있는 동적 배열입니다. LinkedList는 양방향 순환 연결 목록(소스 코드에서 쉽게 볼 수 있듯이)을 기반으로 구현됩니다. 연결 목록으로 작동하는 것 외에도 스택, 대기열 및 이중 종료 대기열로도 사용할 수 있습니다.

1. List 소개

2. ArrayList의 기능

ArrayList

ArrayList는 기반입니다. on Array 구현 동적 배열 이며, 용량이 자동으로 증가할 수 있습니다 . 이는 C 언어에서 동적으로 메모리를 적용하고 메모리를 동적으로 늘리는 것과 유사합니다.

ArrayList는 스레드에 안전하지 않습니다. , 은 단일 스레드 환경에서만 사용할 수 있습니다. , Collections.synchronizedList를 다중 스레드 환경 (목록 목록) 함수는 스레드로부터 안전한 ArrayList 클래스를 반환하거나 동시 패키지 아래의 CopyOnWriteArrayList 클래스를 사용할 수 있습니다.

ArrayList는 직렬화 가능 인터페이스를 구현하므로 직렬화를 지원합니다. 은 직렬화를 통해 전송할 수 있습니다.

ArrayList는 RandomAccess 인터페이스를 구현하여 빠른 무작위화 액세스를 지원합니다. 실제로는 아래 첨자 일련 번호를 통한 빠른 액세스

복제 가능 인터페이스를 구현하고 복제 가능

#🎜 🎜#참고 세 가지 다른 건축 방법. 매개변수 없는 생성자에 의해 생성된 ArrayList의 용량은 기본적으로 10입니다. Collection 매개변수가 있는 생성자는 Collection을 배열로 변환하고 이를 ArrayList 구현 배열 elementData에 할당합니다.

용량확장 방식에 주의하여 용량을 확보하세요. 요소가 ArrayList에 추가될 때마다(1개 또는 그룹일 수 있음) 충분한 용량을 보장하기 위해 이 메서드를 호출해야 합니다. 용량이 현재 요소 수를 수용하기에 충분하지 않은 경우 새 용량은 이전 용량의 1.5배에 1을 더한 값으로 설정됩니다. 설정된 새 용량이 충분하지 않은 경우 새 용량은 전달된 매개변수(즉, 필요한 용량), Arrays.copyof() 메서드를 사용하여 요소를 새 배열에 복사합니다(자세한 내용은 아래 3번 항목 참조). 이를 통해 알 수 있듯이, 요소가 추가될 때마다 원래 요소를 새로운 배열에 복사해야 하므로 시간이 많이 소요되므로 ArrayList를 사용할 경우에만 사용하는 것이 좋습니다. 요소 수는 미리 결정될 수 있습니다. 그렇지 않으면 LinkedList를 사용하는 것이 좋습니다.

ArrayList 구현에서는 수많은 Arrays.copyof() 및 System.arraycopy() 메서드를 호출합니다. 우리는 이 두 가지 방법의 구현에 대해 심층적으로 이해하는 것이 필요합니다.

먼저 Arrays.copyof() 메서드를 살펴보겠습니다. 오버로드된 메서드가 많지만 구현 아이디어는 동일합니다. 일반 버전의 소스 코드를 살펴보겠습니다.

public static <T> T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}

분명히 세 개의 매개 변수가 있는 또 다른 copyof 메서드가 호출됩니다. 마지막 매개 변수는 다음을 지정합니다. 변환할 데이터의 종류는 다음과 같습니다.

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
    return copy;
}

이 메서드는 실제로 내부에 newlength 길이의 배열을 생성하는 것을 명확하게 알 수 있습니다. ) 메서드를 사용하여 원래 배열의 요소를 새 배열에 복사합니다.

System.arraycopy() 메서드를 살펴보겠습니다. 이 메소드는 네이티브로 표시되며 시스템의 C/C++ 코드를 호출합니다. JDK에서는 볼 수 없지만 해당 소스 코드는 openJDK에서 볼 수 있습니다. 이 함수는 실제로 C 언어의 memmove() 함수를 호출하므로 동일한 배열의 요소를 올바르게 복사하고 이동할 수 있습니다. 이는 일반적인 복사 방법보다 훨씬 효율적이며 배열의 일괄 처리에 매우 적합합니다. Java에서는 더 높은 효율성을 달성하기 위해 많은 수의 배열 요소를 복사할 때 이 방법을 사용할 것을 강력히 권장합니다.

정적 배열로 변환되는 ArrayList의 두 가지 toArray 메소드에 주목하세요.

첫 번째는 Object[] toArray() 메서드입니다. 이 메소드는 하향 변환 메소드를 직접 사용하여 전체 ArrayList 콜렉션을 지정된 유형의 Array 배열로 변환하는 경우 이 예외가 발생합니다. 배열 배열, 다운캐스팅(각 요소를 다운캐스팅)에서는 이 예외가 발생하지 않습니다. 분명히 배열의 요소를 하나씩 다운캐스팅하는 것은 효율적이지 않고 불편합니다.

두 번째, 8742468051c85b06f0a0af9e3e506b5c T[] toArray(T[] a) 메서드입니다. 이 메소드는 ArrayList에서 변환된 Array를 전체적으로 하향 변환할 수 있으며(실제로 변환은 이 메소드의 소스 코드에 구현되어 있음), 매개변수 a의 크기가 부족할 경우 이 메소드의 소스 코드를 보면 알 수 있습니다. , 내부적으로 Arrays.copyOf 메서드가 호출됩니다. 이 메서드는 내부적으로 새 배열을 생성하고 이를 반환하므로 이 메서드의 일반적인 형식은 다음과 같습니다.

public static Integer[] vectorToArray2(ArrayList<Integer> v) {  
    Integer[] newText = (Integer[])v.toArray(new Integer[0]);  
    return newText;  
}

ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,ArrayList中允许元素为null

三、LinkedList

LinkedList的特点

LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做队列双端队列来使用;

LinkedList同样是非线程安全的,只在单线程下适合使用;

LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输;

实现了Cloneable接口,能被克隆;

相关推荐:

接口测试基础之入门篇

视频教程:

去除ArrayList集合中的重复自定义对象元素案例

위 내용은 Java 목록: ArrayList 및 LinkedList 구현 인터페이스에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.