java集合浅析

集合是什么
  • 定义:Java集合类存放于 java.util 包中,是一个用来存放对象的容器。

注意:
①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。

②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。

③、集合可以存放不同类型,不限数量的数据类型。

  • 由来:通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了!

下图为常用集合
java常见集合 基本都是由 MapCollection接口衍生而来

java常见集合.jpg

java 集合框架图
image

下图为Collection接口衍生出的常见集合

collention.png

List
  • List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素
  • List 接口存储一组不唯一,有序(插入顺序)的对象。
  • ArrayList

  • ArrayList 是一个动态数组,以一个数组的格式进行存储,但是可以动态增长,继承自AbstractList,实现了List接口

  • ArrayList是一个非线程安全的类,使用时最好在一个线程中操作,构造函数可以提供一个数组的初始化大小,不提供默认按16来进行数组的初始化,往ArrayList增加元素时,都会先判断是否还有空间存在元素,如果没有空间,则会重新申请一个

  • LinkedList

  • LinkedList 同时实现了List,Deque,所以也可以用来作为双向队列使用。LinkedList是以双向列表存储的,它是按照元素的先后顺序进行存储的,所以访问也是按照顺序来访问的。

  • Vector

  • Vector 基本上很少用到了,和ArrayList很相似,唯一的不同是Vector的方法都是线程安全的,而Array List是非线程安全的,从这点上来说,ArrayList的效率要比Vector的效率高,另外Vector是以2倍的方式扩展数组容量的

  • Stack

  • Stack (栈)是Vector的一个子类,它实现了一个标准的后进先出的栈。

Set
  • Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。
  • Set 接口存储一组唯一,无序的对象。
  • HashSet
  • HashSet是讲存入Set中的元素以Hash链表的方式存储起来,所有元素存入Set中的位置通过调用hashCode方法获取hash值来决定,所以需要设计好的hashcode方法尽量将存入的值散列开有利于提升 HashSet的访问效率。
  • TreeSet
  • TreeSet继承于AbstractSet,并且实现了NavigableSet接口
    TreeSet实现了一个顺序访问的不重复元素的Set,底层使用红黑树进行数据的存储,来加快访问的速度
  • LinkedHashSet
  • 继承与HashSet,和HashSet的唯一区别是维护了一个双向列表来维护元素的顺序,所有访问是按顺序访问
Set和List的区别
    1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
    1. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
    1. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
map.png
Map

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

  • HashMap
  • 和HashSet相似,用hash链表来存储,讲键值对作为一个元素存储
  • LinkedHashMap
  • 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序
  • TreeMap
  • 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
  • ConcurrentHashMap
  • ConcurrentHashMap 是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

你可能感兴趣的:(java集合浅析)