![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
_zh@xia
纵有疾风起,人生不言弃。
展开
-
ConcurrentHashMap 源码解析和设计思路
引导语当我们碰到线程不安全场景下,需要使用 Map 的时候,我们第一个想到的 API 估计就是 ConcurrentHashMap,ConcurrentHashMap 内部封装了锁和各种数据结构来保证访问 Map 是线程安全的,接下来我们一一来看下,和 HashMap 相比,多了哪些数据结构,又是如何保证线程安全的。1 类注释我们从类注释上大概可以得到如下信息:所有的操作都是线程安全的,...原创 2020-02-21 23:13:03 · 171 阅读 · 0 评论 -
CopyOnWriteArrayList 源码解析和设计思路
引导语在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征:线程安全的,多线程环境下可以直接使用,无需加锁...原创 2020-02-18 16:05:39 · 483 阅读 · 0 评论 -
简化工作:Guava Lists Maps 实际工作运用和源码
引导语在日常工作中,我们经常会使用一些三方的 API 来简化我们的工作,Guava 就是其中一种,Guava 是 Google 开源的技术框架,使用率高,社区活跃度也很高。本小节我们从工作中对 Guava 集合的使用入手,然后深入的看下其底层的实现,最后总结其设计思想,感兴趣的同学也可以下载源码学习,GitHub 地址:https://github.com/google/guava1 运用工...原创 2020-02-18 15:21:51 · 261 阅读 · 0 评论 -
差异对比:集合在 Java 7 和 8 有何不同和改进
引导语Java 8 在 Java 7 的基础上,做了一些改进和优化,但我们在平时工作中,或者直接升级到 Java 8 的过程中,我们好像无需做任何兼容逻辑,那么 Java 8 底层是如何处理的呢,在改进的同时,是如何优雅兼容 Java 老版本,让使用者无需感知,接下来我们通过对比 Java 7 和 8 的差异,来展示 Java 8 是如何优雅升级的。1 通用区别1.1 所有集合都新增了for...原创 2020-02-18 00:06:01 · 333 阅读 · 0 评论 -
彰显细节:看集合源码对我们实际工作的帮助和应用
本节中,我们先跳出源码的视角,来看看集合类的类图,看看在设计层面上,是否有可疑借鉴之处,接着通过源码来找找工作中的集合坑,提前扫雷。1 集合类图上图是目前我们已学的集合类图,大概可以看出以下几点:每个接口做的事情非常明确,比如 Serializable,只负责序列化,Cloneable 只负责拷贝,Map 只负责定义 Map 的接口,整个图看起来虽然接口众多,但职责都很清晰;复杂功能通过...原创 2020-02-17 15:10:36 · 125 阅读 · 0 评论 -
HashSet、TreeSet 源码解析
引导语HashSet、TreeSet 两个类是在 Map 的基础上组装起来的类,学习的侧重点主要在于 Set 是如何利用 Map 现有的功能,来达成自己的目标的,也就是说如何基于现有的功能进行创新,然后再看看一些改变的小细节是否值得学习。1 HashSet1.1 类注释看源码先看类注释上,可以得到的信息有:底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭...原创 2020-02-17 13:29:05 · 154 阅读 · 0 评论 -
Map源码会问哪些面试题
1 Map 整体数据结构类问题1.1 说一说 HashMap 底层数据结构答:HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,...原创 2020-02-17 12:59:47 · 212 阅读 · 0 评论 -
TreeMap 和 LinkedHashMap 核心源码解析
1 知识储备在了解 TreeMap 之前,先看下日常工作中排序的两种方式,两种方式的代码如下:public class TreeMapDemo { @Data // DTO 为我们排序的对象 class DTO implements Comparable<DTO> { private Integer id; public DTO(Integer id)...原创 2020-02-16 14:03:13 · 348 阅读 · 0 评论 -
红黑树与AVL树的区别
红黑树和AVL树都是从二叉搜索树进化而来的平衡二叉树。AVL树的特点一个节点的左右子数的高度差不大于1一个节点的左右子数都是平衡二叉树平衡二叉树满足二叉树所有的特点##AVL树的时间复杂度一颗n个结点的AVL树的平均搜索复杂度是O(logn)一颗n个结点的AVL树删除一个结点做平衡旋转的时间复杂度是O(logn)一颗n个结点的AVL树插入一个结点做平衡旋转的时间复杂度是O(l...原创 2020-02-16 00:28:03 · 408 阅读 · 0 评论 -
HashMap 源码解析
1 整体架构https://www.cnblogs.com/williamjie/p/9358291.htmlHashMap 底层的数据结构主要是:数组 + 链表 + 红黑树。其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑树的大小小于等于 6 时,红黑树会转化成链表,整体的数据结构如下:图中左边竖着的是 HashMap 的数组结构,数组的元素可能是单个 Node,也可能是个链表...原创 2020-02-14 16:15:18 · 118 阅读 · 0 评论 -
List 源码会问哪些面试题
1 面试题1.1 说说你自己对 ArrayList 的理解?ArrayList 底层数据结构是个数组,其 API 都做了一层对数组底层访问的封装,比如说 add 方法的过程是……(这里可以引用我们在 ArrayList 源码解析中 add 的过程)。说说你自己对 LinkedList 的理解也是一样。1.2 扩容类问题1.2.1 ArrayList 无参数构造器构造,现在 add 一个值...原创 2020-02-07 16:51:34 · 125 阅读 · 0 评论 -
LinkedList 源码解析
1 整体架构LinkedList 底层数据结构是一个双向链表,整体结构如下图所示:图片描述上图代表了一个双向链表结构,链表中的每个节点都可以向前或者向后追溯,我们有几个概念如下:链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置,next 属性,代表后一个节点的位置;first 是双向链表的头节点,它的前一个节点是 null。last 是双向链表的尾节...原创 2020-02-07 16:17:13 · 99 阅读 · 0 评论 -
ArrayList 源码解析和设计思路
1 整体架构ArrayList 整体架构比较简单,就是一个数组结构,比较简单图片描述图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数,elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:DEFAULT_CAPACITY 表示数组的初始大小,默认是 10,这个数字要记住;size 表示当前数组的大小,类型 int...原创 2020-02-06 23:23:50 · 110 阅读 · 0 评论 -
Arrays、Collections、Objects 常用方法源码解析
1 工具类通用的特征工具类通用的特征写法:构造器必须是私有的。这样的话,工具类就无法被 new 出来,因为工具类在使用的时候,无需初始化,直接使用即可,所以不会开放出构造器出来。工具类的工具方法必须被 static、final 关键字修饰。这样的话就可以保证方法不可变,并且可以直接使用,非常方便。注意: 尽量不在工具方法中,对共享变量有做修改的操作访问(如果必须要做的话,必须加锁),因...原创 2020-02-06 21:49:16 · 122 阅读 · 0 评论 -
Java 常用关键字
1 static意思是静态的、全局的,一旦被修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问,这时候需要注意并发读写的问题。1.1 修饰的对象static 只能修饰类变量、方法和方法块。当 static 修饰类变量时,如果该变量是 public 的话,表示该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.static 变量 这种形式访问即可。这时候我们非常需要注意的一...原创 2020-02-06 20:36:18 · 105 阅读 · 0 评论 -
new DecimalFormat("#0.###")中0与#
#与0的区别:#:没有则为空0:没有则补0 decimal decTemp = 2.1;System.out.println(decTemp.ToString("#0.00")); //输出2.10System.out.println(decTemp.ToString("#.##"));//输出2.1 ...原创 2019-02-19 20:39:59 · 1460 阅读 · 0 评论 -
排序算法
排序算法性能的对比 2.非比较排序(这些排序元素,因为其关键值本身就含有了定位特征,因而不需要比较就可以确定其前后位置,平均时间复杂度都是O(N).)(1)计数排序(2)基数排序 ...原创 2019-02-19 20:43:19 · 68 阅读 · 0 评论 -
TreeSet简单介绍与使用方法
TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>,Cloneable,java.io.Serializable接口。 一种基于TreeMap的NavigableSet实现。 因为TreeSet继承了Abstrac...转载 2019-02-20 13:10:05 · 205 阅读 · 0 评论 -
String类的indexOf方法的用法和举例
indexOf(int,ch) 先看第一个indexOf它返回值是int,在看它的参数(int,ch)意思就是使用者可以给参数一个‘char’字符所代表的int值,然后去从前向后找到该字符在字符串中第一次出现处的索引,当然了我们不可能记得住每一个char的值所以我们在使用时直接用String s=abcdef; int i=s.indexOf('d'); 这种方式就可以...原创 2019-02-20 13:23:32 · 4912 阅读 · 1 评论 -
看完你就会正则表达式了
1.什么是正则表达式正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。通俗的讲就是按照某种规则去匹配符合条件...转载 2019-02-20 21:12:52 · 156 阅读 · 0 评论 -
java实体类如果不重写toString方法,会如何?
先认识一下Object Object 类的 toString 方法 返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCod...原创 2019-02-20 21:55:42 · 911 阅读 · 0 评论 -
JVM内存模型与垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM。在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情况。在Java中JVM内置了垃圾回收的机制,帮助开发者承担对象的创建和释放的工作,极大的减轻了开发的负担。那是不是我们就不需要了解JVM了,显然在做一些优化或者深入研究应用性能的时候,JVM还是起了很关键的作用的。因此本篇就总结性的描述下JVM的内存模型与垃圾回收相关的知识。转载 2019-02-20 23:02:14 · 85 阅读 · 0 评论 -
super关键字
一、super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。1.1.super关键字测试package cn.galc.te...原创 2019-03-16 22:52:21 · 95 阅读 · 0 评论 -
Map集合的四种遍历方式
import java.util.HashMap;import java.util.Iterator;import java.util.Map;public class TestMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer...原创 2019-03-17 16:13:49 · 63 阅读 · 0 评论 -
instanceof关键字的理解
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。用法:result = object instanceof class参数:Result:布尔类型。Object:必选项。任意对象表达式。Class:必选项。任意已定义的对象类。说明:如果 obje...原创 2019-03-17 20:25:16 · 180 阅读 · 0 评论