JAVA ArrayList 상세 설명(예시)
//
ArrayList()
// capacity ArrayList 。 , 。
ArrayList(int capacity)
// collection ArrayList
ArrayList(Collection<? extends E> collection)
ArrayList 의 API
// Collection API
boolean add(E object)
boolean addAll(Collection<? extends E> collection)
void clear()
boolean contains(Object object)
boolean containsAll(Collection<?> collection)
boolean equals(Object object)
int hashCode()
boolean isEmpty()
Iterator<E> iterator()
boolean remove(Object object)
boolean removeAll(Collection<?> collection)
boolean retainAll(Collection<?> collection)
int size()
<T> T[] toArray(T[] array)
Object[] toArray()
// AbstractCollection API
void add(int location, E object)
boolean addAll(int location, Collection<? extends E> collection)
E get(int location)
int indexOf(Object object)
int lastIndexOf(Object object)
ListIterator<E> listIterator(int location)
ListIterator<E> listIterator()
E remove(int location)
E set(int location, E object)
List<E> subList(int start, int end)
// ArrayList API
Object clone()
void ensureCapacity(int minimumCapacity)
void trimToSize()
void removeRange(int fromIndex, int toIndex)
제2 부분 ArrayList 소스 코드 분석 은 ArrayList 의 원 리 를 더욱 잘 이해 하기 위해 ArrayList 소스 코드 를 분석 합 니 다.Array List 는 배열 을 통 해 이 루어 진 것 으로 소스 코드 는 이해 하기 쉽다
package java.util;
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//
private static final long serialVersionUID = 8683452581122892189L;
// ArrayList
private transient Object[] elementData;
// ArrayList
private int size;
// ArrayList 。
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//
this.elementData = new Object[initialCapacity];
}
// ArrayList 。 10。
public ArrayList() {
this(10);
}
// collection ArrayList
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
// =
public void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
// ArrarList 。
// ArrayList , =“( x3)/2 + 1”
public void ensureCapacity(int minCapacity) {
// “ ”+1
modCount++;
int oldCapacity = elementData.length;
// , =“( x3)/2 + 1”
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
// e
public boolean add(E e) {
// ArrayList
ensureCapacity(size + 1); // Increments modCount!!
// e ArrayList
elementData[size++] = e;
return true;
}
// ArrayList
public int size() {
return size;
}
// ArrayList Object(o)
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
// ArrayList
public boolean isEmpty() {
return size == 0;
}
// ,
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
// ,
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
// ( ), (o)
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
// ArrayList Object
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
// ArrayList 。 , T
public <T> T[] toArray(T[] a) {
// a < ArrayList ;
// T[] , “ArrayList ”, “ArrayList”
if (a.length < size)
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
// a >= ArrayList ;
// ArrayList a 。
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
// index
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
// index element
public E set(int index, E element) {
RangeCheck(index);
E oldValue = (E) elementData[index];
elementData[index] = element;
return oldValue;
}
// e ArrayList
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
// e ArrayList
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
// ArrayList
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
// ArrayList
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
// index
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
// "index+1" , 。
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
// null
elementData[--size] = null; // Let gc do its work
}
//
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
// ArrayList, “ o”, , true。
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
// ArrayList, null
public void clear() {
modCount++;
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
// c ArrayList
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacity(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
// index , c ArrayList
public boolean addAll(int index, Collection<? extends E> c) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: " + index + ", Size: " + size);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacity(size + numNew); // Increments modCount
int numMoved = size - index;
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);
System.arraycopy(a, 0, elementData, index, numNew);
size += numNew;
return numNew != 0;
}
// fromIndex toIndex 。
protected void removeRange(int fromIndex, int toIndex) {
modCount++;
int numMoved = size - toIndex;
System.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
// Let gc do its work
int newSize = size - (toIndex-fromIndex);
while (size != newSize)
elementData[--size] = null;
}
private void RangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
}
//
public Object clone() {
try {
ArrayList<E> v = (ArrayList<E>) super.clone();
// ArrayList v
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
// java.io.Serializable
// ArrayList “ , ”
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
// “ ”
s.writeInt(elementData.length);
// “ ”
for (int i=0; i<size; i++)
s.writeObject(elementData[i]);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
// java.io.Serializable :
// ArrayList “ ” , “ ”
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in size, and any hidden stuff
s.defaultReadObject();
// ArrayList “ ”
int arrayLength = s.readInt();
Object[] a = elementData = new Object[arrayLength];
// “ ”
for (int i=0; i<size; i++)
a[i] = s.readObject();
}
}
요약:(01)Array List 는 실제 적 으로 하나의 배열 을 통 해 데 이 터 를 저장 합 니 다.우리 가 Array List 를 구성 할 때;기본 구조 함 수 를 사용 하면 Array List 의 기본 용량 크기 는 10 입 니 다.(02)ArrayList 용량 이 모든 요 소 를 수용 할 수 없 을 때 ArrayList 는 용량 을 다시 설정 합 니 다:새로운 용량="(원본 용량 x3)/2+1"(03)Array List 의 클론 함수,즉 모든 요 소 를 하나의 배열 에 복제 하 는 것 입 니 다.(04)Array List 는 자바.io.Serializable 방식 을 실현 한다.출력 흐름 에 기록 할 때'용량'을 먼저 쓰 고'모든 요소'를 순서대로 기록 합 니 다.입력 흐름 을 읽 을 때'용량'을 읽 고'모든 요소'를 차례대로 읽 습 니 다. 세 번 째 부분 ArrayList 스 트 리밍 방식 ArrayList 는 3 가지 스 트 리밍 방식(01)을 지원 합 니 다.첫 번 째 는 교체 기 를 통 해 스 트 리밍 합 니 다.Iterator 를 통 해 옮 겨 다 니 는 것 입 니 다
Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
(02)두 번 째 는 무 작위 로 방문 하고 색인 값 을 통 해 옮 겨 다 닌 다.Array List 는 RandomAccess 인 터 페 이 스 를 실현 하기 때문에 색인 값 을 통 해 무 작위 로 요 소 를 방문 하 는 것 을 지원 합 니 다
Integer value = null;
int size = list.size();
for (int i=0; i<size; i++) {
value = (Integer)list.get(i);
}
(03)세 번 째,for 순환 옮 겨 다 니 기.다음 과 같 습 니 다
Integer value = null;
for (Integer integ:list) {
value = integ;
}
다음은 하나의 인 스 턴 스 를 통 해 이 세 가지 방식 의 효율 을 비교 합 니 다.인 스 턴 스 코드(Array List RandomAccessTest.java)는 다음 과 같 습 니 다
import java.util.*;
import java.util.concurrent.*;
/*
* @desc ArrayList 。
*
* @author skywang
*/
public class ArrayListRandomAccessTest {
public static void main(String[] args) {
List list = new ArrayList();
for (int i=0; i<100000; i++)
list.add(i);
//isRandomAccessSupported(list);
iteratorThroughRandomAccess(list) ;
iteratorThroughIterator(list) ;
iteratorThroughFor2(list) ;
}
private static void isRandomAccessSupported(List list) {
if (list instanceof RandomAccess) {
System.out.println("RandomAccess implemented!");
} else {
System.out.println("RandomAccess not implemented!");
}
}
public static void iteratorThroughRandomAccess(List list) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for (int i=0; i<list.size(); i++) {
list.get(i);
}
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughRandomAccess:" + interval+" ms");
}
public static void iteratorThroughIterator(List list) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
iter.next();
}
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughIterator:" + interval+" ms");
}
public static void iteratorThroughFor2(List list) {
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for(Object obj:list)
endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println("iteratorThroughFor2:" + interval+" ms");
}
}
실행 결과:iterator Through RandomAccess:3 msiterator Through Iterator:8 msiterator Through For2:5 ms 를 통 해 알 수 있 듯 이 Array List 를 옮 겨 다 닐 때 무 작위 방문(즉,색인 번호 로 접근)을 사용 하 는 효율 이 가장 높 습 니 다.교체 기 를 사용 하 는 효율 이 가장 낮다! 네 번 째 부분 toArray()이상 은 Array List 의 toArray()를 호출 할 때"java.lang.ClassCastException"이상 을 던 진 적 이 있 을 수 있 습 니 다.다음은 어떻게 된 일 인지 말씀 드 리 겠 습 니 다.Array List 는 toArray()함수 2 개 를 제공 합 니 다.Object[]toArray()
// toArray(T[] contents)
public static Integer[] vectorToArray1(ArrayList<Integer> v) {
Integer[] newText = new Integer[v.size()];
v.toArray(newText);
return newText;
}
// toArray(T[] contents) 。 !
public static Integer[] vectorToArray2(ArrayList<Integer> v) {
Integer[] newText = (Integer[])v.toArray(new Integer[0]);
return newText;
}
// toArray(T[] contents)
public static Integer[] vectorToArray3(ArrayList<Integer> v) {
Integer[] newText = new Integer[v.size()];
Integer[] newStrings = (Integer[])v.toArray(newText);
return newStrings;
}
다섯 번 째 부분 ArrayList 예시 본 고 는 하나의 실례(ArrayList Test.java)를 통 해 ArrayList 의 상용 API 를 소개 한다
import java.util.*;
/*
* @desc ArrayList API
* @author skywang
* @email [email protected]
*/
public class ArrayListTest {
public static void main(String[] args) {
// ArrayList
ArrayList list = new ArrayList();
// “”
list.add("1");
list.add("2");
list.add("3");
list.add("4");
// 1
list.add(0, "5");
// 1
System.out.println("the first element is: "+ list.get(0));
// “3”
list.remove("3");
// ArrayList
System.out.println("Arraylist size=: "+ list.size());
// list "3"
System.out.println("ArrayList contains 3 is: "+ list.contains(3));
// 2 10
list.set(1, "10");
// Iterator ArrayList
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
System.out.println("next is: "+ iter.next());
}
// ArrayList
String[] arr = (String[])list.toArray(new String[0]);
for (String str:arr)
System.out.println("str: "+ str);
// ArrayList
list.clear();
// ArrayList
System.out.println("ArrayList is empty: "+ list.isEmpty());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.