![](https://img-blog.csdnimg.cn/20210410225112167.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
主要包含对Java各知识点的相关介绍
进击的Coder*
这个作者很懒,什么都没留下…
展开
-
# FastJSON # List转化为JSONArray
详细代码演示如何将List复杂对象转化为JSONArray,附带FastJSON下载链接。原创 2021-12-17 10:13:13 · 3521 阅读 · 0 评论 -
#案例+源码分析# Comparator.compare方法,-1,0,1是升序还是降序?
通过实际案例和源码的分析,帮助大家搞清楚compare方法返回1,是升序还是降序。文末超强总结!原创 2021-12-09 11:35:50 · 2212 阅读 · 0 评论 -
#优质代码# Map按Value降序排序,Value相同时按Key排序
Map按照value和key,同时进行排序,并结合Stream流式操作原创 2021-12-01 15:55:40 · 4185 阅读 · 1 评论 -
Idea:枚举类,黄色警告,如何解决?
idea中,枚举类界面整体呈现为黄色,解决方案,超简单!!!原创 2021-11-27 22:48:11 · 6077 阅读 · 3 评论 -
Java8新特性(案例分析)-- Optional接口妙用:避免嵌套if
Optional接口介绍,实际案例讲解如何通过Optional接口优雅地解决if判空、嵌套if判空以及与Stream的结合操作!!原创 2021-11-17 14:27:54 · 3108 阅读 · 2 评论 -
超详细:ReentrantLock非公平锁的Lock流程(代码含详细注释)
ReentrantLock.NonfairSync继承自内部类Sync。 static final class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563782823691L; // 首先尝试立即获取锁,获取成功,则将自身设定为 独占模式的同步器 的拥有者 // 如果获取失败,则通过调用AQS.acquire(原创 2021-09-14 12:07:47 · 266 阅读 · 0 评论 -
排序算法:冒泡、选择、插入、希尔、快速、归并 -- Java版
冒泡排序 /** 冒泡排序,从小到大 进阶版可添加标志,判断是否已然有序 */ public static void bubbleSort(int[] nums) { int temp; for(int i=0;i<nums.length;i++) { for(int j=i+1;j<nums.length;j++) { if(nums[j]<nums[i]) { temp = nums[i];原创 2021-09-07 18:09:19 · 110 阅读 · 0 评论 -
Java类加载器
一、类加载过程Java类加载过程如下图所示:加载 --> 链接 --> 初始化。(一)加载JVM在加载,需要完成3件事:1. 通过类的全限定名来获取此类的二进制字节流2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。(二)链接链接过程分为3步:验证 --> 准备 --> 解析。1. 验证确保Class文件中的字节流中包原创 2021-09-03 18:31:34 · 345 阅读 · 0 评论 -
ThreadLocal:原理 + get + set
每个线程内都绑定了ThreadLocal,如class Thread implements Runnable { // 省略了Thread类的其它代码 /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;原创 2021-05-11 22:56:51 · 1712 阅读 · 0 评论 -
ArrayList扩容机制:源码解读
这篇文章探讨ArrayList的扩容机制,配合源码讲解,所有的讲解都在代码上注释了,清晰易懂public boolean add(E e) { ensureCapacityInternal(size + 1); // 添加一个元素前,先确保容量是否够 elementData[size++] = e; return true;}//得到最小扩容量private void ensureCapacityInternal(int minCapacity.原创 2021-04-18 10:28:56 · 873 阅读 · 2 评论 -
这么回答面试官之--HashMap扩容机制
HashMap扩容时,可以分为三种情况:1. 如果hashMap不是第一次进行扩容的时候,如果现在的容量已经达到了规定的最大值,则直接返回当前容量的大小,并将threshold设为最大整数值。否则将新容量和阈值(threshold)都扩大一倍。2. 如果构建hashMap的时候指定了初始容量,则将当前容量扩容到threshold(【通过tableSizeFor()计算得到的一个2的n次方的值【将传入的数改为2进制表示,把最高位后面都变成0,得到的才是真正的设定的初始容量,然后在延迟初始化的时候将该thr原创 2021-04-16 15:20:53 · 2466 阅读 · 0 评论 -
讲点人话:HashMap的put操作、过程
HashMap的put操作,网上有很多的解析,但是说的可能都不是个面试能回答的“人话”。如果别人问你HashMap是怎么put的,你可以这么说:根据key计算hash值,如果延迟初始化(table=null的时候)或者第一次加入元素时,进行扩容。如果通过hash值定位到的桶位置内没有元素,直接建立一个节点放入桶内。如果当前桶内存在元素的话,如果恰好是桶内的元素,则用新值代替旧值。如果桶内是红黑树节点,则在红黑树中进行put操作。如果桶内是普通链表节点,则遍历链表将节点加入。如果链表中存在相同原创 2021-04-16 14:57:44 · 411 阅读 · 0 评论 -
HashMap put操作,链表长度超过8,不一定会转化为红黑树!!!
我们常会说:“hashmap中,当链表的长度超过8,就会从链表转化为红黑树”。其实,这不是完全正确的。正确的说法是,“hashmap中,当链表长度超过8,且table数组的长度不小于64时,链表会转化为红黑树”。不信,我们来看看。首先,HashMap.class中存在这样一个参数:static final int MIN_TREEIFY_CAPACITY = 64;文档注释为:The smallest table capacity for which bins may be treeifi原创 2021-04-16 14:21:35 · 3438 阅读 · 2 评论 -
HashMap容量为什么是2的n次方?如何做到的?
HashMap无疑是我们最常用的集合之一了,当我们调用HashMap(9)构建map的时候,它的容量是多少呢?划重点!HashMap(9)构建的map的容量是16!!!这也就引出了下面的问题:HashMap的容量为什么是2的n次方?HashMap是如何保证容量是2的n次方的?HashMap容量取2的n次方,主要与hash寻址有关。在put(key,value)时,putVal()方法中通过i = (n - 1) & hash来计算key的散列地址。其实,i = (n - 1) &原创 2021-04-12 00:41:06 · 6592 阅读 · 5 评论 -
这么回答面试官之--ConcurrentHashMap如何get?为何无需加锁
ConcurrentHashMap的get操作的步骤如下:通过key计算hash值 如果通过hash值判断key对应的节点是否在Node数组中,如果在则返回对应的值。此处分为3种情况: 如果恰好是数组元素,也即没有hash值计算得到的桶内只有一个节点,返回改节点的值; 如果是红黑树,则通过树的遍历方式去获取,然后返回值; 如果是普通链表,则通过链表的方式去获取。 如果通过hash值计算定位到的桶位置上没有元素,则返回null。public V get(Object key) {原创 2021-04-10 23:39:56 · 1838 阅读 · 4 评论 -
这么回答面试官之--ConcurrentHashMap如何put?
final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); // 根据key计算出hash code int hash = spread(key.hashCode()); int binCount = 0; for (Node<K,V&g.原创 2021-04-10 22:40:24 · 5246 阅读 · 3 评论