List接口及三个常用实现类ArrayList、LinkedList和Vector

List

List是有序、可重复容器
有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素
可重复:List允许加入重复的元素、List通常允许满足e1.equals(e2)的元素重复加入容器

ArrayList

ArrayList底层是用数组实现的。特点:查询效率高,增删效率低,线程不安全,允许null值。但一般使用它
数组长度是有限的,而ArrayList是可以存放任意数量的元素,长度不受限制,那么它是怎么实现的呢?
目前JDK的底层代码是,通过乘以1.5倍的方式,定义一个新的数组,将原来的内容拷贝过来,超出原来内容的数据,放在扩容后的位置中,进行动态扩容

ArrayList扩容源码的简单解析
在这里插入图片描述

public class Collection03 {
	//测试ArrayList中的 add,remove,clear,contains,size,isEmpty,toArray方法
	public static void main(String[] args) {
		// Collection是一个接口所以不能实例化,需要一个实现它的子类
		Collection<String> c = new ArrayList<String>();

		System.out.println("长度为" + c.size());

		System.out.println("是否为空" + c.isEmpty());

		// 往容器中添加内容
		c.add("张三");
		c.add("李四");
		System.out.println(c);
		Object[] obj = c.toArray(); // 转换成数组
		System.out.println(obj);
		// 只是从容器中移除了这个数据的引用地址,并没有把这个数据删除了
		c.remove("张三");
		System.out.println(c);
		// 判断是否包含某个元素
		System.out.println(c.contains("李四"));
		// 清空容器中的所有元素
		c.clear();
		System.out.println(c);

	}
}

remove()方法的简单源码解析
在这里插入图片描述
ArrayList交集并集示意图
在这里插入图片描述

/**
 * 测试ArrayList的并集合交集
 * @author csx
 *
 */
public class Collection04 {

	public static void main(String[] args) {
		//Collection是一个接口所以不能实例化,需要一个实现它的子类
		Collection<Integer> c1 = new ArrayList<Integer>();
		c1.add(1);
		c1.add(2);
		c1.add(3);
		
		Collection<Integer> c2 = new ArrayList<Integer>();
		c2.add(1);
		c2.add(3);
		c2.add(4);
		
//		c1.addAll(c2);  //将c2容器中的元素添加到c1容器中
//		System.out.println(c1);
//		
//		c1.removeAll(c2);  //将c1、c2中相同的元素,从c1中删除
//		System.out.println(c1);
		
//		c1.retainAll(c2);
//		System.out.println(c1); //将c1、c2中不同的元素,从c1中删除

		System.out.println(c1.contains(c2)); //判断c1是否包含c2中的所有元素
	}
}
/**
 * 测试ArrayList的跟索引相关的方法
 * @author csx
 *
 */
public class Collection05 {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");
		list.add("B");
		System.out.println(list);
		
		list.add(2, "你好"); //在指定索引位置插入元素
		System.out.println(list);
		
		list.set(2, "F"); //替换指定位置的元素
		System.out.println(list);
		
		list.remove(2); //删除指定索引位置的元素
		System.out.println(list);
		
		System.out.println(list.get(2));  //获取指定位置的元素
		
		System.out.println(list.indexOf("B")); //返回指定元素第一次出现的索引位置,若不存在就返回-1
		
		System.out.println(list.lastIndexOf("B")); //返回指定元素最后一次出现的索引的位置,若不存在就返回-1
	}
}

LinkedList

LinkedList底层是用双向链表实现存储,特点:增删效率高,查询效率低,线程不安全,允许null值

Vector

Vector底层是用数组实现的List,但是相关的方法都添加了同步检查,因此线程安全、效率低,扩容时Vector默认增长一倍。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值