Java集合大纲

Java 集合位于java.util包下。严格的来说是位于rt.jar下的java.util包。 这个集合用到了很多常用的数据结构比如数组、链表、栈、队列、树、堆、集合、哈希表。这里数据结构大概可以分为四类1.集合(元素之间除了“同属一个集合” 的相互关系外,别无其他关系) 2.线性结构(元素之间存在一对一的相互关系) 3.树形结构(元素之间存在一对多的相互关系) 4.图形结构(元素之间存在多对多的相互关系)

我们主要从五方面来分析java集合 1.List列表、2.Set集合、3.Map映射、4.迭代器(Iterator、Enumeration)、5.工具类(Arrays、Collections)

回顾数据结构
线性结构
  1. 数组 是在内存中开辟一段连续的空间,并在此空间存放元素。(元素类型是固定的、长度是固定的、通过角标查询,查询快,增删慢)
  2. 链表 是物理存储单元上非连续 逻辑上通过指针来实现链接次序就是连续(不需要确定长度大小,也不需要连续的内存空间,由于不连续内存空间导致 查找慢 增删还可以 而且每个元素都要存储其他元素的指针增大了内存的开销)链表分为 单向 双向 有序(以hash值为标准的排序) 循环(一个圈 各自拿着对应的指针)
  3. 栈 是限定仅在表尾进行插入和删除操作的线性表。栈又称为后进先出(Last in first out)的线性表,简称LIFO结构。 栈存储结构分为两种顺序存储结构链式存储结构 (底层就是 数组和链表)优缺点也是数组跟链表的优缺点。
  4. 队列 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(first in first out)的线性表,简称FIFO。队列存储结构分为两种 顺序存储结构 、链式存储结构 (底层就是 数组和链表)
    队列为了避免数组插入和删除时需要移动数据,于是就引入了循环队列,使得队头和队尾可以在数组中循环变化。解决了移动数据的时间损耗。实质底层用的是循环链表
树形结构
  1. 树 是包含n个结点的有穷集 根节点下带有n个子节点 然后这些子节点又作为根节点带着n个子节点。
    • 如果G是树,那么边数=顶点数-1
    • 树中任意两点存在唯一路径
    • 树是连通的而且任何边均为桥
    • 在树中不同两点加上一个边会得到唯一一个圈
  2. 二叉树 是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。
    • 一棵深度为k,且有2^k-1个节点称之为满二叉树,一棵二叉树第i层最多有2^(i-1)个节点;
    • 深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树
  3. 堆 也被称为优先队列(priority queue)。队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。而堆也是一样,在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的。这个优先顺序可以是元素的大小或者其他规则。
    • 堆优先顺序就是大的元素排在前面,小的元素排在后面,这样得到的堆称为最大堆
    • 堆优先顺序就是小的元素排在前面,大的元素排在后面,这样得到的堆称为最小堆
    • 最大堆:每个节点的值都大于等于它的孩子节点。
    • 最小堆:每个节点的值都小于等于它的孩子节点。
    • 可以理解为二叉树的一种,是节点间有序关系的完全二叉树,所以可以用数组来表示。
    • 对于下标为i的节点,它的子树的左节点的下标为2i,右节点为2i+1,父亲的节点下标为i/2(向下取整)。注意是下标这是按完全二叉树的下标
      这里写图片描述
哈希表结构
  1. 哈希表支持一种最有效的检索方法:散列。哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素。2.
  2. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表。哈希函数每次接受一个键将返 回与键相对应的哈希编码或哈希值。键的数据类型可能多种多样,但哈希值的类型只能是整型。
  3. 链式哈希表从根本上说是由一组链表构成。每个链表都可以看做是一个“桶”,我们将所有的元素通过散列的方式放到具体的不同的桶中。
  4. 当哈希函数能够保证不同的键生成的哈希值互不相同时,就说哈希表能直接寻址想要的结果。但这只是理想状态,在实际运用过程中,能够直接寻址结果的情况非常少。解决方法 具体参考这个篇博客 http://www.cnblogs.com/idreamo/p/8031120.html
java集合分析

这里写图片描述

  1. Collection 依赖(作为它的成员属性存在) Iterator 因为其继承了 Iterable这里写图片描述是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。
  2. List (存储一组不唯一且按插入顺序排序的对象,可以操作索引)常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。 注意 他的存储结构 分为顺序存储 和链式存储 底层就是数组和链表 其实栈的底层也是数组和链表 队列也是的。Vector是线程安全的,ArrayList、LinkedList都是线程不安全的*Vector是jdk1.0的产物被ArrayList替代了。长度需要增长时,Vector默认增长1倍,ArrayList增长1.5倍*
  3. Set (存储一组唯一且无序的对象)通过hashcode和equals函数保证唯一性,常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的 它是无序的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。它的存储结构底层是 哈希表和二叉树 HashSet是 哈希表所以无序 TreeSet是二叉树是唯一的 并用比较接口来确定的排序方式。 LinkedHashSet是哈希表加链表 哈希表来确定的唯一性 链表来确定的有序。他们都是线程不安全的
  4. Map(以键值对的形式存储元素,键是唯一的,也就是key)TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。HashTable是将键映射到hash表中相应的值 HashMap底层也是hash表 使用了HashTable。LinkedHashMap由哈希表实现元素的存储,由链表实现元素的顺序。 TreeMap由二叉树实现 确定了唯一 实现 Comparable接口,重写compareTo方法,提供对象排序的方式。底层还是hash表 二叉树 链表,只要底层是hash表的 必须重写hashcode 和equals方法(相当于hash函数的算法就是确定唯一性) 是二叉树的就要重写conmprator 排序的方法 还要注意Hashtable是早期的JDK提供的接口,HashMap是新版的JDK提供的接口,Hashtable是线程安全,HashMap线程非安全Hashtable不允许null键和值,HashMap允许null值
  5. Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。ListIterator,解决并发修改集合的问题 不允许在操作集合的时候再去修改集合元素
  6. Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。CopyOnWriteArrayList ConcurrentHashMap

下面有两张图 摘自网上:

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/shentanweilan9/article/details/80668851