2 _zh@xia

尚未进行身份认证

纵有疾风起,人生不言弃。

等级
TA的排名 13w+

CopyOnWriteArrayList 源码解析和设计思路

引导语在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征:线程安全的,多线程环境下可以直接使用,无需加锁...

2020-02-18 16:05:39

简化工作:Guava Lists Maps 实际工作运用和源码

引导语在日常工作中,我们经常会使用一些三方的 API 来简化我们的工作,Guava 就是其中一种,Guava 是 Google 开源的技术框架,使用率高,社区活跃度也很高。本小节我们从工作中对 Guava 集合的使用入手,然后深入的看下其底层的实现,最后总结其设计思想,感兴趣的同学也可以下载源码学习,GitHub 地址:https://github.com/google/guava1 运用工...

2020-02-18 15:21:51

差异对比:集合在 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

彰显细节:看集合源码对我们实际工作的帮助和应用

本节中,我们先跳出源码的视角,来看看集合类的类图,看看在设计层面上,是否有可疑借鉴之处,接着通过源码来找找工作中的集合坑,提前扫雷。1 集合类图上图是目前我们已学的集合类图,大概可以看出以下几点:每个接口做的事情非常明确,比如 Serializable,只负责序列化,Cloneable 只负责拷贝,Map 只负责定义 Map 的接口,整个图看起来虽然接口众多,但职责都很清晰;复杂功能通过...

2020-02-17 15:10:36

HashSet、TreeSet 源码解析

引导语HashSet、TreeSet 两个类是在 Map 的基础上组装起来的类,学习的侧重点主要在于 Set 是如何利用 Map 现有的功能,来达成自己的目标的,也就是说如何基于现有的功能进行创新,然后再看看一些改变的小细节是否值得学习。1 HashSet1.1 类注释看源码先看类注释上,可以得到的信息有:底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭...

2020-02-17 13:29:05

Map源码会问哪些面试题

1 Map 整体数据结构类问题1.1 说一说 HashMap 底层数据结构答:HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,...

2020-02-17 12:59:47

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

红黑树与AVL树的区别

红黑树和AVL树都是从二叉搜索树进化而来的平衡二叉树。AVL树的特点一个节点的左右子数的高度差不大于1一个节点的左右子数都是平衡二叉树平衡二叉树满足二叉树所有的特点##AVL树的时间复杂度一颗n个结点的AVL树的平均搜索复杂度是O(logn)一颗n个结点的AVL树删除一个结点做平衡旋转的时间复杂度是O(logn)一颗n个结点的AVL树插入一个结点做平衡旋转的时间复杂度是O(l...

2020-02-16 00:28:03

HashMap 源码解析

1 整体架构https://www.cnblogs.com/williamjie/p/9358291.htmlHashMap 底层的数据结构主要是:数组 + 链表 + 红黑树。其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑树的大小小于等于 6 时,红黑树会转化成链表,整体的数据结构如下:图中左边竖着的是 HashMap 的数组结构,数组的元素可能是单个 Node,也可能是个链表...

2020-02-14 16:15:18

24. 两两交换链表中的节点

题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3. public ListNode swapPairs(ListNode head) { ListNode pre = new ListNod...

2020-02-10 22:45:34

19. 删除链表的倒数第N个节点

题目描述给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.解题思路一开始就让fast指针比slow指针快n+1个元素,接下来,两个指针都是一步一步来往下走。那么当fast指针走完时,slow指针就刚刚好停...

2020-02-10 21:25:21

141. 环形链表

题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。解题思路把链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道中,两个人有速度差,那么迟早两个人会相遇,只要相遇那么就说明有环。 public boolean hasCycle(L...

2020-02-10 21:17:56

876. 链表的中间结点

题目描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。方法一按顺序将每个结点放入数组 A 中。然后中间结点就是 A[A.Length/2]class Solution { public ListNode middleNode(ListNode head) { ListNode[] A = new List...

2020-02-10 21:09:46

Shiro初学记录

Shiro五大功能认证:用户身份认证,也就是登陆;授权-访问控制:通过一些配置,用户登录后会自动被赋予相应的身份和操作权限,实现访问控制;密码加密-保护或隐藏数据防止被偷窥;会话管理缓存Shrio与SpringSecurity对比Spring Security:除了不能脱离Spring,shiro具有的功能它都有,权限细粒度高,还提供许多其它的功能(笔者没用过,具体哪些功能不清...

2020-02-08 20:31:54

SpringBoot整合Shiro实现RememberMe

接上Springboot Shiro实现用户验shiro提供了RememberMe功能,用户登录状态不会因为浏览器的关闭而失效,知道cookie过期更改ShiroConfig加入cookie管理配置/*** cookie对象* @return*/public SimpleCookie rememberMeCookie() { // 设置cookie名称,对应login.htm...

2020-02-08 18:19:47

Springboot Shiro实现用户验证

添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency&gt...

2020-02-08 17:27:57

Shiro内置过滤器

Filter NameClassDescriptionanonorg.apache.shiro.web.filter.authc.AnonymousFilter匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例/static/**=anonauthcorg.apache.shiro.web.filter.authc.FormAuthenticationF...

2020-02-08 17:26:51

List 源码会问哪些面试题

1 面试题1.1 说说你自己对 ArrayList 的理解?ArrayList 底层数据结构是个数组,其 API 都做了一层对数组底层访问的封装,比如说 add 方法的过程是……(这里可以引用我们在 ArrayList 源码解析中 add 的过程)。说说你自己对 LinkedList 的理解也是一样。1.2 扩容类问题1.2.1 ArrayList 无参数构造器构造,现在 add 一个值...

2020-02-07 16:51:34

LinkedList 源码解析

1 整体架构LinkedList 底层数据结构是一个双向链表,整体结构如下图所示:图片描述上图代表了一个双向链表结构,链表中的每个节点都可以向前或者向后追溯,我们有几个概念如下:链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置,next 属性,代表后一个节点的位置;first 是双向链表的头节点,它的前一个节点是 null。last 是双向链表的尾节...

2020-02-07 16:17:13

ArrayList 源码解析和设计思路

1 整体架构ArrayList 整体架构比较简单,就是一个数组结构,比较简单图片描述图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数,elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:DEFAULT_CAPACITY 表示数组的初始大小,默认是 10,这个数字要记住;size 表示当前数组的大小,类型 int...

2020-02-06 23:23:50

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周上午根据用户上周周三的博文发布情况由系统自动颁发。