java中容器的模拟

因为我们要模拟容器所以先定义了一个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());
	}
}








九层之台,始于累土
用心      点滴      积累
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值