java集合 详解

首先分享一张来自古月人伟IT之家的思维导图认识一下集合的框架构成,方便理解和记忆。

java 如何去掉集合的括号 java集合超详解_数组

一 Iterable

  • 在介绍java Collection之前 先介绍一下 Clloection的父接口Iterable。
    Iterable与集合不同的是,Iterable在java.lang目录下,而Iterator,Collection及其子接口,子类都位于Java.util目录下。

Iterator

  • 1:next(): 最初迭代器在所有元素的左边,调用next()之后,迭代器移到第一个和第二个元素之间,next()方法返回迭代器刚刚经过的元素。
  • 2:hasNext(): hasNext()若返回True,则表明接下来还有元素,迭代器不在尾部。
  • 3: remove(): remove()方法必须和next方法一起使用,功能是去除刚刚next方法返回的元素。
  • 4: 遍历方式:for-each循环可以与任何实现了Iterable接口的对象一起工作,而Collection接口扩展了Iterable接口,故标准类库中的任何集合都可以使用for-each循环

二 Collection接口

Collection

Collection接口 是集合的顶级接口.Collection接口继承Iterable接口,Collection接口在java.util目录下,

Collection接口的方法列表

结果

size()

返回集合中的项数

isEmpty()

判断是否为空

contains(Object)

检测是否存在某个元素

clear()

清除

add(E)

添加元素

remove(Object)

删除元素

Iterator()

迭代器 遍历集合

Collection接口的remove()方法和Iterator接口的remove()方法区别?

  • 首先最直观的不同就是参数:Collection接口的remove()方法带参数,Iterator接口的remove()方法不带参数
  • 然后在性能方面:Collection的remove方法必须首先找出要被删除的项,采用的是单链表结构查询,单链表查询效率比较低,需要从集合中一个一个遍历才能找到该对象;而 Iterator的remove方法结合next()方法使用,有下一项就删除,没有就不删,比如集合中每隔一项删除一项,所以Iterator的remove()效率更高。
  • 最后在容错方面看:前提,在使用Iterator遍历时,使用Collection的remove()会报异常,用Collection的remove()的时候会调用到父类Iterable的Iterator,就有两个集合遍历,遍历移除的时候是移除Iterable里面的,没有移除Collection里面的所以会出现ConcurrentModificationException,因为集合中对象的个数会改变而Iterator 内部对象的个数不会,不一致则会出现该异常;但是在使用Iterator遍历时,不会报错,因为iterator内部的对象个数和原来集合中对象的个数会保持一致。

List、Set、Queue接口

  • List、Set、Queue接口都继承于Collection,而各有各自的特色;
  • List
    list有两个实现类 ArrayList,LinkedList

ArrayList

数组结构

get和set调用,查询的速度快;但是添加删除的速度慢。

LinkedList

链表结构

get和set的调用花费昂贵,不适合做查询;添加和删除的速度快。

  • Set
    Set有三个实现类 HashSet,TreeSet,LinkedHashSet

HashSet

效率最高

速度最快,没顺序保存元素,集合元素可以保存null,但只可以存一个null,存储对象

TreeSet

有序

升序保存对象

LinkedHashSet

有顺序

按照被添加的顺序保存对象

  • Queue
    Queue队列,先进先出
  1. Array与ArrayList有什么区别?
    其实问的就是数组与集合的区别?看懂这个就好办事儿了,Array是Java中的数组,ArrayList是集合,也就是动态数组,数组的复杂版本,可以动态的添加和删除元素。首先要搞懂数组的声明有三种方式,定义一个数组的时候,必须指定这个数组的数据类型及数组的大小,也就是说数组中存放的元素个数固定并且类型一样。而这个ArrayList的声明,在不使用泛型的情况下,这个list是可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数据了
    不同点:

ArrayList是Array的复杂版本

存储的数据类型:Array只能存储相同数据类型的数据,而ArrayList可以存储不同数据类型的数据

长度的可变:Array的长度是固定的,而ArrayList的长度是可变的

  1. 数组与list之间的相互转换
    (1).数组转list,可以使用Arrays.asList(数组)
    (2).List转数组,使用list.toArray()

Map
Map接口 不继承于Collection接口,Map接口下有三个实现类

HashMap

效率最高

提供了最快的访问技术,没有按照明显的顺序保存元素,键值对

TreeMap

升序保存键

LinkedHashMap

有顺序

按插入保存键,同时保留HashMap的查询速度

  • HashMap的实现原理
    1.存储对象时:将键值对传给put方法,调用hashcode计算hash 得到bucket(容器,比喻成桶)位置,进一步存储。
    2 .获取对象时:我们将K传递给get,他调用hashcode计算hash从而得到bucket位置,并进一步调用equals()方法确认键值对
  • HashMap和HashSet区别
    HashMap相对于HashSet较快,因为它是使用唯一的键获取对象

HashMap

实现了Map接口 存储键值对 调用put()向map中添加元素 使用key计算hashcode

HashSet

实现了Set接口 存储对象 调用add()向set中添加元素 使用成员对象计算hashcode

  • List、Set、Map之间的区别

List

可重复;多个null值;有顺序,插入的顺序和输出的顺序一样

Set

不重复;只可以一个null值;无序

Map

键值对,键唯一,值可重复;键一个null值,值可以多个null值;无序

*未完待续*