데이터 구조 와 알고리즘 - 배열

1. 개념
배열 (Array) 은 선형 표 데이터 구조 이다.그것 은 같은 유형의 데 이 터 를 저장 하기 위해 연속 적 인 메모리 공간 을 사용한다.
2. 특징
2.1 선형 표
선형 표 는 데이터 가 하나의 선 처럼 배열 되 어 있 는 구조 이다.모든 선형 표 의 데 이 터 는 최대 앞 과 뒤의 두 방향 만 있다.사실은 배열 을 제외 하고 링크, 대기 열, 스 택 등 도 선형 표 구조 이다.
2.2 메모리 공간 연속, 데이터 형식 동일
현재 요소 주소 = 배열 의 첫 번 째 주소 + 요소 바이트 크기 는 8727 ° 배열 아래 에 현재 요소 주 소 를 표시 합 니 다 = 배열 의 첫 번 째 주소 + 요소 바이트 크기 \ ast 배열 아래 에 현재 요소 주 소 를 표시 합 니 다 = 배열 의 첫 번 째 주소 + 요소 바이트 크기 는 8727 ° 배열 아래 에 표 시 됩 니 다.
2.3 효율 적 인 랜 덤 액세스, 비효 율 적 인 삽입 과 삭제
메모리 공간 이 연속 되 기 때문에 방문 은 한 번 의 주소 지정 을 통 해 해당 하 는 데 이 터 를 찾 을 수 있 으 며, 삽입 과 삭제 후 후속 요 소 를 여러 번 데이터 이전 해 야 합 니 다.
접근 시간 복잡 도: O (1)
삽입 및 삭제 시간 복잡 도: O (n)
3. 배열 과 용기 비교
3.1 용기 우위
여러 배열 의 조작 방법 을 밀봉 하여 개발 에 편리 하 다.
동적 확장 지원
3.2 배열 우위
기본 형식 저장 가능
다 차원 배열 이 더욱 직관 적 임 을 나타 낸다.
4. 기타
4.1 배열 아래 표 시 는 왜 0 에서 시작 합 니까?
무 작위 접근 (요소 메모리 주소 계산) 을 편리 하 게 하기 위해 서 아래 표 시 는 1 부터 한 번 더 감법 작업 을 할 것 입 니 다.
4.2 손 찢 기 배열
package com.company;

import java.util.Arrays;

/**
 *     :
 *
 * @author liuchaoyong
 * @version 1.0
 * @date 2020/1/9 11:18
 */
public class MyArrayList<E> {
     

    /**
     *    
     */
    private static final Object[] EMPTY_ELEMENTDATA = {
     };

    /**
     *         ,      ArrayList          ,           ,
     *            
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
     };

    /**
     *       
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     *     
     */
    transient Object[] elementData;

    /**
     *       (       ,       ,   8   ,
     *                   , -8)
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    /**
     * ArrayList  ,   elementData          ,
     *    elementData     
     */
    private int size;

    /**
     *                    
     */
    public MyArrayList() {
     
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    /**
     *                   
     * >0         
     * =0     
     * <0    
     */
    public MyArrayList(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 E get(int index) {
     
        rangeCheck(index);
        return elementData(index);
    }

    /**
     *         ,      
     */
    public E set(int index, E element) {
     
        rangeCheck(index);
        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

    /**
     *          
     */
    public boolean add(E element) {
     
        ensureCapacityInternal(size + 1);
        elementData[size++] = element;
        return true;
    }

    /**
     *          
     */
    public void add(int index, E element) {
     
        rangeCheckForAdd(index);
        ensureCapacityInternal(size + 1);
        // index            index+1    
        System.arraycopy(elementData, index, elementData, index + 1,
                size - index);
        elementData[index] = element;
        size++;
    }

    /**
     *            
     */
    public E remove(int index) {
     
        rangeCheck(index);
        E oldValue = elementData(index);
        int numMoved = size - index - 1;
        // index+1            index    ,          gc  
        if (numMoved > 0) {
     
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }
        elementData[--size] = null;
        return oldValue;
    }

    /**
     *       
     */
    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;
    }

    /**
     *             
     */
    public boolean contains (Object o){
     
        return indexOf(o) >= 0;
    }

    /**
     *                 
     */
    public int indexOf(Object o) {
     
        if (o == null) {
     
            for (int index = 0; index < size; index++) {
     
                if (elementData[index] == null) {
     
                    return index;
                }
            }
        } else {
     
            for (int index = 0; index < size; index++) {
     
                if (o.equals(elementData[index])) {
     
                    return index;
                }
            }
        }
        return -1;
    }

    /**
     *                  
     */
    public int lastIndexOf(Object o){
     
        if (o == null) {
     
            for (int index = size-1; index > 0; index--) {
     
                if (elementData[index] == null) {
     
                    return index;
                }
            }
        } else {
     
            for (int index = size-1; index > 0; index--) {
     
                if (o.equals(elementData[index])) {
     
                    return index;
                }
            }
        }
        return -1;
    }

    /**
     *   ArrayList  
     */
    public int size() {
     
        return size;
    }

    /**
     *   ArrayList    
     */
    public boolean isEmpty() {
     
        return size == 0;
    }

    /**
     *     
     */
    public void clear() {
     
        for (int index = 0; index < size; index++) {
     
            elementData[index] = null;
        }
        size = 0;
    }

    /**
     *       
     */
    private void rangeCheck(int index) {
     
        if (index >= size) {
     
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
    }

    /**
     *       
     */
    private void rangeCheckForAdd(int index) {
     
        //rangeCheck  
        //System.arraycopy()     ,    index<0             
        if (index > size || index < 0) {
     
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
    }

    /**
     *         
     */
    @SuppressWarnings("unchecked")
    private E elementData(int index) {
     
        return (E) elementData[index];
    }

    /**
     *           ,      ,      
     */
    private void fastRemove(int index) {
     
        int numMoved = size - index - 1;
        if (numMoved > 0) {
     
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }
        elementData[--size] = null;
    }

    /**
     *     
     */
    private void ensureCapacityInternal(int minCapacity) {
     
        if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
     
            minCapacity = Math.max(DEFAULT_CAPACITY,minCapacity);
        }
        if (minCapacity - elementData.length > 0) {
     
            grow(minCapacity);
        }

    }

    /**
     *       
     */
    private void grow(int minCapacity) {
     
        //     
        int oldCapacity = elementData.length;
        //  1.5       (        1.5,    ,                 )
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //          ,                      ,       
        if (newCapacity - minCapacity < 0) {
     
            newCapacity = minCapacity;
        }
        //          ,         ,           
        if (newCapacity - MAX_ARRAY_SIZE > 0) {
     
            if (minCapacity < 0) {
     
                throw new OutOfMemoryError();
            }
            //                 ,     Integer.MAX_VALUE     (        ),              
            newCapacity = minCapacity > MAX_ARRAY_SIZE ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
        }
        Object[] copy = new Object[newCapacity];
        System.arraycopy(elementData, 0, copy, 0,
                elementData.length);
        elementData = copy;
    }

}

좋은 웹페이지 즐겨찾기