Format's Notes

分享技术和生活


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索
close

jdk TreeMap工作原理分析

发表于 2016-04-07   |   分类于 jdk   |     |   阅读次数

TreeMap是jdk中基于红黑树的一种map实现。HashMap底层是使用链表法解决冲突的哈希表,LinkedHashMap继承自HashMap,内部同样也是使用链表法解决冲突的哈希表,但是额外添加了一个双向链表用于处理元素的插入顺序或访问访问。

既然TreeMap底层使用的是红黑树,首先先来简单了解一下红黑树的定义。

红黑树是一棵平衡二叉查找树,同时还需要满足以下5个规则:

  1. 每个节点只能是红色或者黑点
  2. 根节点是黑点
  3. 叶子节点(Nil节点,空节点)是黑色节点
  4. 如果一个节点是红色节点,那么它的两个子节点必须是黑色节点(一条路径上不能出现相邻的两个红色节点)
  5. 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点

红黑树的这些特性决定了它的查询、插入、删除操作的时间复杂度均为O(log n)。

阅读全文 »

jdk ArrayDeque工作原理分析

发表于 2016-04-03   |   分类于 jdk   |     |   阅读次数

ArrayDeque双向队列是jdk中列表的一种实现,支持元素在头和尾这两端进行插入和删除操作。

Deque接口(双向队列)的两个主要实现类是ArrayDeque和LinkedList。

其中ArrayDeque底层使用循环数组实现双向队列,而LinkedList是使用链表实现,之前在jdk LinkedList工作原理分析这篇文章中,已经分析过了LinkedList的实现原理,本文分析ArrayDeque的实现原理。

阅读全文 »

jdk HashSet, LinkedHashSet工作原理分析

发表于 2016-03-30   |   分类于 jdk   |     |   阅读次数

Set是一个没有包括重复数据的集合,跟List一样,他们都继承自Collection。

Java中的Set接口最主要的实现类就是HashSet和LinkedHashSet。

阅读全文 »

jdk LinkedHashMap工作原理分析

发表于 2016-03-29   |   分类于 jdk   |     |   阅读次数

LinkedHashMap是一种会记录插入顺序的Map,内部维护着一个accessOrder属性,用于表示map数据的迭代顺序是基于访问顺序还是插入顺序。

阅读全文 »

jdk HashMap工作原理分析

发表于 2016-03-29   |   分类于 jdk   |     |   阅读次数

Map是一个映射键和值的对象。类似于Python中的字典。

HashMap为什么会出现呢?

因为数组这种数据结构,虽然遍历简单,但是插入和删除操作复杂,需要移动数组内部的元素;链表这种数据结构,插入和删除操作简单,但是查找复杂,只能一个一个地遍历。

有没有一种新的数据结构,插入数据简单,同时查找也简单? 这个时候就出现了哈希表这种数据结构。 这是一种折中的方式,插入没链表快,查询没数组快。

wiki上就是这么定义哈希表的:

散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

阅读全文 »

jdk LinkedList工作原理分析

发表于 2016-03-27   |   分类于 jdk   |     |   阅读次数

List接口的实现类之一ArrayList的内部实现是一个数组,而另外一个实现LinkedList内部实现是使用双向链表。

LinkedList在内部定义了一个叫做Node类型的内部类,这个Node就是一个节点,链表中的节点,这个节点有3个属性,分别是元素item(当前节点要表示的值), 前节点prev(当前节点之前位置上的一个节点),后节点next(当前节点后面位置的一个节点)。

LinkedList关于数据的插入,删除操作都会处理这些节点的前后关系。而不像ArrayList那样只需要移动元素的位置即可。

阅读全文 »

jdk ArrayList工作原理分析

发表于 2016-03-27   |   分类于 jdk   |     |   阅读次数

list是一种有序的集合(an ordered collection), 通常也会被称为序列(sequence),使用list可以精确地控制每个元素的插入,可以通过索引值找到对应list中的各个项,也可以在list中查询元素。

以前的几段话摘自jdk文档的说明。

其实list就相当于一个动态的数组,也就是链表,普通的数组长度大小都是固定的,而list是一个动态的数组,当list的长度满了,再次插入数据到list当中的时候,list会自动地扩展它的长度。

阅读全文 »

Java线程池ThreadPoolExecutor源码分析

发表于 2016-03-22   |   分类于 java   |     |   阅读次数

ThreadPoolExecutor是jdk内置线程池的一个实现,基本上大部分情况都会使用这个线程池完成各项操作。

阅读全文 »

Java可重入锁ReentrantLock分析

发表于 2016-03-19   |   分类于 java   |     |   阅读次数


Java中的可重入锁ReentrantLock很常见,可以用它来代替内置锁synchronized,ReentrantLock是语法级别的锁,所以比内置锁更加灵活。

阅读全文 »

Java AtomicInteger原理分析

发表于 2016-03-16   |   分类于 java   |     |   阅读次数

Java中的AtomicInteger大家应该很熟悉,它是为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类。

阅读全文 »
1…567…13
Format

Format

《深入理解Spring Cloud与实战》正式开始售卖啦!

122 日志
27 分类
65 标签
RSS
GitHub Twitter Weibo
友情链接
  • Vangoleo
© 2020 Format
由 Hexo 强力驱动
主题 - NexT.Pisces