
面经
文章平均质量分 86
章全蛋
这个作者很懒,什么都没留下…
展开
-
Java 垃圾回收机制及算法
Java 垃圾回收机制及算法垃圾回收概述什么是垃圾回收说起垃圾收集(Garbage Collection, 下文简称 GC) , 有不少人把这项技术当作 Java 语言的伴生产物。 事实上,垃圾收集的历史远远比 Java 久远, 在1960年诞生于麻省理工学院的 Lisp 是第一门开始使用内存动态分配和垃圾收集技术的语言。垃圾收集需要完成的三件事情:哪些内存需要回收?什么时候回收?如何回收?Java 垃圾回收的优缺点优点:不需要考虑内存管理可以有效的防止内存泄露,有效地利用可使原创 2021-09-22 14:30:47 · 735 阅读 · 0 评论 -
Thread 线程面试题
Thread 线程面试题线程创建有几种实现方式主要有三种,分为两大类:子线程没有返回值、子线程有返回值。无返回值的线程有两种写法,第一种是继承 Thread,可以这么写:class MyThread extends Thread{ @Override public void run() { log.info(Thread.currentThread().getName()); }}@Testpublic void extendThreadInit(){原创 2021-07-09 14:53:46 · 587 阅读 · 0 评论 -
Future、ExecutorService 源码解析
Future、ExecutorService 源码解析Thread 或者 Runnable 方法开启的线程是没有返回值,如果我们需要子线程计算,取得结果后返回,可以用 Callable。整体架构关于线程 API 之间关系的依赖图:我们首先看一个 demo,这个场景说的是我们往线程池里面提交一个有返回值的线程,代码如下:public static void main(String[] args) throws ExecutionException, InterruptedException {原创 2021-07-09 11:19:38 · 233 阅读 · 2 评论 -
Thread 源码解析
Thread 源码解析类注释每个线程都有优先级,高优先级的线程可能会优先执行;父线程创建子线程后,优先级、是否是守护线程等属性父子线程是一致的;JVM 启动时,通常都启动 main 非守护线程,以下任意一个情况发生时,线程就会停止:退出方法被调用,并且安全机制允许这么做(比如调用 Thread.interrupt 方法)所有非守护线程都消亡,或者从允许的服正常返回,或者允许的方法抛出了异常;每个线程都有名字,多个线程可能具有相同的名字,Thread 有的构造器如果没有指定名字,会自动生原创 2021-07-08 15:17:31 · 553 阅读 · 0 评论 -
ArrayBlockingQueue 源码解析
ArrayBlockingQueue 源码解析ArrayBlockingQueue。按照字面翻译,中文叫做数组阻塞队列,从名称上看,我们就比较清楚此阻塞队列底层使用的是数组。一说到数组,大家可能会想到 ArrayList 和 HashMap,举新增场景来说 ArrayList 通过 size ++ 找到新增的数组下标位置,HashMap 通过 hash 算法计算出下标位置,那么 ArrayBlockingQueue 是不是也是这两种方法呢?都不是,ArrayBlockingQueue 使用的是一种非常奇妙原创 2021-07-02 16:13:54 · 366 阅读 · 1 评论 -
LinkedBlockingQueue 源码解析
LinkedBlockingQueue 源码解析说到队列,大家的反应可能是我从来都没有用过,应该不是重要的 API 吧。其实,我们平时使用到的线程池、读写锁、消息队列等等技术和框架,底层都是队列。队列是很多高级 API 的基础,学好队列,对自己深入学习 Java 非常重要。本文主要以 LinkedBlockingQueue 队列为例,详细描述一下底层具体的实现。整体架构LinkedBlockingQueue 直译过来做链表阻塞队列,从命名上就知道其底层数据结构是链表,并且队列是可阻塞的。类图从原创 2021-06-29 20:28:22 · 256 阅读 · 1 评论 -
并发 List、Map 面试题
并发 List、Map 面试题CopyOnWriteArrayList和 ArrayList 相比有什么相同点和不同点相同点:底层数据结构都是数组不同点:CopyOnWriteArrayList 是线程安全的,在多线程环境下使用,无需加锁,可直接使用CopyOnWriteArrayList 通过哪些手段保证了线程安全数组容器用 volatile 关键字修饰,保证了数组内存地址被任意线程修改后,都会通知到其他线程所有对数组的修改操作,都采用 ReentrantLock 加锁,保原创 2021-06-28 16:12:48 · 164 阅读 · 0 评论 -
ConcurrentHashMap 源码解析和设计思路
ConcurrentHashMap 源码解析和设计思路当我们碰到线程不安全场景下,需要使用 Map 的时候,我们第一个想到的 API 估计就是 ConcurrentHashMap,ConcurrentHashMap 内部封装了锁和各种数据结构来保证访问 Map 是线程安全的,接下来我们一一来看下,和 HashMap 相比,多了哪些数据结构,又是如何保证线程安全的。类注释我们从类注释上可以得到如下信息:所有的操作都是线程安全的,我们在使用时,无需再加锁多个线程同时进行 put、remove 等操作原创 2021-06-25 16:25:14 · 148 阅读 · 1 评论 -
CopyOnWriteArrayList 源码解析和设计思路
CopyOnWriteArrayList 源码解析和设计思路在 ArrayList 的类注释中,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征:线程安全的,多线程环境下可以直接使用,无需加锁通过锁 + 数组拷贝 + volatile 关键字保证了原创 2021-06-22 15:47:23 · 198 阅读 · 0 评论 -
集合面试题
集合面试题线程安全我们说集合都是非线程安全的,这里说的非线程安全指的是集合类作为共享变量,被多线程读写的时候,才会线程不安全。如果要实现线程安全的集合,JDK 推荐我们使用 Collections.synchronized* 类,Collections 帮我们实现了 List、Set、Map 对应的线程安全的方法:图中实现了各种集合类型的线程安全的方法,我们以 SynchronizedList 为例,从源码上来看下,Collections 是如何实现线程安全的:static class Synch原创 2021-06-22 14:30:41 · 163 阅读 · 0 评论 -
Map源码会问哪些面试题
Map源码会问哪些面试题Map 整体数据结构类问题说一说 HashMap 底层数据结构JDK1.8,HashMap底层是数组 + 链表 + 红黑树的数据结构。数组的主要作用是方便快速查找,时间复杂度为 O(1),默认大小为16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组的元素叫做 Node,当不同的 key 的 hashcode 相同时(hash冲突),Node 会转换成链表,链表的查询复杂度的 O(n),当链表的长度大于等于 8 并且数组的大小大于等于 64 时,链表会进原创 2021-06-21 19:44:42 · 129 阅读 · 0 评论 -
TreeMap 和 LinkedHashMap 核心源码解析
TreeMap 和 LinkedHashMap 核心源码解析在了解 TreeMap 之前,我们来看下日常工作中排序的两种方式,作为我们学习的基础储备,两种方式的代码如下:public class TreeMapDemo { @Data // DTO 为我们排序的对象 class DTO implements Comparable<DTO> { private Integer id; public DTO(Integer id) { this.id原创 2021-06-21 17:23:15 · 191 阅读 · 0 评论 -
HashMap 源码解析
HashMap 源码解析HashMap 源码很长,面试的问题也非常多,但这些面试问题,基本都是从源码中衍生出来的, 所以我们只需要弄清楚其底层实现原理,回答这些问题就会游刃有余。整体架构JDK1.8 中 HashMap 底层的数据结构是: 数组 + 链表 + 红黑树。当链表的长度大于等于 8 时,链表会转换成红黑树,当红黑树的大小小于等于 6 时,红黑树会退化为链表,整体的数据结构如下:图中竖这的是 HashMap 的数组结构,数组的元素可能是单个 Node,也可能是个链表或红黑树。比如数组下标为原创 2021-06-21 16:14:43 · 111 阅读 · 0 评论 -
List 源码会问哪些面试题
List 源码会问哪些面试题说说你自己对 ArrayList 的理解很多面试官喜欢这样子开头,考察面试者对 ArrayList 有没有总结经验,介于 ArrayList 内容很多,建议先回答总体架构,再从某个细节出发作为突破口,比如这样:ArrayList 底层数据结构是个数组,是有序的集合并且可以重复,支持null值,支持随机读写能力,是非线程安全的。其 API 都做了一层对数组底层访问的封装,ArrayList 集合在调用无参构造方法实例化的时候,并没有创建数组,而是在用户第一次执行添加的时候进原创 2021-06-21 14:24:45 · 117 阅读 · 0 评论 -
LinkedList 源码解析
LinkedList 源码解析LinkedList 适用于集合元素先入先出和陷入后出的场景,在队列源码中频繁被使用。整体架构LinkedList 底层数据结构是一个双向链表,整体结构如下图所示:上图代表了一个双向链表结构,链表中的每个节点够可以向前或者向后追溯链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置next 属性代表后一个节点的位置first 是双向链表的头节点,它的前一个节点是 nulllast 是双向链表的尾节点,它的后一个节点是 n原创 2021-06-19 17:12:29 · 181 阅读 · 0 评论 -
ArrayList 源码解析和设计思路
ArrayList 源码解析和设计思路整体架构ArrayList 整体架构比较简单,就是一个数组结构,比较简单,如下图:图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数,elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:DEFAULT_CAPACITY 表示数组的初始大小,默认是10,这个数字要记住;size 表示当前数组的大小,类型 int ,没有使用 volatile 修饰,非线程安全的;modCount 统计原创 2021-06-19 14:54:57 · 162 阅读 · 0 评论 -
Java 常用关键字理解
Java 常用关键字理解Java 中的关键字很多,大约有 50+,在命名上我们不能和这些关键字冲突,编译会报错,每个关键字都代表着不同场景下的不同含义。static意思是静态的、全局的,一旦被修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问,这时候需要注意并发读写的问题。修饰的对象static 只能修饰类变量、方法和代码块修饰类变量当 static 修饰类变量时,如果该变量时 public 的话,表示该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.变量 这种形式访问即可。原创 2021-06-18 16:58:36 · 249 阅读 · 0 评论 -
String 和 Long 的面试题
String 和 Long 的面试题String不变性我们常常听人说,HashMap 的 key 建议使用不可变类,比如 String 这种不可变类。这里说的不可变指的是类值一旦被初始化,就不能再改变了,如果被修改,将会是新的类。String s = "hello";s = "world";从代码上来看,s 的值好像被修改了,但从 debug 的日志来看,其实 s 的内存地址以及被修改了,也就是 s = "world" 这个赋值操作,其实已经把 s 的引用指向了新的 String。我们从原创 2021-06-18 14:35:28 · 153 阅读 · 0 评论