java的数据存储离不开集合工具,集合工具有很多种,今天在这就不一一举例了,进入今天的主题:
先定义一个List的接口,定义一些仿ArrayList功能的方法
public interface List {
Object get(int index);
boolean add(Object obj);
void set(Object obj,int index);
boolean remove(int index);
boolean isEmpty();
}
接下来
定义ArrayList实现List接口
public class ArrayList implements List{
//核心数组
private Object[] obj;
//数组再有存放数据的个数
private int size;
//默认的长度
private final int DEFAULT_SIZE = 10;
//默认数组
private final Object[] defaultObj = {};
/*
* 无参,无初始长度
*/
public ArrayList(){
obj = this.defaultObj;
}
/**
* 有参,有初始长度
* @param size
*/
public ArrayList(int size){
//数组 长度小的时候!会有过多的堆当中的创建对象!内存使用率高
if(size < this.DEFAULT_SIZE){
size = this.DEFAULT_SIZE;
}
obj = new Object[size];
}
/**
* 根据集合下标取值
*/
@Override
public Object get(int index) {
if(index > this.size){
throw new ArrayIndexOutOfBoundsException("指定长度大于数组长度");
}
if(index < 0 ){
throw new RuntimeException("下标必须大于零");
}
return this.obj[index];
}
/**
* 扩展数组长度
*/
private void exp(int index){
this.obj = new Object[index];
}
/**
* 扩充并且拷贝
*/
private void exp2(){
Object[] oldObj = this.obj;
exp(this.size + (this.size >> 1));
this.exp2(oldObj, 0, this.obj, 0, this.obj.length);
}
/**
* 将未扩充之前的集合里的内容拷贝到扩充后的集合中的函数,(确保功能单一原则)
* @param obj
* @param star
* @param desojb
* @param a
* @param b
*/
private void exp2(Object[] obj,int star,Object[] desojb,int a,int b){
System.arraycopy(obj, star, desojb, a, b);
}
/**
* 内聚 方法
* 第一个问题: 第一次添加 {new Arraylist(); 数组长度0 , 扩充 10 new ArrayList(10); }
第二个考虑:如果 满
第三个考虑:不满
*/
private void exp1(){
if(this.isEmpty()){
exp(this.DEFAULT_SIZE);//this.DEFAULT_SIZE 10
}else{
if(this.size == this.obj.length){
exp2();
}
}
}
/**
* 插入元素
*/
@Override
public boolean add(Object obj) {
exp1();
this.obj[this.size++] = obj;
return true;
}
/**
* 删除元素
*/
@Override
public boolean remove(int index) {
if((index + 1) != this.size){
this.exp2(this.obj, index + 1, this.obj, index, this.size - index);
}
this.obj[this.size] = null;
this.size--;
return true;
}
/**
* 返回集合里的内容
*/
public String toString(){
String info = "";
for(int i = 0 ;i < this.size;i++){
info += this.obj[i].toString() + (i == this.size - 1? "":",");
}
return "["
+ info +
"]";
}
/**
* 判断集合空与否
*/
@Override
public boolean isEmpty() {
return this.obj.length == 0 ? true : false;
}
/**
* 修改指定集合元素的内容
*/
@Override
public void set(Object obj, int index) {
if(index > this.size){
throw new ArrayIndexOutOfBoundsException("指定长度大于数组长度");
}
if(index < 0 ){
throw new RuntimeException("下标必须大于零");
}
this.obj[index] = obj;
}
}
最后对以上代码进行简单测试
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("张三");//第0个元素
list1.add("李四");//第1个元素
list1.add("王五");//第2个元素
list1.add("赵六");//第3个元素
System.out.println("所有元素====》"+list1);
System.out.println("判断集合里元素是否为空====》"+list1.isEmpty());
System.out.println("获取第2个元素==》"+list1.get(1));
//设置第3个元素的值为我不是王五了
list1.set("我不是王五了", 2);
System.out.println("修改后的集合元素===》"+list1);
//删除第三个元素
list1.remove(2);
System.out.println("删除后的集合元素===》"+list1);
}
测试结果:
所有元素====》[张三,李四,王五,赵六]
判断集合里元素是否为空====》false
获取第2个元素==》李四
修改后的集合元素===》[张三,李四,我不是王五了,赵六]
删除后的集合元素===》[张三,李四,赵六]
上诉代码中参有一些注解,可进行简单参考,要是存在问题以及需要优化的地方,欢迎大家提出!!!