集合源码解读

集合(一)

为何如此之说,想必了解集合的人都知道,集合种类多,隐藏极深,甚至于隐藏到有些集合无人知道,哈哈,常用的集合才现于世面;先直接上图如下:

在这里插入图片描述

由上图集合框架可知,集合框架包括两种容器,一是集合(Collection)–存储元素集合,二是图(Map)–存键值对;Collection接口有3个子类型,List、Set和Queue,下来是抽象类,再就是具体实现类,常见的实现类有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap和LinkedHashMap等等;

四大集合

List(ArrayList/LinkedList/Vector)

Set(EnumSet/SortedSet/HashSet)

Queue(Deque/PriontyQueue)

Map(HashMap/LinkedHashMap/HashTable/TreeMap)

List:(有序/可重复)

在这里插入图片描述

List集合存放的对象是有序的,也是可重复的;对于List是有索引相关方法,所以说查询速度比较快,但是在新增/删减元素的时候会影响相应的旁边的数据,所以在插入或删除元素的时候速度比较慢;

List接口中的default方法,是jdk1.8以后可以有方法体:

在这里插入图片描述
在这里插入图片描述

ArrayList集合实现类:

在这里插入图片描述

ArrayList是基于数组的,在初始化ArrayList时,会构建空数组(Object[] elementData={})。ArrayList是无序的,它会根据添加的先后顺序排列,同时也提供了sort方法,如需对ArrayList进行排序,调用此方法再提供Comparator比较器即可;

在这里插入图片描述

第一个remove方法时根据index来移除的集合下标对应的元素,源码中可以看到有一个elementData(index)的调用,对index检查是否在合理的范围;如果是的话就会调用System.arraycopy()方法将集合中的方法向前移动;

在这里插入图片描述
在这里插入图片描述

而这个remove方法参数为Object,且返回为布尔类型;首先它会判断传入的对象是否为空,如果为null的话,会调用fastRemove()方法,并根据null对应的index进行删除,从而调用System.arraycopy()来将后面的数据向前移动;而将对象传进来的时候遍历获取第一个与该对象相等的下标,通过System.arraycopy()来剔除该元素并将index之后的元素向前移动;

如下举例可以进行参考

		ArrayList<String> list = new ArrayList<>();
		list.add("1");
		list.add("2");
		list.add("3");
		list.add("3");
		list.add("4");
		list.add(null);
		list.add(null);
		
		System.out.println(list);//[1, 2, 3, 3, 4, null, null]
		list.remove(0);
		System.out.println(list);//[2, 3, 3, 4, null, null]
		list.remove(null);
		System.out.println(list);//[2, 3, 3, 4, null]
		list.remove("3");
		System.out.println(list);//[2, 3, 4, null]

ArrayList的排序功能sort

在这里插入图片描述
在这里插入图片描述

此方法是重写了List接口的sort方法,其中参数为Comparator比较器,方法里又调用了Arrays.sort()方法,对集合对象中的元素进行排序,并按Comparator中方法进行排序;代码参上:

		Comparator<Integer> c = new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				if(o1 > o2) return 1;
				else return -1;
			}
		};
		ArrayList<Integer> l = new ArrayList<>();
		l.add(21);
		l.add(1);
		l.add(213);
		l.add(21);
		l.add(31);
		System.out.println(l);//[21, 1, 213, 21, 31]
		l.sort(c);
		System.out.println(l);//[1, 21, 21, 31, 213]
LinkedList集合实现类:

LinkedList是基于链表的,它是一个双向链表,每个节点维护一个prev和next指针。同时对这个链表,维护了first和last指针,first指向第一个元素,last指向最后一个元素;LinkedList是无序链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序;由此可知,LinkedList对查询来说速度是比较慢的,而对于插入和删除速度比较快,可以直接在指定的位置进行增删元素;

在这里插入图片描述

LinkedList提供了几个添加元素的方法:addFirst、addLast、addAll、add等,时间复杂度为O(1)。

在这里插入图片描述
在这里插入图片描述

其他几个都是类似的,上代码:

		LinkedList<Integer> list = new LinkedList<>();
		LinkedList<Integer> list2 = new LinkedList<>();
		list2.add(1);
		list2.add(2);
		list.add(2);
		list.add(4);
		list.add(3);
		list.add(7);
		System.out.println(list);//[2, 4, 3, 7]
		list.addFirst(90);
		System.out.println(list);//[90, 2, 4, 3, 7]
		list.addLast(80);
		System.out.println(list);//[90, 2, 4, 3, 7, 80]
		list.addAll(list2);
		System.out.println(list);//[90, 2, 4, 3, 7, 80, 1, 2]

Vector集合实现类:

在这里插入图片描述
在这里插入图片描述

追其源码可以发现其大部分源码都是synchronized的,即同步;所以其线程是安全的,与ArrayList相比,Array List是异步的,线程不安全,但是效率比Vector高;

今天先讲List相关实现类!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值