
Java面经
星空下的那个人影
不像程序员的程序猿
展开
-
Synchronized 与 Lock 的区别
synchronized与Lock的区别原创 2022-06-03 20:10:06 · 103 阅读 · 0 评论 -
说说JVM的垃圾回收算法
引用计数法、复制算法、标记算法、标记整理原创 2022-06-03 12:07:06 · 104 阅读 · 0 评论 -
请你说说进程和线程的区别
进程是包含线程的,一个进程可以包含一个或多个线程原创 2022-06-02 11:37:28 · 146 阅读 · 0 评论 -
说说你了解的JVM内存模型
JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。原创 2022-06-02 11:04:51 · 204 阅读 · 0 评论 -
产生死锁的四个必要条件
互斥、请求与保持、不剥夺、循环等待原创 2022-06-01 16:36:34 · 118 阅读 · 0 评论 -
StringBuffer 和 StringBuilder 区别
StringBuffer 与 StringBuilder 中的方法和功能完全是等价的;只是 StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的;在单线程程序下,StringBuilder 效率更快,因为它不需要加锁,不具备多线程安全,而 StringBuffer 则每次都需要判断锁,效率相对较低。...原创 2022-05-18 21:24:57 · 167 阅读 · 0 评论 -
TreeSet 和 HashSet区别
HashSet 是采用 hash 表来实现的。其中的元素没有按顺序排列,add()、remove() 以及 contains() 等方法都是复杂度为 O(1) 的方法。TreeSet 是采用树结构实现(红黑树算法)。元素是按顺序进行排序,但是add()、remove() 以及 contains() 等方法都是复杂度为 O(log(n)) 的方法。它还提供了一些方法来处理排序的 set,如 first()、last()、headSet()、tailSet() 等。...原创 2022-05-17 20:41:45 · 727 阅读 · 0 评论 -
HashMap多线程下会有啥问题?HashMap的key能否为null,作为key的对象有什么要求?String对象的hashCode()如何设计的,为何每次乘的是31?
扩容死链(1.7)数据错乱(1.7,1.8)原创 2022-05-03 23:38:48 · 316 阅读 · 0 评论 -
HashMap的负载因子为何是0.75?
在空间占用与查询时间之间取得了较好的权衡;大于这个值,空间节省了,但链表就会比较长,会影响性能;小于这个值,冲突减少了,但扩容就会更频繁,空间占用多参考:https://blog.youkuaiyun.com/qq_36525300/article/details/113841588...原创 2022-04-28 17:47:59 · 258 阅读 · 0 评论 -
HashMap的put方法,1.7和1.8有何不同?
HashMap是懒惰创建数组的,首次使用才创建数组;计算索引(桶下标);如果桶下标还没人占用,创建Node节点占位返回;如果桶下标已经被人占用a. 已经是TreeNode节点,走红黑树的添加或更新逻辑;b. 是普通的Node节点,走链表的添加或更新逻辑,如果链表长度超过树化阈值,走树化逻辑;返回前检查容量是否超过阈值,一旦超过进行扩容(元素放进去再扩容)。不同:a. 链表插入节点时,1.7是头插法,1.8是尾插法;b. 1.7是大于等于阈值且没有空位时才扩容,而1.8是大于阈值(数组容量.原创 2022-04-27 21:02:47 · 1087 阅读 · 0 评论 -
HashMap索引是如何计算的?hashCode都有了,为何还要提供hash()方法?数组容量为何是2的n次幂?
计算对象的hashCode(),再进行HashMap的hash()方法进行二次哈希,最后&(数组容量-1)得到索引;二次hash()是为了综合高维数据,让哈希分布更为均匀;计算索引时,如果是2的n次幂可以使用位与运算代替取模,效率更高;扩容时hash值 & 原先容量 == 0的元素留在原来位置,否则新位置 = 旧位置+原先容量;但前三个都是为了配合容量为2的n次幂时的优化手段,例如hashtable的容量就不是2的n次幂,并不能说哪种设计更优,应该是设计者综合了各种因素,最终选择了使.原创 2022-04-26 20:19:23 · 844 阅读 · 0 评论 -
HashMap(底层数据结构,1.7和1.8有何不同)
底层数据结构,1.7和1.8有何不同? 1.7 数组+链表 1.8 数组+(链表|红黑树)——当链表中元素比较多时,链表会转换成红黑树,红黑树中元素减少了,也会退回为链表为何要用红黑树,为何一上来不树化(数组+链表,只有当链表长度超过一个阈值之后,才会转换成红黑树),树化阈值(链表长度超过一个阈值之后)为何是8,何时会树化(是不是一超过这个阈值,就立马变成红黑树,还是有其它的条件呢),何时会退化为链表?红黑树特点:左子树的节点元素比根节点元素小,右子树的节点元素比根节点元素大a. 为..原创 2022-04-25 18:46:16 · 463 阅读 · 0 评论 -
ArrayList与LinkedList的比较
ArrayList(1) 基于数组,需要连续内存;(2) 随机访问快(指根据下标访问);(3) 尾部插入、删除性能都可以,其他部分插入、删除都会移动数据,因此性能会低;(4) 可以利用cpu缓存,局部性原理(提升相邻元素的被访问的机会);LinkedList(1) 基于双向链表,不需要连续内存;(2) 随机访问慢(要沿着链表遍历);(3) 头尾插入、删除性能高;(4) 占用内存多;...原创 2022-04-24 16:13:19 · 495 阅读 · 0 评论 -
ArrayList扩容机制、fail-fast与fail-safe
扩容机制ArrayList() 无参会使用长度为0的数组;ArrayList(int initialCapacity) 会使用指定容量的数组;public ArrayList(Collection<? extends E> c) 会使用集合c的大小作为数组容量;add(Object o) 首次扩容为10,再次扩容为上次容量的1.5倍;addAll(Collection c) 没有元素时,扩容为Math.max(10,实际元素个数),有元素时为Math.max(原容量1.5倍,实际元素原创 2022-04-24 15:54:16 · 270 阅读 · 0 评论 -
快速排序及优化
普通快速排序(以升序为例):每一轮排序选择一个基准点进行分区:让小于基准点的元素的进入一个分区,大于基准点的元素的进入另外一个分区,当分区完成时,基准点元素的位置就是其最终位置;在子分区内重复以上过程,直到子分区元素个数少于等于1。实现方式1. 单边循环快排a. 选择最右元素作为基准点元素;b. j指针负责找到比基准点小的元素,一旦找到则与i进行交换;c. i指针维护小于基准点元素的边界,也是每次交换的目标索引;d. 最后基准点与i交换,i即为分区位置。import java.util原创 2022-04-21 18:13:16 · 526 阅读 · 0 评论 -
HashMap和HashTable的区别
HashMap没有考虑同步,是线程不安全的;HashTable使用了Synchronized关键字,是线程安全的;HashMap允许K/V都为null;而后者K/V都不允许为null;HashMap继承了AbstractMap类,而HashTable继承Dictionary类。但二者都实现了Map接口;HashMap把Hashtable的contains方法去掉了,改成了containsValue和containsKey,因为contains方法很容易让人误解,而HashTable保留了contai.原创 2022-04-20 20:25:40 · 302 阅读 · 0 评论 -
插入排序及优化
普通插入排序(以升序为例):将数组分成两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需要保证顺序)重复以上步骤,直到整个数组有序import java.util.Arrays;public class Task03_InsertSort { public static void main(String[] args) { int[] a = {9, 3, 7, 2, 5, 8, 1, 4}; insert(a);原创 2022-04-20 19:45:59 · 176 阅读 · 0 评论 -
选择排序及优化
普通选择排序(以升序为例):将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的子集,放入排序子集重复以上步骤,直到整个数组有序优化:为减少交换次数,每一轮可以先找出最小的索引,在每轮最后再交换元素import java.util.Arrays;/** * 选择排序 */public class Task02_SelectionSort { public static void main(String[] args) { int[] a原创 2022-04-19 23:59:07 · 325 阅读 · 0 评论 -
冒泡排序及优化
普通冒泡排序(以升序为例):依此比较数组中相邻两个元素大小,若a[j]>a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后重复以上步骤,直到整个数组有序import java.util.Arrays;public class Task01_BobbleSort { public static void main(String[] args) { int[] a = {5, 9, 7, 4, 1, 3, 2, 8};//原创 2022-04-19 23:20:28 · 3285 阅读 · 1 评论 -
说说常见的集合有哪些?
Map接口和Collection接口是所有集合框架的父接口:Collection接口的子接口包括:Set接口和List接口;Map接口的实现类主要有:HashMap、TreeMap、Hashtable等;Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等;List接口的实现类主要有:ArrayList、LinkedList、Stack等...原创 2022-04-15 11:21:40 · 171 阅读 · 0 评论 -
==与equals
==它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。基本数据类型+String常量==比较的是值引用数据类型==比较的是内存地址equals()它的作用也是判断两个对象是不是相等。但是它一般有两种使用情况:● 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于"=="比较这两个对象。● 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等。public class tes原创 2022-04-12 12:10:39 · 290 阅读 · 0 评论 -
java面经第001篇之重载和重写的区别
重载:要求:两同一不同两同:发生在同一个类中,方法名相同;一不同:形参列表不同;方法返回值类型、访问修饰符,与重载无关;例如:public class Overload { public void test(){ System.out.println("无参数"); } public void test(String str){ System.ou...原创 2020-02-20 00:15:19 · 170 阅读 · 0 评论