java - Collection的子接口,Java.util.List子接口。

1、Set<E>子接口

这种系列的集合,有一个共同的特点:==元素不可重复==。

Set<E>子接口,没有增加方法,用的都是Collection<E>根接口中定义的方法。

Set子接口的常用实现类:

  • HashSet<E>:元素完全无序

  • TreeSet<E>:元素是有序的,按照大小顺序排列。此时就会依赖于

    • java.lang.Comparable<T>:自然比较接口

    • java.util.Comparator<T>:定制比较接口

  • LinkedHashSet<E>:元素是有序的,按照元素的添加顺序。因为底层有一个链表,把元素按照添加顺序连接起来了。

思考:如何实现元素不可重复的?或者说,元素的什么方法决定了元素是不是重复?

  • HashSet<E>:依据元素的equals方法和hashCode方法。底层是先看hashCode结果,如果hashCode相同,再看equals。如果hashCode不同,就不可equals了。至于底层如何存储,咱们在HashMap再细说。

  • TreeSet<E>:依据大小判断是否重复

    • java.lang.Comparable<T>:自然比较接口,里面compareTo方法如果返回0,就说明元素是“重复”

    • java.util.Comparator<T>:定制比较接口,里面compare方法如果返回0,就说明元素是“重复”

  • LinkedHashSet<E>:依据元素的equals方法和hashCode方法。因为LinkedHashSet是HashSet的子类。

Set集合框架图

二,java.util.List

1、List系列集合的特点

List系列的集合有一个共同特点:元素是==可以重复的==,==元素是有序的==。

List系列的集合有,List接口的实现类:ArrayList、LinkedList、Vector、Stack等

List系列的集合无论底层是不是数组,都提供了按照索引/下标操作元素的方法。

2、List子接口的API

原来Collection根接口的API,它也会继承。List在Collection的基础上,又增加了一些方法:

(1)添加元素

  • void add(int index, E ele):把元素添加到指定位置

  • boolean addAll(int index, Collection<? extends E> eles):把一组元素添加到指定位置

(2)删除元素

  • E remove(int index):删除指定位置的元素

(3)修改元素

  • E set(int index, E ele):替换[index]位置的元素

  • default void replaceAll(UnaryOperator<E> operator):按指定操作的要求替换元素(JDK8引入的)

(4)获取元素

  • E get(int index):返回[index]位置的元素

  • List subList(int fromIndex, int toIndex):返回[fromIndex, toIndex)范围的元素

  • int indexOf(Object obj):查询obj在列表中的位置,如果有重复,返回第1个

  • int lastIndexOf(Object obj):查询obj在列表中的位置,如果有重复,返回最后1个

3、List系列集合的遍历

(1)Iterator迭代器遍历

(2)foreach循环遍历

(3)新增了一种迭代器,List的专用迭代器:ListIterator迭代器

List 集合额外提供了一个 listIterator() 方法,该方法返回一个 ListIterator 列表迭代器对象, ListIterator 接口继承了 Iterator 接口,提供了专门操作 List 的方法:

  • void add():通过迭代器添加元素到对应集合

  • void set(Object obj):通过迭代器替换正迭代的元素

  • void remove():通过迭代器删除刚迭代的元素

  • boolean hasPrevious():如果以逆向遍历列表,往前是否还有元素。

  • Object previous():返回列表中的前一个元素。

  • int previousIndex():返回列表中的前一个元素的索引

  • boolean hasNext()

  • Object next()

  • int nextIndex()

4、List的实现类

(1)java.util.ArrayList:动态数组

ArrayList:使用频率最高的一种Collection系列的集合。

ArrayList的底层是数组,ArrayList通常被称为动态数组,代表的是动态数组的数据结构。

它的优点:元素是连续存储的,相邻存储的,存储、取效率都比较高。可以根据下标,快速的直接定位到某个元素。

它的缺点:在添加过程中,可能需要不断地扩容,这个操作会有时空消耗。随着元素原来越多,搬家的成本就越来越高。要求内存中必须能够找到一整块连续的存储空间。

比喻:如果一个班的学员出去旅游。如果大家的房间号是连续的,同一个楼层,那么找起来就非常快。==>数组

如果大家的房间号不是连续的,分散在酒店不同楼层不同位置,第1个房间的同学知道第2个同学的房间号。==>链表

(2)java.util.LinkedList:双向链表

LinkedList的底层是双向链表,代表的是双向链表的数据结构。

它的优点:元素不要求相邻。不要求JVM给我们分配一整块连续的内存空间。

它的缺点:元素不相邻,存取效率不高。结构比较复杂,使用结点会比单纯的存元素要占用更多的内存。

(3)java.util.Vector:动态数组

Vector:是古老的,最早的动态数组。

ArrayList是新的。线程不安全的,效率高。单线程下使用,肯定选它。

Vector是旧的,线程安全的,效率低。如果同一个集合被多个线程同时操作,那么可能要选它。如果不选它,还得通过别的方式实现线程安全的控制。

(4)java.util.Stack:栈

Stack:是Vector的子类。早期用来抽象“栈”的数据结构。

栈结构:先进后出。为了体现这种特征,Stack这个类增加了几个方法:

E peek() :查询当前栈顶元素,不取走栈顶元素。

E pop() :弹出栈顶元素。取走了栈顶元素。

E push(E item) :添加一个元素,添加到栈顶。等价于add,更见名知意。

int search(Object o) :查询o在栈中的位置。不是下标,是第几个元素。

5、栈

栈:是先进后出(Fisrt In Last Out ,简写 FILO)。

早期的时候用Stack,这个类还特意为体现栈结构,增加了:peek、pop、push、search等方法。

Stack类是Vector的子类,Vector是动态数组,所以这种Stack是基于数组实现的。

思考:如果我们不使用Stack类,单纯的使用ArrayList或Vector,能不能实现“栈结构”的效果?

6、队列

普通队列:先进先出(First In First Out,简称FIFO)。List有一个子接口,java.util.Queue<E>表示普通队列。List还有一个子接口,java.util.Deque<E>表示双端队列。

(1)LinkedList可以作为普通的队列

==Queue==除了基本的 Collection操作外,==队列==还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(nullfalse,具体取决于操作)。Queue 实现通常不允许插入 元素,尽管某些实现(如 )并不禁止插入 。即使在允许 null 的实现中,也不应该将 插入到 中,因为 也用作 方法的一个特殊返回值,表明队列不包含元素。

(2)LinkedList还可以作为双端队列

==Deque==,名称 deque 是“double ended queue==(双端队列)==”的缩写,通常读为“deck”。此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(nullfalse,具体取决于操作)。Deque接口的实现类有ArrayDeque和LinkedList,它们一个底层是使用数组实现,一个使用双向链表实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值