This article mainly introduces the relevant information about imitating source code customization in Java ArrayList. Friends in need can refer to
Java Imitate the source code to customize ArrayList
I recently looked at the source code of ArrayList and took the time to write a custom ArrayLsit with simple functions and no generics based on the underlying structure of ArrayList to help me better understand ArrayList:. The underlying data structure implemented is a group of Object, and the code is as follows:
/** * 自己实现一个ArrayList * */ public class MyArrayList { private Object[] elementData; private int size; public int size(){ return size; } public boolean isEmpty(){ return size==0; } //默认容量为10 public MyArrayList(){ this(10); } /** * 自定义容量 * @param initialCapacity */ public MyArrayList(int initialCapacity){ if(initialCapacity<0){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementData = new Object[initialCapacity]; } /** * 添加一个元素 * @param obj */ public void add(Object obj){ //数组扩容和数据的拷贝,重新new一个数组 if(size==elementData.length){ Object[] newArray = new Object[size*2+1]; System.arraycopy(elementData, 0, newArray, 0, elementData.length); elementData = newArray; } elementData[size++]=obj; // size++; } /** * 通过索引获取元素 * @param index * @return */ public Object get(int index){ rangeCheck(index); return elementData[index]; } /** * 通过索引删除元素 * @param index */ public void remove(int index){ rangeCheck(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 } /** * 删除对应的元素(利用equal判断元素是否一致) * @param obj */ public void remove(Object obj){ for(int i=0;i<size;i++){ if(get(i).equals(obj)){ //注意:底层调用的equals方法而不是==. remove(i); } } } /** * 设置索引对应的元素 * @param index * @param obj * @return */ public Object set(int index,Object obj){ rangeCheck(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; } /** * 将元素插入对应的位置 * @param index * @param obj */ public void add(int index,Object obj){ rangeCheck(index); ensureCapacity(); //数组扩容 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = obj; size++; } /** * 数组扩容 */ private void ensureCapacity(){ //数组扩容和数据的拷贝 if(size==elementData.length){ Object[] newArray = new Object[size*2+1]; System.arraycopy(elementData, 0, newArray, 0, elementData.length); // for(int i=0;i<elementData.length;i++){ // newArray[i] = elementData[i]; // } elementData = newArray; } } /** * 数组下标检查 * @param index */ private void rangeCheck(int index){ if(index<0||index>=size){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { MyArrayList list = new MyArrayList(3); list.add("333"); list.add("444"); list.add("5"); list.add("344433"); list.add("333"); list.add("333"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("------------------------------"); list.remove("444"); list.add(2, "a"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }
Test result:
333 444 5 344433 333 333 ------------------------------ 333 5 a 344433 333 333
The above is the detailed content of Example of ArrayList custom imitation source code in Java. For more information, please follow other related articles on the PHP Chinese website!