Nowadays this is also a popular interview question. Let’s see how we can implement custom ArrayList. Here we are going to define only add method, which will add the element to list.
Step 1 – Define a class CustomArrayListExample by extending AbstractList.
public class CustomArrayListExample extends AbstractList { }
Step 2 – Define the following instance variable.
public class CustomArrayListExample extends AbstractList { Object[] elementData; private int size; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private static final int DEFAULT_CAPACITY = 10; protected int modCount = 0; }
Step 3 -Define default constructor and initialize the elementData array.
public class CustomArrayListExample extends AbstractList { Object[] elementData; private int size; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private static final int DEFAULT_CAPACITY = 10; protected int modCount = 0; CustomArrayListExample() { elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } }
Step 4 – Define ensureCapacity() which will increase the capacity of the list once it will reach threshold capacity and write below logic.
package customarraylist; import java.util.AbstractList; import java.util.Arrays; import java.util.Iterator; public class CustomArrayListExample extends AbstractList { Object[] elementData; private int size; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private static final int DEFAULT_CAPACITY = 10; protected int modCount = 0; CustomArrayListExample() { elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } private void ensureCapacity(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } if (minCapacity - elementData.length > 0) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } } }
Step 5 – Define add() method and call ensureCapacity() method.
package customarraylist; import java.util.AbstractList; import java.util.Arrays; import java.util.Iterator; public class CustomArrayListExample extends AbstractList { Object[] elementData; private int size; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private static final int DEFAULT_CAPACITY = 10; protected int modCount = 0; CustomArrayListExample() { elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } private void ensureCapacity(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } if (minCapacity - elementData.length > 0) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } } @Override public boolean add(Object e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } }
We have add() method which will add elements, we have initial capacity 10 as soon as we will add the 10th element new capacity will become 15.
Let’s define get() method and the main method. Inside the main method create an object of CustomArrayListExample and add some elements. Iterate the elements using the iterator and for each loop.
package customarraylist; import java.util.AbstractList; import java.util.Arrays; import java.util.Iterator; public class CustomArrayListExample extends AbstractList { Object[] elementData; private int size; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private static final int DEFAULT_CAPACITY = 10; protected int modCount = 0; CustomArrayListExample() { elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } private void ensureCapacity(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } if (minCapacity - elementData.length > 0) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } } @Override public boolean add(Object e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public static void main(String[] args) { CustomArrayListExample arrayListExample = new CustomArrayListExample(); arrayListExample.add("ram"); arrayListExample.add("mohan"); arrayListExample.add("sohan"); System.out.println("just print the list elements---"); System.out.println(arrayListExample); Iterator it = arrayListExample.iterator(); System.out.println("Using iterator---"); while (it.hasNext()) { System.out.println(it.next()); } System.out.println("Using for-each loop---"); for (Object str : arrayListExample) { System.out.println(str); } } @Override public Object get(int index) { rangeCheck(index); return elementData[index]; } public void rangeCheck(int index) { if (index >= size) { throw new IndexOutOfBoundsException(); } } @Override public int size() { return size; } }
Output is :
just print the list elements—
[ram, mohan, sohan]
Using iterator—
ram
mohan
sohan
Using for-each loop—
ram
mohan
sohan
For more details see how ArrayList works in java.
- How to create custom HashSet in Java.
- How to allow duplicate elements in Set.
- Collections interview Questions.
- How to avoid duplicate elements in ArrayList.