I am implementing a class to mimic dynamic array as a part of my learning process of data structures. I have written the following class which works as a dynamic array data structure.
I have gone through some video tutorials and also read some code from Java's ArrayList implementation to understand how to code it in a simple manner. I would like to get the code reviewed from the following perspective:
- Is there any design pattern that I should be following
- Improvements like removing compile time warning related to generics.
- Any tips on including test cases that can expose hidden issues in the code
- Any other tips that will make it a better code like improve its performance or make it more modular.
import java.util.Arrays;
import java.util.Iterator;
public class DynamicArray<T> implements Iterable<T> {
private Object[] elements;
private int length = 0;
private int capacity = 0;
public DynamicArray() {
this(10);
}
public DynamicArray(int capacity) {
this.capacity = capacity;
this.length = 0;
this.elements = new Object[capacity];
}
public int size() {
return length;
}
public boolean isEmpty() {
return size() > 0;
}
public T get(int index) {
validateIndexValue(index);
return (T)elements[index];
}
public void set(int index, T element) {
validateIndexValue(index);
elements[index] = element;
}
public void clear() {
for(int i = 0; i < length; i++) {
elements[i] = null;
}
length = 0;
}
public boolean add(T element) {
ensureCapacity(length + 1);
elements[length++] = element;
return true;
}
public T removeAt(int index) {
validateIndexValue(index);
T element = (T) elements[index];
removeElement(index);
return element;
}
public boolean remove(T element) {
if(element == null) {
for(int i = 0; i < length; i++) {
if(elements[i] == null) {
removeElement(i);
return true;
}
}
} else {
for(int i = 0; i < length; i++) {
if(element.equals(elements[i])) {
removeElement(i);
return false;
}
}
}
return false;
}
public int indexOf(T element) {
if(element == null) return -1;
for(int i = 0; i < length; i++) {
if(element.equals(elements[i])) {
return i;
}
}
return -1;
}
public boolean contains(T element) {
return indexOf(element) > -1;
}
public java.util.Iterator<T> iterator() {
return new java.util.Iterator<T>() {
int index = 0;
public boolean hasNext() {
return index < length;
}
public T next() {
return (T) elements[index++];
}
};
}
private void removeElement(int index) {
int elementsToMove = length - index - 1;
if(elementsToMove > 0) {
System.arraycopy(elements, index + 1, elements, index, elementsToMove);
}
elements[--length] = null;
}
private void ensureCapacity(int minSize) {
if(minSize >= capacity) {
capacity *= 2;
elements = Arrays.copyOf(elements, capacity);
}
}
private void validateIndexValue(int index) {
if(index >= length || index < 0) {
throw new IllegalArgumentException("Bad index value passed : " + index);
}
}
}
```
element.equals(elements[i] == null)- do you really mean it? \$\endgroup\$