动态数组接口设计
元素的数量:int size()
是否为空:boolean isEmty()
是否包含某个元素:boolean contains(E element)
添加元素到最后:void add(E element)
返回index位置对应的元素:E get(int index)
设置index位置的元素:E set(int index,E element)
往index位置添加元素:void add(int index,E element)
删除index位置对应的元素: E remove(int index)
查看元素的位置: int indexOf(E element)
清除所有元素:void clear()
简单实现
属性
数组大小:int size
所有元素:E [] elements
构造函数
有参,设置元素E的大小:(E [])new Object[capacity]
不能直接new E[],而是要使用Object,再强转
无参,设置默认容量10,(E [])new Object[10]
传入的index位置参数不在数组范围:IndexOutOfBoundsException
清空clear实现
for (int i = 0; i < size; i++)<br> elements[i] = null;<br> size = 0;
将对象的地址引用设置为null,此时对象无引用,垃圾回收掉对象
不可将elements=null,这样会将整个数组回收掉
添加元素add实现
elements[size++] =element
两步操作:数组的size下标赋值element,再将数组的大小size+1
需要先判断是否容量足够,不够扩容
删除下标元素remove实现
for(int i=index +1;i<=size-1;i++)<br> elements[i-1] =elements[i];<br> elements[--size] = null;
三步操作:index位置后的元素全部向前移动1位,将要删除位置的元素地址设置为null,<br>回收掉删除的对象,最后在将szie减1<br>
在之前要判断index大小必须在size范围内,不能大于size;不允许否则下标越界<br>if(index <0 || index >=size) IndexOutOfBoundsException
指定位置添加元素add实现
for(int i=size-1;i>=index;i--)<br> elements[i+1] =elements[i];<br> elements[index] = element;<br>size++;
index位置后的元素全部向后移动1位,在将新数据添加到数组的index位置,size+1
在之前要判断index大小必须在size范围内,允许等于size。否则下标越界<br>if(index <0 || index >size) IndexOutOfBoundsException<br>
扩容
private void ensureCapacity(int capacity){<br> int oldCapacity = elemens.length;<br> if( oldCapacity >= capacity) return<br> //新容量为旧容量的1.5倍<br> int newCapacity = oldCapacity + (oldCapacity>>1);<br> E [] newElements = (E [])new Object[newCapacity];<br> for(int i=0;i<size;i++)<br> newElements[i] =elements[i];<br> elements = newElements; <br>}
可以使用jdk内置方法复制快
System.arraycopy(源数组,源数组中的起始下标,目标数组,存放的起始下标,复制的元素的个数)<br><br>源数组与目标数组可以一样,此时源数组就被扩容了
源数组 = Arrays.copyOf(源数组,扩容之后的长度)
数组泛型 MyList<E>
对象数组
Object[] obj = new Object[7],如果此时它在方法中,当方法运行完了之后,栈空间定义的变量Object [] obj会被销毁,<br>此时垃圾回收器查看堆空间中的new Object[7]对象是否有引用,如果没有,垃圾收集器会自动回收掉
obj指向了堆内存中的数组,数组中每个存储的是地址,每个地址指向的是一个对象,<br>当某个地址为null时,它原来所对应的对象就将被回收<br>
检验对象是否被回收
在对象类中重写finalize方法在打印便于观察:super.finalize(); System.out.println("sss")
通知jvm进行回收:System.gc()
动态数组中需要改动的
clear
elements[i] = null;
remove
elements[--size] = null;
查看元素下的索引indexOf实现
if (element == null) {<br> for (int i = size-1; i >= 0; i--)<br> if (elements[i]==null) return i;<br> } else {<br> for (int i = size-1; i >= 0; i--)<br> if (element .equals(elements[i])) return i;<br> }
两个问题
equals
这里不能使用 ==,如果是对象数组比较的是地址,<br>equals是比较对象是否相等,默认对象的equals方法就是。<br>也可以重写对象的equals方法:例如Person中如果以年龄相等为相等:<br>
@Override<br> public boolean equals(Object obj) {<br> Persion persion = (Persion) obj;<br> return this.age == persion.age;<br> }
null值处理
是否允许添加null元素?
默认允许
如果不允许,在add方法前添加非空判断
if(element==null) return
下标查询为null元素
如果为null,找到为null的第一个元素下标