- 博客(76)
- 收藏
- 关注
原创 ConcurrentHashMap 源码解析和设计思路
引导语当我们碰到线程不安全场景下,需要使用 Map 的时候,我们第一个想到的 API 估计就是 ConcurrentHashMap,ConcurrentHashMap 内部封装了锁和各种数据结构来保证访问 Map 是线程安全的,接下来我们一一来看下,和 HashMap 相比,多了哪些数据结构,又是如何保证线程安全的。1 类注释我们从类注释上大概可以得到如下信息:所有的操作都是线程安全的,...
2020-02-21 23:13:03
178
原创 CopyOnWriteArrayList 源码解析和设计思路
引导语在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征:线程安全的,多线程环境下可以直接使用,无需加锁...
2020-02-18 16:05:39
489
原创 简化工作:Guava Lists Maps 实际工作运用和源码
引导语在日常工作中,我们经常会使用一些三方的 API 来简化我们的工作,Guava 就是其中一种,Guava 是 Google 开源的技术框架,使用率高,社区活跃度也很高。本小节我们从工作中对 Guava 集合的使用入手,然后深入的看下其底层的实现,最后总结其设计思想,感兴趣的同学也可以下载源码学习,GitHub 地址:https://github.com/google/guava1 运用工...
2020-02-18 15:21:51
266
原创 差异对比:集合在 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
342
原创 彰显细节:看集合源码对我们实际工作的帮助和应用
本节中,我们先跳出源码的视角,来看看集合类的类图,看看在设计层面上,是否有可疑借鉴之处,接着通过源码来找找工作中的集合坑,提前扫雷。1 集合类图上图是目前我们已学的集合类图,大概可以看出以下几点:每个接口做的事情非常明确,比如 Serializable,只负责序列化,Cloneable 只负责拷贝,Map 只负责定义 Map 的接口,整个图看起来虽然接口众多,但职责都很清晰;复杂功能通过...
2020-02-17 15:10:36
131
原创 HashSet、TreeSet 源码解析
引导语HashSet、TreeSet 两个类是在 Map 的基础上组装起来的类,学习的侧重点主要在于 Set 是如何利用 Map 现有的功能,来达成自己的目标的,也就是说如何基于现有的功能进行创新,然后再看看一些改变的小细节是否值得学习。1 HashSet1.1 类注释看源码先看类注释上,可以得到的信息有:底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭...
2020-02-17 13:29:05
161
原创 Map源码会问哪些面试题
1 Map 整体数据结构类问题1.1 说一说 HashMap 底层数据结构答:HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,...
2020-02-17 12:59:47
215
原创 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
356
原创 红黑树与AVL树的区别
红黑树和AVL树都是从二叉搜索树进化而来的平衡二叉树。AVL树的特点一个节点的左右子数的高度差不大于1一个节点的左右子数都是平衡二叉树平衡二叉树满足二叉树所有的特点##AVL树的时间复杂度一颗n个结点的AVL树的平均搜索复杂度是O(logn)一颗n个结点的AVL树删除一个结点做平衡旋转的时间复杂度是O(logn)一颗n个结点的AVL树插入一个结点做平衡旋转的时间复杂度是O(l...
2020-02-16 00:28:03
416
原创 HashMap 源码解析
1 整体架构https://www.cnblogs.com/williamjie/p/9358291.htmlHashMap 底层的数据结构主要是:数组 + 链表 + 红黑树。其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑树的大小小于等于 6 时,红黑树会转化成链表,整体的数据结构如下:图中左边竖着的是 HashMap 的数组结构,数组的元素可能是单个 Node,也可能是个链表...
2020-02-14 16:15:18
126
原创 24. 两两交换链表中的节点
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3. public ListNode swapPairs(ListNode head) { ListNode pre = new ListNod...
2020-02-10 22:45:34
83
原创 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
111
原创 141. 环形链表
题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。解题思路把链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道中,两个人有速度差,那么迟早两个人会相遇,只要相遇那么就说明有环。 public boolean hasCycle(L...
2020-02-10 21:17:56
236
原创 876. 链表的中间结点
题目描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。方法一按顺序将每个结点放入数组 A 中。然后中间结点就是 A[A.Length/2]class Solution { public ListNode middleNode(ListNode head) { ListNode[] A = new List...
2020-02-10 21:09:46
73
原创 Shiro初学记录
Shiro五大功能认证:用户身份认证,也就是登陆;授权-访问控制:通过一些配置,用户登录后会自动被赋予相应的身份和操作权限,实现访问控制;密码加密-保护或隐藏数据防止被偷窥;会话管理缓存Shrio与SpringSecurity对比Spring Security:除了不能脱离Spring,shiro具有的功能它都有,权限细粒度高,还提供许多其它的功能(笔者没用过,具体哪些功能不清...
2020-02-08 20:31:54
147
原创 SpringBoot整合Shiro实现RememberMe
接上Springboot Shiro实现用户验shiro提供了RememberMe功能,用户登录状态不会因为浏览器的关闭而失效,知道cookie过期更改ShiroConfig加入cookie管理配置/*** cookie对象* @return*/public SimpleCookie rememberMeCookie() { // 设置cookie名称,对应login.htm...
2020-02-08 18:19:47
1983
原创 Springboot Shiro实现用户验证
添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>...
2020-02-08 17:27:57
224
原创 Shiro内置过滤器
Filter NameClassDescriptionanonorg.apache.shiro.web.filter.authc.AnonymousFilter匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例/static/**=anonauthcorg.apache.shiro.web.filter.authc.FormAuthenticationF...
2020-02-08 17:26:51
742
原创 List 源码会问哪些面试题
1 面试题1.1 说说你自己对 ArrayList 的理解?ArrayList 底层数据结构是个数组,其 API 都做了一层对数组底层访问的封装,比如说 add 方法的过程是……(这里可以引用我们在 ArrayList 源码解析中 add 的过程)。说说你自己对 LinkedList 的理解也是一样。1.2 扩容类问题1.2.1 ArrayList 无参数构造器构造,现在 add 一个值...
2020-02-07 16:51:34
132
原创 LinkedList 源码解析
1 整体架构LinkedList 底层数据结构是一个双向链表,整体结构如下图所示:图片描述上图代表了一个双向链表结构,链表中的每个节点都可以向前或者向后追溯,我们有几个概念如下:链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置,next 属性,代表后一个节点的位置;first 是双向链表的头节点,它的前一个节点是 null。last 是双向链表的尾节...
2020-02-07 16:17:13
109
原创 ArrayList 源码解析和设计思路
1 整体架构ArrayList 整体架构比较简单,就是一个数组结构,比较简单图片描述图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数,elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:DEFAULT_CAPACITY 表示数组的初始大小,默认是 10,这个数字要记住;size 表示当前数组的大小,类型 int...
2020-02-06 23:23:50
118
原创 Arrays、Collections、Objects 常用方法源码解析
1 工具类通用的特征工具类通用的特征写法:构造器必须是私有的。这样的话,工具类就无法被 new 出来,因为工具类在使用的时候,无需初始化,直接使用即可,所以不会开放出构造器出来。工具类的工具方法必须被 static、final 关键字修饰。这样的话就可以保证方法不可变,并且可以直接使用,非常方便。注意: 尽量不在工具方法中,对共享变量有做修改的操作访问(如果必须要做的话,必须加锁),因...
2020-02-06 21:49:16
130
原创 Java 常用关键字
1 static意思是静态的、全局的,一旦被修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问,这时候需要注意并发读写的问题。1.1 修饰的对象static 只能修饰类变量、方法和方法块。当 static 修饰类变量时,如果该变量是 public 的话,表示该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.static 变量 这种形式访问即可。这时候我们非常需要注意的一...
2020-02-06 20:36:18
113
原创 206. 反转链表
题目描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解题思路假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储...
2020-02-04 16:13:09
67
原创 242. 有效的字母异位词
题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true说明:你可以假设字符串只包含小写字母。方法一:解题思路将两字符串转换成字符串数组,然后将两数组排序,在比较是否一致class Solution { public boolean isAnagram(...
2020-02-04 15:37:54
82
原创 344.反转字符串
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符示例 1:输入:[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]解题思路创建两个指...
2020-02-03 23:48:55
92
原创 Spring注解
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484374&idx=2&sn=b40072b413353cc7898da112cbb3e6e9&chksm=fc2fbfdecb5836c8a310f776ebf024e93002e0afd64bd7bc3f33b84e02a11afe145a864...
2020-01-21 15:35:23
253
原创 @Param的使用
@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。不使用@Param的情况当存在多个参数时,可使用Map接口:public List<Student> findStudentByMap(Map&...
2020-01-21 15:21:56
475
原创 SpingBoot异步执行
示例:springboot启动类加上@EnableAsync注解,异步线程任务开关异步任务:@Componentpublic class TestAsyncTask { @Async public Future<String> doTask1() throws Exception { long start = System.currentTim...
2020-01-16 15:56:02
160
原创 SpringBoot整合定时任务task
SpringBoot启动类上加上@EnableScheduling。启动定时任务,他会自动扫描包里带有@Scheduled注解的任务@SpringBootApplication//打开定时任务@EnableSchedulingpublic class DemoApplication{...}示例@Componentpublic class TestTask { privat...
2020-01-16 14:59:53
138
原创 SpringBoot集成JUnit单元测试
添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependen...
2020-01-16 14:25:22
230
原创 Mybatis动态SQL
{}与 $ {}的区别#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。${}将传入的数据直接显示生成在sql中。如:order by useriduser_iduserid,如果传入的值...
2020-01-14 23:43:53
99
原创 Mybatis之collection与association标签
CREATE TABLE teacher ( id INT(10) NOT NULL, name VARCHAR(30) DEFAULT NULL, PRIMARY KEY (id)) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO teacher(id, name) VALUES (1, '秦老师'); CREATE TABLE ...
2020-01-14 23:40:28
294
原创 SpringBoot使用Mybatis generator自动生成文件
添加依赖 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3....
2020-01-14 22:50:05
230
原创 SpringBoot2整合Mybatis
Springboot整合Mybatis有两种常用方式:一种是常见的XML方式,一种是全注解准备使用的是mysql5.7添加Mybaits依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s...
2020-01-14 20:17:13
131
原创 SpringBoot发送Email
org.springframework.mail.javamail.JavaMailSender,其提供了许多简单易用的方法,可发送简单的邮件、HTML格式的邮件、带附件的邮件,并且可以创建邮件模板。添加依赖 <dependency> <groupId>org.springframework.boot</groupId>...
2020-01-13 21:39:02
262
1
原创 SpringBoot整合Thymeleaf
为何使用Thymeleaf如果希望以 Jar 形式发布模块则尽量不要使用 JSP 相关知识,这是因为 JSP 在内嵌的 Servlet 容器上运行有一些问题 (内嵌 Tomcat、 Jetty 不支持 Jar 形式运行 JSP,Undertow 不支持 JSP)。ThymeLeaf常用表达式、标签和函数常用表达式• ${...}变量表达式。•* { .. . } 选择表达式。• #...
2020-01-13 16:41:38
142
原创 SpringBoot继承Devtools实现热部署
添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>tr...
2020-01-12 16:13:47
121
原创 SpringBoot整合Swagger2实现RESTful风格
SpringBoot整合Swagger2实现RESTful风格描述传统请求方法RESTful请求方法查询/user/query?name=xGET/user?name=xGET详情/user/getInfo?id=1GET/user/1GET创建/user/create?name=xPOST/userPOST修改/user/u...
2020-01-12 12:52:46
210
原创 二十四:二叉树仲和为某一值得路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(import java.util.*;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null...
2019-04-11 11:57:52
174
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人