배열리스트 개요 :
ArrayList는 배열을 기반으로 구현되며 C 언어의 동적 응용 프로그램 메모리와 유사하게 용량이 자동으로 성장할 수있는 동적 배열입니다.
ArrayList는 스레드 안전이 아니며 단일 스레드 환경에서만 사용할 수 있습니다. 다중 스레드 환경에서는 Collections.synchronizedlist (List L) 함수를 사용하여 스레드 안전 배열리스트 클래스를 반환하거나 동시 동의 패키지에서 CopyonWriteArrayList 클래스를 사용할 수 있습니다.
ArrayList는 직렬화 가능한 인터페이스를 구현하므로 직렬화를 지원하고 직렬화를 통해 전송 될 수 있으며 랜덤 액세스 인터페이스를 구현하며 빠른 무작위 액세스를 지원합니다. 실제로, 그것은 첨자 일련 번호를 통해 빠른 액세스이며, 복제 가능한 인터페이스를 구현하며 복제 할 수 있습니다.
각 ArrayList 인스턴스에는 용량이 있으며, 이는 목록 요소를 저장하는 데 사용되는 배열의 크기를 나타냅니다. 항상 목록의 크기와 동일합니다. 요소가 Arraylist에 지속적으로 추가되면 용량도 자동으로 증가합니다. 자동 성장은 새로운 배열에 대한 데이터를 다시 가져 오므로 데이터 양을 예측할 수 있다면 Arraylist를 구성 할 때 용량을 지정할 수 있습니다. 많은 요소를 추가하기 전에 응용 프로그램은 Ensurecapacity 작업을 사용하여 Arraylist 인스턴스의 용량을 늘릴 수 있으며, 이는 증분 재분배 횟수를 줄일 수 있습니다.
이 구현은 동기식이 아닙니다. 여러 스레드가 ArrayList 인스턴스에 동시에 액세스하고 적어도 하나의 스레드가 목록을 구조적으로 수정하면 외부 동기화되어야합니다.
Java Arraylist의 기록과 요약을 만들어 봅시다
공개 클래스 ArrayList <e> { / *** 컬렉션을 저장하는 요소** / private transient 객체 [] elementData; / ** 요소 크기*/ 개인 int 크기;컬렉션의 요소 수를 기록하기 위해 일반 클래스, 객체 배열 및 개인 변수를 정의하십시오. 원본 텍스트에는 추가 개인 변수가 있으며 무엇을 사용해야하는지 모르겠습니다. 저자는 설명이나 언급이 없습니다. 내가 그것을 사용하지 않더라도 괜찮습니다.
/ ** * 지정된 크기에 따라 초기화 * @param initialcapacity */ public arraylist (int initialcapacity) {super (); if (initialCapacity <= 0) {// 예외적 인 새로운 불법 행위 exception ( "초기화 매개 변수가 0보다 작을 수 없음"); } else {// 배열 초기화 this.elementData = new Object [InitialCapacity]; }} / *** 기본 초기화* / public arraylist () {this (10); } /*** 컬렉션 클래스에 따라 초기화* @param c 컬렉션 인터페이스를 상속 해야하는 클래스* /public arraylist (collection <? extends e> c) {// elementData = c.toArray (); 크기 = ElementData.length; // 객체 유형을 변환 if (elementData.getClass ()! = Object []. class) {elementData = arrays.copyof (elementData, size, object []. class); }} 3 초기화 방법, 기본 크기에 따라 배열을 초기화하고 주어진 크기를 초기화하며 변환 할당 초기화를 위해 컬렉션 컬렉션 인터페이스를 상속하는 클래스를 전달합니다.
/ *** 확장 컬렉션* @param mincapacity*/ public void ensurecapacity (int mincapacity) {/ ** 배열의 현재 크기*/ int oldcapacity = elementData.length; if (mincapacity> OldCapication) { /*** OldData가 사용되지는 않지만 메모리 관리에 관한 것입니다. 이것은 Arrays.copyof () 메소드가 IF의 수명주기 동안 ElementData 변수를 참조하여 GC*에 의해 재활용되지 않을 때 exember in OldData가 gc*에 의해 재활용되지 않을 때 NewCapacity 또는 다른 신약을 방지 할 수 있습니다. 메모리 elementdata 메모리가 침식되지 않도록합니다. * 끝이 떠날 때 OldData 사이클이 끝나고 재활용*/ Object OldData [] = ElementData; int newCapacity = (OldCapacity * 3)/2 + 1; // 50%+1 증가 if (newCapacity <mincapacity) newCapacity = mincapacity; // arrays.copyof를 사용하여 컬렉션의 요소를 복사하고 새 배열 요소 data = arrays.copyof, newCapacity)를 생성합니다. }}이것은 핵심 방법입니다. 세트의 확장은 실제로 배열의 확장과 MinCapacity 컬렉션의 크기를 비교하여 확장 해야하는지 여부를 결정하는 것입니다. Array.copyof () 메소드는 확장에 사용됩니다.
원본 텍스트에는 자세한 설명이 있습니다. 이 메소드는 첫 번째 매개 변수의 내용을 새 배열로 복사합니다. 배열의 크기는 두 번째 매개 변수이며 새 배열을 반환합니다. OldData의 변수에 대한 자세한 주석이 있습니다.
/ *** 인덱스가 범위를 벗어난 지 확인* @param index*/ private void rangecheck (int index) {if (index> size || index <0) {throw new indexoutofBoundSexception ( "표시기 초과, 색인 :" + 색인 + ", 크기 :" + size); }}첨자 검색이 1 /**인지 여부
* 요소 추가* 컬렉션의 끝에 지정된 요소를 추가* @param e 추가 요소* @return*/ public boolean add (e e) {ensurecapacity (size+1); ElementData [size] = e; 크기 ++; 진실을 반환하십시오. }요소를 추가하고 먼저 용량을 확장하고 값을 할당 한 다음 요소를 추가하십시오. 크기+1 필드 크기는 추가되지 않습니다. 여기에는 산술 작업이 있으므로 나중에 늘려야합니다.
/ *** 요소 추가* 지정된 위치에 요소 추가* @param 색인 지정 인덱스 인덱스 인덱스 인덱스 요소 요소* @param 요소*/ public boolean add (int index, e element) {rangecheck (index); ensurecapacity (size+1); // 인덱스 위치에서 시작하는 ElementData 요소 크기-인덱스의 길이 // 인덱스 위치에서 인덱스+1로 시작하는 새 요소 데이터 배열로 복사합니다. // 현재이 위치에있는 요소와 모든 후속 요소가 한 위치에 따라 바로 이동 함을 의미합니다. System.ArrayCopy (ElementData, Index, ElementData, Index+1, Size-Index); ElementData [index] = 요소; size ++; // 요소 추가 하나를 추가하십시오. }여기서 차이점은 System.ArrayCopy (ElementData, Index, ElementData, Index+1, Size-Index);
이것은 c의 내부 방법입니다. 자세한 원본 텍스트에는 설명이 있으므로 여기서는 이야기하지 않습니다. 이것은 또한 전체 ArrayList의 핵심이며 Arrays.copyof ()의 내부 구현 원리입니다.
/*** 모든 요소 추가* 지정된 컬렉션의 반복자가 반환 한 요소의 순서로 컬렉션의 모든 요소를이 목록의 끝에 추가하십시오. * @param c * @return */ public boolean addall (collection <? extends e> c) {object [] newElement = c.toArray (); int elementLength = newElement.length; ensurecapacity (size+elementLength); // NewElement 0, ElementLength Elements, ElementData Size Subscript System.ArrayCopy (NewElement, 0, ElementData, Size, ElementLength); size+= elementLength; return elementLength! = 0; }기본적으로 다른 방법은 인터페이스를 통해 데이터 객체를 전달하고 확장을 위해 길이를 얻고 시스템 및 ArrayCopy를 사용하여 데이터를 새 배열로 복사하는 등 다른 상황에 따라 다른 처리 만 수행합니다.
/ *** 위치를 지정하고 모든 요소 추가* @Param 인덱스 삽입 위치 색인* @param c 삽입 된 요소 컬렉션* @return*/ public boolean addall (int index, collection <? extrends e> c) {if (index> size || index <0) {new indexoutofBoundsexception ( "index :" + size : " + size); } object [] newElement = C.ToArray (); int elementLength = newElement.length; ensurecapacity (size+elementLength); int nummoved = size-Index; // 삽입 위치가 배열의 중간에 있는지 판단합니다. (nummoved> 0) {// 색인 삽입 위치 뒤의 모든 요소를 색인 인덱스 인덱스에서 시작하는 nummoved 요소를 인덱스 인덱스 인덱스에서 시작하는 요소 데이터 시스템의 인덱스+ElementLength 위치에 indexcopy (ElementData, Index, Index+Elementllant, nummoved); } // Newlement에서 ElementLength를 0에서 ElementData Index가 System.ArrayCopy (NewElement, 0, ElementData, Index, ElementLength)를 시작하는 위치로 추가합니다. size += elementLength; return elementLength! = 0; } / ** * 색인의 값을 지정 * @param index * @param 요소 * @return * / public e set (int index, e element) {rangecheck (index); e OldElement = (e) ElementData [index]; ElementData [index] = 요소; oldlement를 반환하십시오. } / ** * 색인 * @param index * @return * / public e get (int index) {rangecheck (index); return (e) ElementData [index]; } / *** 첨자에 따라 요소 제거* @param index* / public e remove (int index) {rangecheck (index); e OldElement = (e) ElementData [index]; / ** 제거 된 첨자 후 요소 수*/ int nummoved = size-index-1; // (nummoved> 0) System.ArrayCopy (ElementData, index+1, elementData, index, nummoved) 인 경우 배열 범위 내에서 이동하면; // elementData를 제거 [-size] = null; oldlement를 반환하십시오. } /** * 요소에 따라 제거 * @param obj * @return * /public boolean remove (object obj) {// arraylist는 null을 허용하므로 (int index = 0; index <size; index ++) {if (elementData [index] == null) {index (index); 진실을 반환하십시오. }}} else {for (int index = 0; index <size; index ++) {if (obj.equals (elementData [index])) {remove (index); 진실을 반환하십시오. }}} 거짓을 반환합니다. } / *** 첨자에 따라 지정된 범위에서 요소를 제거하십시오* @param fromindex start* @param toIndex end* / protected void removerange (int fromindex, int toindex) {rangecheck (Fromindex); RangeCheck (ToIndex); // 이동할 요소의 수 int nummoved = size -toindex; // ToIndex 뒤에서 요소를 index System.ArrayCopy (ElementData, ToIndex, ElementData, FromIndex, NumMoved)로 이동합니다. // 제거 할 요소 수 int Newsize = size- (ToIndex-fromindex); while (size! = newsize) {elementData [-size] = null; }} / *** 배열 용량을 실제 용량으로 조정* / public void trimtosize () {int length = elementData.length; if (size <leng) {object [] old = elementData; ElementData = arrays.copyof (ElementData, size); }} / *** 컬렉션 요소를 배열로 변환* @return* / public object [] toArray () {return array.copyof (elementData, size); } public <t> t [] toArray (t [] a) {if (a.length <size) {return (t []) arrays.copyof (elementData, size, a.getClass ()); } // 수집 요소를 배열 Asystem.ArrayCopy에 복사합니다 (ElementData, 0, A, 0, Size); if (a.length> size) {for (int index = size; index <a.length; index ++) {a [index] = null; }} 반환 a; } 기본적으로 배열을 작동하고 C 메소드를 사용하여 값을 할당하고 이동하는 것입니다. 원본 텍스트를 자세히 볼 수 있습니다. 개인 변수를 제외하고 원본 텍스트에는 많은 문제가 없으며 코드는 완벽하게 실행될 수 있습니다. 확장 방법에서 OldData 변수의 사용은 시스템의 두 가지 방법 인 ArrayCopy와 Arrayist.copy ()과 확장 방법에서 OldData 변수의 사용입니다. 이 변수는 정말 좋습니다. 처음에는 왜 이런 식으로 사용했는지 몰랐으며 원본 텍스트 끝에 설명하겠습니다.
위는 편집자가 귀하에게 소개 한 Java Arraylist의 구현에 대한 예제입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 답장을 드릴 것입니다. Wulin Network 웹 사이트를 지원해 주셔서 대단히 감사합니다!