/**
* 自己实现一个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));
}
}
}