Java中List集合的分析

Java中List集合的分析

Java中Collection下有三个集合分别是Set、List和Queue今天来学习下List集合。

在List集合中一共有三个类可以实例化List集合分别是:ArrayList、LinkedList和Vector类。三个类各自有不同的优缺点,目前用的较多的还是ArrayList类,其他两者除非在特殊的情况下,平时用的比较少。

Java ArrayList类

ArrayList类的底结构是数组,我们所用的功能都是在数组的基础上进行封装的。例如ArrayList类的扩容实际就是重新new一个容量更大的数组,在把原来的数组拷贝到新的数组里,最后把新数组的引用(相当于)地址传给原来数组名。因此ArrayList类的优缺点与数组相同:查询快、增删慢;线程不安全,效率高等。在平常这个类用的较多,因而可以之间实现一下这个类更有助于加深对其的理解。

自己实现ArrayList类


package HLJuniversity.RG.Learn.practice2;
/**
 * 自己实现ArrayList功能
 * 
 * @author RenGuang
 * 
 */

public class LCollection_TextArrayList<E> {
	/**
	 * 私有属性,其中包括。 elementDate 为Object类的数组对象。 size为数组下标的索引。 DEFALT_CAPACITY 为默认静态常量值。
	 */
	private Object[] elementDate;
	private int size;
	private static final int DEFALT_CAPACITY = 10;

	/**
	 * 两种构造方法分别是有参和无参构造方法
	 * 
	 */
	// 无参构造方法。
	public LCollection_TextArrayList() {
		elementDate = new Object[DEFALT_CAPACITY];
	}

	// 有参构造方法 确定elementDate的长度。
	public LCollection_TextArrayList(int amount) {
		elementDate = new Object[amount];
	}

	/**
	 * 自己定义的操作LCollection_TextArrayList的方法 
	 * 1、向elementDate数组添加Object类对象。
	 *  2、获得elementDate数组指定下标的值。
	 *  3、设置elementDate数组指定下标的值。
	 *  4、 检查数组下标是否越界
	 *  5、 删除特定的下标元素
	 */
	//1、向elementDate数组添加Object类对象。并且实现数组的扩容
	public void LCollection_AddObject(E element) {
		//if语句判断是否需要扩容
		if (size == elementDate.length) {
			//扩容操作
			Object[] newElementDate = new Object[elementDate.length + (elementDate.length >> 1)];// 注意优先级的问题
			System.arraycopy(elementDate, 0, newElementDate, 0, elementDate.length);
			elementDate = newElementDate;
		}
		elementDate[size++] = element;
	}

	//2、获得elementDate数组指定下标的值。
	public E LCollection_Get(int index) {
		//先检查给定的下标是否越界
		LCollection_checkRange(index);
		return (E) elementDate[index];
	}

	//3、设置elementDate数组指定下标的值。
	public void LCollection_Set(E elevent, int index) {
		//检查下标是否越界
		LCollection_checkRange(index);
		elementDate[index] = elevent;
	}

	//4、检查给定的数组下标是否越界方法
	public void LCollection_checkRange(int index) {
		if (index < 0 | index > size - 1) {
			throw new RuntimeException("索引不合法" + index);
		}
	}

	//5、 删除特定的元素  (与element相同的元素)
	public void LCollection_remove(E element) {
		for (int i = 0; i <= size - 1; i++) {
			if (element.equals(LCollection_Get(i))) {
				// 将元素删除
				LCollection_remove(i);
			}
		}
	}
	//5、 删除特定的元素(与index相同下标的元素)
	public void LCollection_remove(int index) {

		System.arraycopy(elementDate, index + 1, elementDate, index, size - index);
//		int numMoved = elementDate.length - index-1;也符合要求。
	}

	//重写String toString()方法
	public String toString() {
		StringBuilder strb = new StringBuilder();
		strb.append("[");
		for (int i = 0; i <= size - 1; i++) {
			strb.append(elementDate[i] + ",");
		}
		strb.setCharAt(strb.length() - 1, ']');
		return strb.toString();
	}

	//main方法用与调试LCollection_TextArrayList类
	public static void main(String[] args) {
		LCollection_TextArrayList LCollection_arrayList = new LCollection_TextArrayList(20);
		for (int i = 0; i < 21; i++) {
			LCollection_arrayList.LCollection_AddObject(i);
		}
		System.out.println(LCollection_arrayList);
		LCollection_arrayList.LCollection_remove(0);
		System.out.println(LCollection_arrayList);
	}
}

若要粘贴代码,请不要粘贴 package HLJuniversity.RG.Learn.practice2; 这是包的位置每个人设置的都不一样。

LinkedList类

LinkedList类的实现原理类似于C语言的链表,一个Note类包含三部分数据分别是两部分存储地址信息和剩下的一部分存储数据信息。| 地址1 | 数据 | 地址2 | 其中地址1存储的是上一个数据的地址,地址2存储的下一个数据的地址。这样通过两部分的地址信息就可以将所有的数据连接起来。LinkedList底层数据结构是链表,查询慢,增删快;线程不安全,效率高。

Vector类

是同步的,因此开销就比 ArrayList 要大,访问速度更慢。最好使用 ArrayList 而不是 Vector

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值