克己的博客


  • 首页

  • 关于

  • 分类

  • 归档

  • 搜索

CurrentHashMap源码解析

发表于 2019-12-24 | 分类于 Java集合 | 阅读次数:

Lorem ipsum

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eu tempor dolor. Nulla hendrerit convallis purus et elementum. Suspendisse non magna vel justo tincidunt finibus. Nullam dui erat, malesuada eget viverra non, finibus a nisl.

Java集合之JDK1.8LinkedHashMap源码解析

发表于 2019-12-24 | 分类于 consectetur , malesuada | 阅读次数:

概览

LinkedHashMap实现了Map接口继承至HashMap,它在HashMap的基础上,通过一条双向链表是插入顺序和访问顺序保持一致。LinkedHashMap除了对双向链表的维护外,基本都是对HashMap的操作,所以在看LinkedHashMap源码之前,强烈建议先看看HashMap的源码,可以参考我的这一篇:Java集合之HashMap源码解析(JDK8)

本篇文章不会再详细解析HashMap的东西,将重点放在LinkedHashMap对双向链表的维护上。

构造函数

照例从创建LinkedHashMap对象说起,已此为起点,一步步解开LinkedHashMap的神秘面纱。

1
2
3
4
5
 LinkedHashMap() 使用默认初始容量16和默认加载因子0.75创建一个LinkedHashMap
 LinkedHashMap(int initialCapacity) 使用自定义初始容量和默认加载因子0.75创建一个LinkedHashMap
 LinkedHashMap(int initialCapacity, float loadFactor) 使用自定义初始容量和自动以加载因子创建一个LinkedHashMap
 LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 使用自定义初始容量和自动以加载因子创建一个LinkedHashMap,并且可以设置accessOrder,accessOrder为true,调用get方法会改变内部结构,这一点后面会细讲
 LinkedHashMap(Map<? extends K,? extends V> m) 使用Map子类实例创建一个LinkedHashMap
阅读全文 »

Lorem ipsum

发表于 2019-12-24 | 分类于 consectetur , malesuada | 阅读次数:

Nulla euismod, vitae aliquet orci eleifend.

Lorem ipsum

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eu tempor dolor. Nulla hendrerit convallis purus et elementum. Suspendisse non magna vel justo tincidunt finibus. Nullam dui erat, malesuada eget viverra non, finibus a nisl.

Sharding-JDBC源码解析

发表于 2019-12-24 | 分类于 Sharding-JDBC | 阅读次数:

最近在工作中使用Sharding-JDBC做了分库分表,目前项目已经上线稳定运行,闲暇之余看下源码。

版本:4.0.0-RC1

由于现在基本都是springboot,而Sharding-Sphere也提供了SpringBoot的包,所以先看看sharding-jdbc-spring-boot-starter的源码,maven坐标:


org.apache.shardingsphere
sharding-jdbc-spring-boot-starter
${sharding-sphere.version}

<sharding-sphere.version>4.0.0-RC1</sharding-sphere.version>

java面试宝典

发表于 2019-12-24 | 分类于 面试 | 阅读次数:

前言 做好面试前的准备工作

第一部分 Java基础

关键字

static

static 关键字的作用?

static关键字可以让我们在不创建对象的情况下访问方法或变量。static除了可以修饰方法和变量外,还有static代码块,以及修饰内部类。被static修饰的数据,在内存中只会存在一份。合理利用static合理提升程序性能

阅读全文 »

事务特性以及Mysql事务的实现

发表于 2019-06-18 | 分类于 mysql | 阅读次数:

事务特性

事务是数据库区别于文件系统的重要特征之一。事务用来保证数据库的完整性–要么都做修改,要么都不做。同时,事务有严格的定义,它必须同时满足四个特性。

原子性

原子性是指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作执行都成功,才算整个事务成功。如果事务中任何一个SQL语句执行失败,那么已经执行 成功的SQL语句也必须撒销,数据库状态应该退回到执行事务前的状态。

一致性(consistency)

一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务 结束以后,数据库的完整性约束没有被破坏。

隔离性(isolation)

一个事务的影响在该事务提交前对其他事务都不可见——这通过锁来实现

持久性(durability)

事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。

阅读全文 »

HashMap源码解析

发表于 2019-06-01 | 分类于 集合 , HashMap | 阅读次数:

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK8的HashMap源码进行分析。

什么是哈希表

在讨论哈希表之前,我们先大概了解下其他数据结构

  数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)

  线性链表:对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)

  二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。

  哈希表:相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。

阅读全文 »

Java数据结构:树(Tree)

发表于 2019-06-01 | 分类于 数据结构 | 阅读次数:

Java数据结构:树(Tree)

计算机科学中的树

在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点都只有有限个子节点或无子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
  • 树里面没有环路(cycle)

阅读全文 »

Java数据结构:二叉树与二叉搜索树

发表于 2019-06-01 | 分类于 数据结构 | 阅读次数:

Java数据结构:二叉树与二叉搜索树

上一篇介绍了树这种数据结构,并用Java代码使用链表实现了树。,接下来介绍树的其中一种特例,二叉树。

在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。

二叉树的第 层至多拥有 个节点;深度为 的二叉树至多总共有个节点(定义根节点所在深度 ),而总计拥有节点数匹配的,称为“满二叉树”;深度为 有个节点的二叉树,当且仅当其中的每一节点,都可以和同样深度的满二叉树,序号为1到的节点一对一对应时,称为完全二叉树。对任何一棵非空的二叉树,如果其叶片(终端节点)数为 title,分支度为2的节点数为 title,则 title。

与普通树不同,普通树的节点个数至少为1,而二叉树的节点个数可以为0;普通树节点的最大分支度没有限制,而二叉树节点的最大分支度为2;普通树的节点无左、右次序之分,而二叉树的节点有左、右次序之分。

二叉树通常作为数据结构应用,典型用法是对节点定义一个标记函数,将一些值与每个节点相关系。这样标记的二叉树就可以实现二叉搜索树和二叉堆,并应用于高效率的搜索和排序。

阅读全文 »

Java数据结构:数组

发表于 2019-06-01 | 分类于 数据结构 | 阅读次数:

Java数据结构:数组

数组是什么

在计算机科学中,数组数据结构(英语:array data structure),简称数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。

Java中的数组

在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是为这种速度所付出代价是数组对象大小被固定,并且在其声明周期中不可改变。

数组内的元素既可以是基本数据类型,也可以是引用数据类型。区别在于对象数据保存的是引用,基本类型数组直接保存基本类型的值。

阅读全文 »
123
克己

克己

有志,则不甘为下流;有识,则知学问无尽;有恒,则断无不成之事

26 日志
23 分类
10 标签
© 2019 克己