实例:
package com.MyCollection;
?
/**
* 增加set和get方法---先写方法---定义访问修饰符、返回值、方法名、形参
* 再进行索引的合法判断
* 增加:数组边界的检查
* @author Lucifer
*/
public class LcfArrayList04<E> {
?
/*ArrayList底层有一个元素数组,用它来存储内容*/
private Object[] elementData; //用来存储我们的内容的
?
/*数组里面有多少元素---相当于计数器*/
private int size;
?
/*定义一个常量作为数组长度的默认长度*/
private static final int DEFAULT_CAPACITY = 10;
?
/*定义一个构造器,创建数组的时候给它默认长度*/
public LcfArrayList04(){
/*为数组新建对象*/
elementData = new Object[DEFAULT_CAPACITY]; //将新建的Object对象赋值给Object数组名
}
?
/*第二个构造器像之前一样---传数字,封装方法*/
public LcfArrayList04(int capacity){
/*检查一下不能传负数*/
if (capacity < 0){
/*抛出异常*/
throw new RuntimeException("容器容量不能为0");
}else if (capacity == 0){
/*默认创建一个容量为10的数组*/
elementData = new Object[DEFAULT_CAPACITY]; //将新建的Object对象赋值给Object数组名
}else {
/*数组长度=传入的数值---定义了自己的一个小内容*/
elementData = new Object[capacity];
}
}
?
/*给add方法添加扩容操作*/
public void add(E element){
/*当siz长度==elementData的时候就需要扩容了---判断*/
if (size == elementData.length){
/*扩容的方法---定义一个更大的数组*/
//采用源码当中的扩容方法
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)]; //这里计算的时候会有优先级问题,先算移位算法。如果不括起来JVM会先算前面的加法
//将原来的数组的值拷贝给新的扩容的数组
System.arraycopy(elementData,0,newArray,0,elementData.length);
/*再将老数组对象内容赋值给原来的数组元素代替值,让JVM回收掉老数组对象内容---重新指向新的数组对象*/
elementData = newArray;
}
elementData[size++] = element; //传入的值赋给新元素索引自增
}
?
/*增加一个get方法---访问修饰符、返回值、方法名、形参*/
/*
1.先写出方法---定义返回值、形参、方法名、修饰符等
2.判断索引是否合法
*/
public E get(int index){
?
/*运行时先判断*/
checkRange(index);
?
return (E)elementData[index]; //转型+索引下标
}
?
/*增加一个set方法---访问修饰符、返回值(有、无)、方法名、形参*/
public void set(E element, int index){
?
checkRange(index);
?
/*往里设置一个内容---核心代码*/
elementData[index] = element; //传入的形参赋值给带索引的数组的索引、下标自增
}
?
/*因为get和set方法都需要判断,所以把合法判断变成方法封装起来,再get和set方法调用之前先运行该方法进行判断*/