主要为add, get, set, remove, indexOf,数组扩容等内容的学习。
扩容:
扩容前提:size==elementData.length,也就是元素个数达到了数组容器的长度。
创建新的更大空间的(如size*2+1)数组对象,
Object[] newArray = new Object[size*2+1]
遍历原来数组元素,复制到新数组中,在将这个新数组重新赋值给同名字的elementData。
public Object[] grow() {
if (size == elementData.length) {
Object[] newArray = new Object[size*2+1];
for (int i=0; i<elementData.length; i++) {
newArray[i] = elementData[i];
}
elementData = newArray;
}
return elementData;
}
数组添加元素:
elementData[s] = element;
size++;
记得不要忘了添加size++, 添加元素,size相应增大。
相反,remove元素后,不要忘了"- - size"。
1、add
类内部调用的add方法:先扩容,然后在index=size位置处,添加元素,size++
private void add(E e, Object[] obj, int s) {
elementData = grow();
elementData[s] = e;
size++;
}
add (element):直接调用上方的内部类的私有方法add
public boolean add(E e) {
add(e, elementData, size);
return true;
}
add (index, element):先扩容,然后将index位置到最后的元素,全部往后挪一个位置,也就是复制到index+1,在将目标元素放入到数组index位置处,size++。
public boolean add(int index, E element) {
indexCheck(index);
// 扩容
elementData = grow();
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = element;
size++;
return true;
}
2、get
get实际上就是用index从数组中取值
public Object get(int index) {
indexCheck(index);
return elementData[index];
}
3、remove
原理就是将index+1到最后的元素,往前挪一个位置,最后一个元素设为null,size-1。
public E remove(int index) {
indexCheck(index);
E oldValue = (E) elementData[index];
System.arraycopy(elementData, index+1, elementData, index, size-index-1);
elementData[--size] = null;
return oldValue;
}
4、set
这个简单,直接将数组index位置处,赋值为目标元素。
public boolean set(int index, E e) {
elementData[index] = e;
return true;
}
5、indexOf
其实遍历数组,用equals来判断是否存在目标元素,有就返回对应 i,没有就返回-1.
public int indexOf(Object obj) {
return indexOfRange(obj, 0, size);
}
public int indexOfRange(Object obj, int start, int end) {
if (obj == null) {
for (int i=start; i<end; i++) {
if (elementData[i] == null) {
return i;
}
}
} else {
for (int i=start; i<=end; i++) {
if (obj.equals(elementData[i])) {
return i;
}
}
}
return -1;
}
整体代码
package cn.sxt.oop.datastructure;
/**
* practice of add()
* add(index, element)或者add(element)两种添加元素方法,都需要考虑:扩容的问题,第二,要记得加size++,不然元素会变少
* @author t_chenli
* @param <E>
*
*/
public class ArrayListAddPra<E> {
Object[] elementData;
private int size;
private final Object[] EMPTY_ELEMENTDATA = {};
public ArrayListAddPra() {
this.elementData = EMPTY_ELEMENTDATA;
}
public ArrayListAddPra(int initialCapacity) {
if (initialCapacity > 0) {
elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
elementData = EMPTY_ELEMENTDATA;
} else {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public int size() {
return size;
}
private void add(E e, Object[] obj, int s) {
elementData = grow();
elementData[s] = e;
size++;
}
public boolean add(E e) {
add(e, elementData, size);
return true;
}
public Object[] grow() {
if (size == elementData.length) {
Object[] newArray = new Object[size*2+1];
for (int i=0; i<elementData.length; i++) {
newArray[i] = elementData[i];
}
elementData = newArray;
}
return elementData;
}
public boolean add(int index, E element) {
indexCheck(index);
//o 扩容
elementData = grow();
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = element;
size++;
return true;
}
public Object get(int index) {
indexCheck(index);
return elementData[index];
}
public boolean set(int index, E e) {
elementData[index] = e;
return true;
}
public E remove(int index) {
indexCheck(index);
E oldValue = (E) elementData[index];
System.arraycopy(elementData, index+1, elementData, index, size-index-1);
elementData[--size] = null;
return oldValue;
}
public int indexOf(Object obj) {
return indexOfRange(obj, 0, size);
}
public int indexOfRange(Object obj, int start, int end) {
if (obj == null) {
for (int i=start; i<end; i++) {
if (elementData[i] == null) {
return i;
}
}
} else {
for (int i=start; i<=end; i++) {
if (obj.equals(elementData[i])) {
return i;
}
}
}
return -1;
}
private void ensureCapacity() {
if (size == elementData.length) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void indexCheck(int index) {
if (index<0 || index>=size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ArrayListAddPra list = new ArrayListAddPra();
list.add("aaa");
list.add("bbb");
list.add(123);
list.add(new Pandas());
list.add(new String("one string"));
System.out.println("######### add(element) test #############");
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("size: "+list.size());
System.out.println("######### add(index,element) test #############");
list.add(1, "Libao");
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("size: "+list.size());
System.out.println("######### set(index, element) test #############");
list.set(1, "111");
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("size: "+list.size());
System.out.println("######### remove(index) test ###########");
list.remove(0);
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("size: "+list.size());
System.out.println("######### indexOf(obj) test ############");
System.out.println("index of 123: " + list.indexOf(123));
System.out.println("index of bbb: " + list.indexOf("bbb"));
System.out.println("######### 扩容 test #############");
for (int i=1; i<11; i++) {
list.add(i);
}
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("size: "+list.size());
}
}
class Pandas {
}
结果:
######### add(element) test #############
aaa
bbb
123
cn.sxt.oop.datastructure.Pandas@368239c8
one string
size: 5
######### add(index,element) test #############
aaa
Libao
bbb
123
cn.sxt.oop.datastructure.Pandas@368239c8
one string
size: 6
######### set(index, element) test #############
aaa
111
bbb
123
cn.sxt.oop.datastructure.Pandas@368239c8
one string
size: 6
######### remove(index) test ###########
111
bbb
123
cn.sxt.oop.datastructure.Pandas@368239c8
one string
size: 5
######### indexOf(obj) test ############
index of 123: 2
index of bbb: 1
######### 扩容 test #############
111
bbb
123
cn.sxt.oop.datastructure.Pandas@368239c8
one string
1
2
3
4
5
6
7
8
9
10
size: 15