소스 코드 읽 기-Array List 의 내 면 세계 로 들 어가 기
17633 단어 자바
그녀 는 사람의 마음 을 잘 이해 하고 생각 이 유연 하 며 생각 이 치밀 하 다.이 글 은 우리 로 하여 금 그녀의 내 면 세 계 를 깊이 이해 하 게 한다.
전편 에 서 는 원본 코드 를 읽 는 방법 을 총 결 했 는데,이 편 에 서 는 Array List 의 원본 코드 를 읽 기 시작 했다.마찬가지 로 YSOCean 의 양질 의 글 JDK 1.8 소스 코드(5)인 자바 util.Array List 류 를 참고 하 세 요.
본문 목록
원본 코드 를 읽 기 전에 우 리 는 Array List 가 무엇 을 하 는 지 알 아야 한다.만약 그것 을 사용 하 는 것 에 정통 하 다 면 우 리 는 그것 의 원본 코드 를 더욱 잘 이해 할 수 있 을 것 이다.그래서 마지막 에 저 는 Array List 를 사용 하 는 사용 을 붙 여서 이해 하기 편 합 니 다.
ArrayList 의 정의
Array List 는 배열 로 이 루어 진 집합 으로 무 작위 접근 을 지원 하 며 요소 가 질서 가 있 고 중복 할 수 있 습 니 다.(퍼 텐 셜 익 스 텐션
ArrayList 의 구조 함수(3 개)
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
ArrayList 의 주요 기능(추가 삭제 및 수정)
늘다
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
⑤ Integer.MAX_VALUE-요 소 를 7 번 추가 할 때 크기 를 Integer.MAX_VALUE 의 배열 은 요 소 를 추가 하고 있 습 니 다.
⑥、제 Integer.MAX_VALUE+원소 1 회 추가 시 던 지기 OutOf Memory 오류 이상.
//ArrayList Add
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
삭제 하 다.
//ArrayList remove
/**
* Removes the element at the specified position in this list.
* Shifts any subsequent elements to the left (subtracts one from their
* indices).
*
* @param index the index of the element to be removed
* @return the element that was removed from the list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
/**
* Removes the first occurrence of the specified element from this list,
* if it is present. If the list does not contain the element, it is
* unchanged. More formally, removes the element with the lowest index
* i such that
* (o==null ? get(i)==null : o.equals(get(i)))
* (if such an element exists). Returns true if this list
* contained the specified element (or equivalently, if this list
* changed as a result of the call).
*
* @param o element to be removed from this list, if present
* @return true if this list contained the specified element
*/
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;
}
/*
* Private remove method that skips bounds checking and does not
* return the value removed.
*/
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
}
조사 하 다.
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
/**
* Checks if the given index is in range. If not, throws an appropriate
* runtime exception. This method does *not* check if the index is
* negative: It is always used immediately prior to an array access,
* which throws an ArrayIndexOutOfBoundsException if index is negative.
*/
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* Returns the index of the first occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the lowest index i such that
* (o==null ? get(i)==null : o.equals(get(i))),
* or -1 if there is no such index.
*/
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;
}
고치다.
/**
* Replaces the element at the specified position in this list with
* the specified element.
*
* @param index index of the element to replace
* @param element element to be stored at the specified position
* @return the element previously at the specified position
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
Array List 를 옮 겨 다 니 는 방법 사용 하기
ArrayList list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// for
for(String str : list){
System.out.print(str + " ");
}
//
Iterator it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.print(str+" ");
}
// foreach
for(String str : list){
System.out.print(str + " ");
}
// ListIterator
ListIterator listIt = list.listIterator();
//
while(listIt.hasNext()){
System.out.print(listIt.next()+" ");//a b c
}
// , , ,
while(listIt.hasPrevious()){
System.out.print(listIt.previous()+" ");//c b a
}
기타 방법
trimToSize 방법:이 방법 은 남 은 메모 리 를 회수 하 는 데 사 용 됩 니 다.즉,집합 이 불필요 한 요 소 를 추가 하지 않 는 다 는 것 을 확인 한 후에 trimToSize()방법 을 사용 하면 집합 을 실현 하 는 배열 의 크기 를 집합 요소 의 크기 로 조정 할 것 이다.메모:이 방법 은 배열 요 소 를 복사 하 는 데 시간 이 걸 리 기 때문에 요 소 를 추가 하지 않 을 지 확인 한 후에 호출 해 야 합 니 다.
/**
* Trims the capacity of this ArrayList instance to be the
* list's current size. An application can use this operation to minimize
* the storage of an ArrayList instance.
*/
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
//ArrayList
public static void main(String[] args) {
// list,list String
ArrayList list = new ArrayList();
// list
list.add("Item1");
list.add("Item2");
list.add(2, "Item3"); // “Item3” list 3 。
list.add("Item4");
//
System.out.println("The arraylist contains the following elements: "
+ list);
//
int pos = list.indexOf("Item2");
System.out.println("The index of Item2 is: " + pos);
//
boolean check = list.isEmpty();
System.out.println("Checking if the arraylist is empty: " + check);
//
int size = list.size();
System.out.println("The size of the list is: " + size);
//
boolean element = list.contains("Item5");
System.out
.println("Checking if the arraylist contains the object Item5: "
+ element);
//
String item = list.get(0);
System.out.println("The item is the index 0 is: " + item);
// arraylist
// 1 :
System.out
.println("Retrieving items with loop using index and size list");
for (int i = 0; i < list.size(); i++) {
System.out.println("Index: " + i + " - Item: " + list.get(i));
}
// 2 : foreach
System.out.println("Retrieving items using foreach loop");
for (String str : list) {
System.out.println("Item is: " + str);
}
// :
// hasNext(): true
// next():
System.out.println("Retrieving items using iterator");
for (Iterator it = list.iterator(); it.hasNext();) {
System.out.println("Item is: " + it.next());
}
//
list.set(1, "NewItem");
System.out.println("The arraylist after the replacement is: " + list);
//
// 0
list.remove(0);
// "Item3"
list.remove("Item3");
System.out.println("The final contents of the arraylist are: " + list);
// ArrayList Array
String[] simpleArray = list.toArray(new String[list.size()]);
System.out.println("The array created after the conversion of our arraylist is: "
+ Arrays.toString(simpleArray));
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.