码出高效读书笔记:数据结构概要

1、数据结构

1.1数据结构定义

数据结构是指逻辑意义上的数据组织方式及其相应的处理方式

  1. 逻辑意义:比如说,二叉树在磁盘中的存储真的是树形排列的吗?并非如此,树的存储可能是基于物理上的顺序存储方式,可以理解为一个格子一个格子连续地放,设想有7个节点的二叉树,第一个格子放根节点,第二个格子放左子树的根节点;并且根据引用知道左叶子在后续的哪个格子里;第三个格子放右子树根节点,依此类推。此外,树的存储也可能是基于物理上的链式存储方式。
  2. 数据组织方式:逻辑意义上的组织方式有很多,比如树、图、队列、哈希等。树可以是二叉树、三叉树、B+树等;图可以是有向图或无向图;队列是先进先出的线性结构;哈希是根据某种算法直接定位的数据组织方式。
  3. 数据处理方式:在既定的数据组织方式上,以某种特定的算法实现数据的增加、删除、修改、查找和遍历。不同的数据处理方式往往存在着非常大的性能差异。

1.2数据结构分类

从直接前继和直接后继个数的维度来看,大体可以将数据结构分为以下四类:

  1. 线性结构:0至1个直接前继和直接后继。当线性结构为空时,有唯一的首元素和尾元素,除了这两者外,所有元素都有唯一的直接前继和直接后继。线性结构包括:顺序表、链表、栈、队列。其中栈和队列是访问受限的结构。栈是先进后出,即Last-In,First-Out,简称LIFO。队列是先进先出,即First-In,First-Out,简称FIFO。
  2. 树结构:0至1个直接前继和0至n个直接后继(n大于或等于2)。由于树的机构比较稳定和均衡,在计算机领域中得到广泛的应用。
  3. 图结构:0至n个直接前继和直接后继(n大于或等于2)。图的结构包括简单吐、多重图、有向图和无向图等。
  4. 哈希结构:没有直接前继和直接后继。哈希结构通过某种特定的哈希函数将索引和存储的值关联起来,它是一种查找效率非常高的数据结构。

2、集合框架图

Java中的结合是用于存储对象的工具类容器,它实现了常用的数据结构,提供了一系列公开的方法用于增加、删除、修改、查找和遍历数据,降低了日常开发成本。集合的种类非常多,形成了一个比较经典的继承关系书,称为Java集合框架图,如下图所示。

框架图中主要分为两类,这两类集合体系无论是数据存取还是遍历,都存在非常大的差异:

  1. 按照单个元素存储的Collection,在继承树种Set和List都实现了Collection接口。
  2. 按照Key-Value存储的Map。

  • 红色代表接口
  • 蓝色代表抽象类
  • 绿色代表并发包中的类
  • 灰色代表早期线程安全的类(基本已经废弃)

   3、常用集合类型

3.1 List集合

List集合是线性数据结构的主要实现,集合元素通常存在明确的上一个和下一个元素,也存在明确的第一个元素和最后一个元素。List集合的遍历结果是稳定的。该体系中,最常用的是ArrayList和LinkedList两个集合类。

  • ArrayList是容量可以改变的非线程安全集合。内部实现使用数组进行存储,集合扩容时会创建更大的数据空间,把原有的数据复制到新数组中。ArrayList支持对元素的快速随机访问,但是插入与删除速度通常很慢,因为这个过程很有可能需要移动其他元素。
  • LinkedList的本质是双向链表。与ArrayList相比,LinkedList的插入和删除速度更快,但是随机访问速度则很慢。测试表明,对于十万条的数据,与ArrayList相比,随机提取元素时存在数百倍的差距。除继承AbstractList这个抽象类外,LinkedList还实现了另一个接口Deque,即double-ended queue。这个接口同时具有队列和栈的性质。                                                    LinkedList包含3个重要成员:size、first、last。size是双向链表中节点的个数,first和last分别指向第一个和最后一个节点的引用。LinkedList的优点在于可以将零散的内存单元通过附加引用的方式关联起来,形成按链路顺序查找的线性结构,内存利用率较高。

3.2 Queue(队列)集合

Queue(队列)是一种先进先出的数据结构,队列是一种特殊的线性表,它只允许在表的一段进行获取操作,在表的另一端进行插入操作。当队列中没有元素时,成为空队列。自从BlockingQueue(阻塞队列)问世以来,队列的地位得到极大的提升,在各种高并发编程场景中,由于其本身FIFO(先进先出)的特性和阻塞操作的特点,经常被作为Buffer(数据缓冲区)使用。

3.3 Map集合

Map集合是以Key-Value键值对作为存储元素实现的哈希结构,Key按某种哈希函数计算后是唯一的,Value则是可以重复的。Map类提供三种Collection视图,在集合框架图中,Map指向Collection的箭头仅表示两个类之间的依赖关系,可以使用KeySet()查看所有的Key,使用values()查看所有的Value,使用entrySet()查看所有的键值对。

最早用于存储键值对的HashTable因为性能瓶颈已经被淘汰了,而如今广泛使用的HashMap,线程是不安全的。ConcurrentHashMap是线程安全的,在JDK8中进行了锁的大幅度优化,体现出不错的性能,在多线程并发场景中,优先推荐使用ConcurrentHashMap,而不是HashMap。TreeMap是Key有序的Map类集合。

3.4 Set集合

Set是不允许出现重复元素的集合类型。Set体系最常用的是HashSet、TreeSet和LinkedHashSet三个集合类。

  • HashSet从源码分析是使用HashMap来实现的,只是Value固定为一个静态对象,使用Key保证集合元素的唯一性,但它不保证集合元素的顺序。
  • TreeSet从源码分析是使用TreeMap来实现的,底层为树结构,在添加新元素到集合中时,按照某种比较规则将其插入合适的位置,保证插入后的集合仍然是有序的。
  • LinkedHashSet继承自HashSet,具有HashSet的优点,内部使用链表维护了元素插入顺序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值