Java容器知识总结笔记

参考: java6在线中文api

Java容器可分为两大类:

Collection

List
ArrayList
LinkedList
Vector(了解,已过时)
Set
HashSet
LinkedHashSet
TreeSet

Map

HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable(了解,,已过时)

###容器类图
简单的容器分类
完整容器框架分类

#1. 集合(Collection)

  • Java是一门面向对象的语言,就免不了处理对象

  • 为了方便操作多个对象,那么我们就得把这多个对象存储起来

  • 想要存储多个对象(变量),很容易就能想到一个容器

  • 常用的容器我们知道有StringBuffered,数组(虽然有对象数组,但是数组的长度是不可变的!),所以,Java就为我们提供了集合(Collection)。
    ###1.1. 数组和集合的区别

  • 1:长度的区别
    数组的长度固定
    集合的长度可变

  • 2:内容限制
    数组存储的是同一种类型的元素
    集合可以存储不同类型的元素(但是一般不这样干…)

  • 3:元素的数据类型
    数组可以存储基本数据类型,也可以存储引用类型
    集合只能存储引用类型(你存储的是简单的int,它会自动装箱成Integer)

###1.2. Collection的特点与功能
集合可以存储多个元素,但我们对多个元素也有不同的需求,比如

  • 1 多个元素,不能有相同的
  • 2 多个元素,能够按照某规则排序
    针对不同的需求,java就提供了很多集合类,把集合共性的内容不断往上提取,最终形成集合的继承体系:Collection
    Collection类基础方法
    可以发现Collection的源码中继承了Iterable,且有iterator()这个方法。
    Iterable是一个接口,它有iterator()这个方法,返回的是Iterator,Iterator也是一个接口,它只有三个方法:
  • hasNext()
  • next()
  • remove()
    我们可以在ArrayList下找到了iterator实现的身影:它是在ArrayList以内部类的方式实现的!并且,从源码可知:Iterator实际上就是在遍历集合。
private class Itr implements Iterator<E> {...}

所以说,我们遍历集合(Collection)的元素都可以使用Iterator,至于它的具体实现是以内部类的方式实现的!

#####Collection继承关系:
绿色为接口,蓝色为类,灰色为抽象类

上图的结构需要记住,但我们在实际开发过程中,要掌握的并不需要那么多,只需要掌握一些常用的集合类就行:Set,List,HashSet,LinkedHashSet,TreeSet,ArrayList,Vector

1.3. List集合

List接口继承了Collection接口,通过比较,可以发现多了哪些方法(略),List集合的特点就是:有序(存储顺序和取出顺序一致),可重复。
List集合常用的子类有三个:

  • ArrayList
    底层数据结构是数组。线程不安全
  • LinkedList
    底层数据结构是链表。线程不安全
  • Vector
    底层数据结构是数组。线程安全

1.4. Set集合

Set接口继承了Collection接口,Set集合的特点就是:元素不可重复。
Set集合常用子类:

  • HashSet集合
    底层数据结构是哈希表(是一个元素为链表的数组)
  • TreeSet集合
    底层数据结构是红黑树(是一个自平衡的二叉树)
    保证元素的排序方式
  • LinkedHashSet集合
    底层数据结构由哈希表和链表组成。

#2. 映射(Map)
映射(Map)的模型图是这样的
map模型图

###2.1. Map的特点与功能

  • Map集合的特点:
    将键映射到值的对象,一个映射不能包含重复的键,一个键只能对应一个值;

  • Map和Collection的区别:
    Map存储的元素是成对的,Map的键是唯一的,而值是可为空,可重复的;
    Collection存储的元素是单独的,其子类中Set是唯一的,List是可重复的。
    Map类方法
    可以看出:

  • Map接口没有父类;

  • 有一个内部类Entry,表示单独的键值对象;

  • 有单独的分离键集合的方法;

  • 有单独分离值集合的方法;

  • 有单独分离键值对象集合的方法。

###Map继承关系
Map继承关系

上图的结构需要记住,但我们在实际开发过程中,需要数量掌握一些常用的类:Map,HashMap,HashTable,LinkedHashMap,TreeMap

  • AbstractMap
    抽象类,实现了大部分的Map接口。
  • HashMap
    在JDK8中HashMap的底层HashMap 是通过数组+链表(散列表)+红黑树实现的,它存储的内容是键值对(key-value)映射。
    该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
  • HashTable
    HashTable不能放null,会抛出NullPointerException,HashTable是同步的。
  • TreeMap
    继承了AbstractMap,基于红黑树,键、值都不能为null,使用元素的自然顺序对元素进行排序。
  • LinkedHashMap
    继承于HashMap,内部维持了一个双向链表,可以保持元素的插入顺序。

// TODO

  • ArrayList源码解析
  • LinkedList源码解析
  • HashSet源码解析
  • HashMap源码解析
  • LinkedHashMap源码解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值