Java集合(二)List和set

介绍

Collection主要有三个子接口,分别为List(列表)、Set(集)、Queue(队列)。其中,List、Queue中的元素有序可重复,而Set中的元素无序不可重复;
在这里插入图片描述

List集合

list集合介绍

继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。

ArrayList

简介
  • ArrayList基于数组实现,是一个动态的数组队列。但是它和Java中的数组又不一样,它的容量可以自动增长,类似于C语言中动态申请内存,动态增长内存!
  • ArrayList继承了AbstractList,实现了RandomAccess、Cloneable和Serializable接口!
  • 集成了AbstractList,AbstractList又继承了AbstractCollection实现了List接口,它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能!
总结
  1. ArrayList 本质实现方法是用数组!是非同步的!

  2. 初始化容量 = 10 ,最大容量不会超过 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8!

  3. indexOf和lastIndexOf 查找元素,若元素不存在,则返回-1!

  4. 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 ”。

  5. ArrayList的克隆函数,即是将全部元素克隆到一个数组中。

  6. ArrayList实现java.io.Serializable的方式。当写入到输出流时,先写入“容量”,再依次写入“每一个元素”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。

  7. 从源码中可以看出,当容量不够时,每次增加元素,都要将原来的元素拷贝到一个新的数组中,非常之耗时,也因此建议在事先能确定元素数量的情况下,才使用ArrayList,否则建议使用LinkedList。

  8. ArrayList的实现中大量地调用了Arrays.copyof()和System.arraycopy()方法。

  9. ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

  10. 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,ArrayList中允许元素为null。

点击查看常用方法api

LinkedList

简介

LinkedList是基于链表实现的,从源码可以看出是一个双向链表。除了当做链表使用外,它也可以被当作堆栈、队列或双端队列进行操作。不是线程安全的,继承AbstractSequentialList实现List、Deque、Cloneable、Serializable。

总结
  1. LinkedList是非线程安全的。

  2. 在查找和删除某元素时,都分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null。

  3. 由于是基于列表的,LinkedList的没有扩容方法!默认加入元素是尾部自动扩容!

  4. LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用,如peek 、push、pop等方法。

  5. LinkedList是基于链表实现的,因此插入删除效率高,查找效率低!(因为查找需要遍历整个链表)

点击查看常用方法api

Vector

简介

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。Vector 是同步的,可用于多线程。

总结
  1. Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;若使用默认构造函数,则Vector的默认容量大小是10。

  2. 当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 大于0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。

  3. Vector的克隆函数,即是将全部元素克隆到一个数组中。

  4. 很多方法都加入了synchronized同步语句,来保证线程安全。

  5. 同样在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中也允许元素为null。

  6. 遍历Vector,使用索引的随机访问方式最快,使用迭代器最慢。

  7. Vector很多地方都与ArrayList实现大同小异,现在已经基本不再使用。

点击查看常用api

Stack

简介

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
因为它继承自Vector,那么它的实现原理是以数组实现堆栈的。如果要以链表方式实现堆栈可以使用LinkedList!

总结
  1. Stack实际上也是通过数组去实现的。实际调用的实现方法都是Vector中的方法!
  2. Stack继承于Vector,Stack拥有着Vector的属性和功能!

点击查看常用api

set集合

set集合介绍

Set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素。对 e1 和 e2,并且最多包含一个为 null 的元素。

  • 继承于Collection接口,具有增删查改的方法!
  • AbstractCollection抽象类,实现了Collection接口,并实现了里面的一些方法,如isEmpty、contains等。
  • Set的两个实现类,HashSet和TreeSet
  • HashSet实现本质其实就是HashMap,HashSet里面的元素是无序的。
  • TreeSet实现本质其实就是TreeSet,TreeSet里面的元素是有序的。

HashSet

简介
  1. HashSet实现Set接口,那么它也是一个不包含重复元素的一个无序的集合,允许使用null,有且仅有一个元素为null!
  2. HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装!
  3. HashSet通过iterator()返回的迭代器是fail-fast的。
总结
  1. HashSet中含有一个”HashMap类型的成员变量”map,HashSet的操作函数,实际上都是通过map实现的。
  2. 有两种遍历的方式:
    1、使用 Iterator
    2、使用foreach

点击查看常用api

TreeSet

简介

基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。

总结
  1. TreeSet中不允许使用null元素!在添加的时候如果添加null,则会抛出NullPointerException异常。
  2. TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
  3. TreeSet是非同步的方法。 它的iterator 方法返回的迭代器是fail-fast的。
  4. TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

点击查看常用api

总结对比

1.HashSet是一个无序的集合,基于HashMap实现;TreeSet是一个有序的集合,基于TreeMap实现。

2.HashSet集合中允许有null元素,TreeSet集合中不允许有null元素。

3.HashSet和TreeSet都是非同步!在使用Iterator进行迭代的时候要注意fail-fast。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值