1、List
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | package com.yusian; public interface List<e> { static final int ELEMENT_NOT_FOUND = -1; /** * 获取数组长度 * @return 数组长度 */ public int size(); /** * 是否为空 * @return true / false */ public boolean isEmpty(); /** * 是否包含某元素 * @param element * @return true / false */ public boolean contains(E element); /** * 添加元素,默认添加到末尾位置 * @param element */ public void add(E element); /** * 获取元素 * @param index 索引 * @return 值 */ public E get(int index); /** * 替换元素 * @param index 索引 * @param element 元素 * @return 原元素内容 */ public E set(int index, E element); /** * 添加元素 * @param index 索引 * @param element 元素值 */ public void add(int index, E element); /** * 移除元素 * @return 返回被移除元素 */ public E remove(int index); /** * 获取元素索引 * @param element * @return 索引 */ public int indexOf(E element); /** * 清除数组 */ public void clear(); } </e> |
2、AbstractList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | package com.yusian; public abstract class AbstractList<E> implements List<E> { protected int size; /** * 获取数组长度 * @return 数组长度 */ public int size() { return size; } /** * 是否为空 * @return true / false */ public boolean isEmpty() { return size == 0; } /** * 是否包含某元素 * @param element * @return true / false */ public boolean contains(E element) { return indexOf(element) != ELEMENT_NOT_FOUND; } /** * 添加元素,默认添加到末尾位置 * @param element */ public void add(E element) { add(size, element); } /** * 内部判断 * @param index */ protected void rangeCheck(int index) { if (index < 0 || index >= size) { outOfRange(index); } } protected void rangeCheckForAdd(int index) { if (index < 0 || index > size) { outOfRange(index); } } protected void outOfRange(int index) { throw new IndexOutOfBoundsException("超出范围,Index:"+index+", size:"+size); } } |
3、ArrayList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | package com.yusian; @SuppressWarnings("unchecked") public class ArrayList<E> extends AbstractList<E>{ private E[] elements; private static final int DEFAULT_CAPACITY = 10; public ArrayList() { this(DEFAULT_CAPACITY); } public ArrayList(int capacity) { if (capacity < DEFAULT_CAPACITY) { capacity = DEFAULT_CAPACITY; } elements = (E[])new Object[capacity]; } /** * 获取元素 * @param index 索引 * @return 值 */ public E get(int index) { rangeCheck(index); return elements[index]; } /** * 替换元素 * @param index 索引 * @param element 元素 * @return 原元素内容 */ public E set(int index, E element) { rangeCheck(index); E old = elements[index]; elements[index] = element; return old; } /** * 添加元素 * @param index 索引 * @param element 元素值 */ public void add(int index, E element) { rangeCheckForAdd(index); ensureCapcity(size + 1); for (int i = size; i >= index; i--) { // 此处有可能超出elements的有效范围 elements[i+1] = elements[i]; } elements[index] = element; size++; } /** * 移除元素 * @return 返回被移除元素 */ public E remove(int index) { rangeCheck(index); // 0 1 2 3 4 5 6 7 // 1 2 3 4 5 6 7 8 E del = elements[index]; for (int i = index; i < size - 1; i++) { elements[i] = elements[i+1]; } elements[--size] = null; return del; } /** * 获取元素索引 * @param element * @return 索引 */ public int indexOf(E element) { if (element == null) { for (int i = 0; i < size; i++) { if (elements[i] == null) return i; } } else { for (int i = 0; i < size; i++) { if (element.equals(elements[i])) return i; // if (element == elements[i]) return i; } } return ELEMENT_NOT_FOUND; } /** * 清除数组 */ public void clear() { for (int i = 0; i < size; i++) { elements[i] = null; } size = 0; } @Override public String toString() { // TODO Auto-generated method stub StringBuilder str = new StringBuilder(); str.append(super.toString()).append(" size = ").append(size).append(", ["); for (int i = 0; i < size; i++) { if (i > 0) { str.append(", "); } str.append(elements[i]); } str.append("]"); return str.toString(); } /** * 私有方法 */ private void ensureCapcity(int capcity) { if (elements.length > capcity) return; int oldCapcity = elements.length; // 扩容原来的约1.5倍 int newCapcity = oldCapcity + (oldCapcity >> 1); E[] newElements = (E[]) new Object[newCapcity]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements = newElements; System.out.println("容量:" + oldCapcity + " --> " + newCapcity); } } |
Main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package com.yusian; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(1, 0); System.out.println(list); } } |