因为我们要模拟容器所以先定义了一个collection接口。
package com.study008;
//容器接口
public interface Collection {
//向容器添加元素
public void add(Object o);
//获取容器的长度
public int size();
}
1. 使用数组模拟ArrayList
我们知道我们在使用数组的时候需要定义其length,为此会经常遇到数组下标越界的情况。但是我们在使用容器的时候就不必去担心这种问题。下面我使用数组来简单模拟下ArrayList。
package com.iteritor;
public class ArrayList implements Collection{
private int index = 0;
private Object[] objects = new Object[10];
/**
* 数组长度自动扩充
* @param o
*/
public void add(Object o){
//判断数组是否满了,如果已满就new一个新数组出来,其长度是原数组的两倍。
if (index==objects.length) {
Object[] newObjects = new Object[objects.length*2];
//将原数组中的数据复制到新数组里面 此方法四个参数的含义分别为 要被复制的数组,从哪个位置开始复制,目标数组,从哪个位置开始粘贴,复制的长度
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects;
}
objects[index]=o;
index++;
}
/**
* 查看长度
* @return
*/
public int size(){
return index;
}
}
为方便测试多弄了个Cat类
package com.model;
public class Cat {
private int id;
public Cat(int id) {
this.id = id;
}
}
下面是测试类
package com.test;
import com.iteritor.ArrayList;
import com.model.Cat;
public class Test2 {
public static void main(String[] args) {
Collection arrayList = new ArrayList();
for (int i = 0; i < 100; i++) {
arrayList.add(new Cat(i));
}
System.out.println(arrayList.size());
}
}
2. 使用链表模拟LinkedList
链表的特点是通过各个节点来连接。每个节点里面既包含了数据本身,同时也包含了下个节点的位置。下面我使用链表简单模拟实现容器LinkedList。
首先定义了一个节点类
package com.study008;
/**
* 节点类
* @author ad
*
*/
public class Node {
private Object data; //数据本身
private Node next; //能够找到下个节点的something,模拟时就认为是下个节点。
public Node(Object data, Node next) {
super();
this.data = data;
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
接着定义了LinkedList类,和上面的数组一样它也有两个方法,一个用来向容器添加元素,一个用来获取容器的size
package com.study008;
public class LinkedList implements Collection{
private Node first = null; //第一个节点
private Node last = null; //最后一个节点
private int size = 0; //链表的size
/*
* 链表元素添加方法
*/
public void add(Object o){
Node n = new Node(o, null); //将数据封装为节点
if (first==null) { //如果是第一个节点,将第一个和最后一个节点都设为n
first = n;
last = n;
}else{ //如果不是第一个节点,那么首先将原有链表中的最后一个节点的下个节点设为n,然后使新加的这个节点变为最后一个节点。
last.setNext(n);
last = n;
}
size++;
}
/**
* 获得链表的长度
* @return
*/
public int size(){
return size;
}
}
同样为方便测试多写个Cat类
package com.study008;
public class Cat {
private int id;
public Cat(int id) {
super();
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
最后是测试类
package com.study008;
public class Test {
public static void main(String[] args) {
Collection list = new LinkedList();
for (int i = 0; i < 50; i++) {
list.add(new Cat(i));
}
System.out.println(list.size());
}
}
九层之台,始于累土
用心 点滴 积累