<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[掘客DIGGKR]]></title><description><![CDATA[生活是一座大山，每天挖掘才能有所收获。掘客是一种生活态度！]]></description><link>https://blog.youkuaiyun.com/sl1202</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sl1202]]></copyright><item><title><![CDATA[10个HashMap问题搞定面试官]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108502029</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108502029</guid><author>sl1202</author><pubDate>Thu, 10 Sep 2020 19:15:11 +0800</pubDate><description><![CDATA[废话不多说，看题：
1：HashMap 的数据结构？
JDK1.7使用的是数组+ 单链表的数据结构。
JDK1.8及之后时，使用的是数组+链表+红黑树的数据结构。当阈值是默认阈值0.75，链表的深度大于等于8，数组容量大于等于64时，扩容的时候会把链表转成红黑树，时间复杂度从O（n）变成O（logN）；当红黑树的节点深度小于等于6时，红黑树会转为链表结构。

...]]></description><category></category></item><item><title><![CDATA[大厂面试题：JDK1.7和1.8的HashMap有哪些区别？]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108485459</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108485459</guid><author>sl1202</author><pubDate>Wed, 09 Sep 2020 13:56:00 +0800</pubDate><description><![CDATA[我们了解过了JDK1.7和1.8的HashMap源码，今天来总结下JDK1.7和1.8的Hashmap有哪些区别？这个问题是大厂面试中最常问到的问题。
一、JDK1.7和1.8的Hashmap有哪些区别？
1、JDK1.7用的是头插法，而JDK1.8及之后使用的都是尾插法
JDK1.7是用单链表进行的纵向延伸，当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后使用尾插法，能够避免出现逆序且链表死循环的问题。
2、扩容后数据存储位置的计算方式不一样
在JDK1.7的时候是直接用hash值]]></description><category></category></item><item><title><![CDATA[JDK1.8 ConcurrentHashMap源码解析]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108472113</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108472113</guid><author>sl1202</author><pubDate>Tue, 08 Sep 2020 19:09:27 +0800</pubDate><description><![CDATA[ConcurrentHashMap是conccurrent家族中的一个类，由于它可以高效地支持并发操作，以及被广泛使用，经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比，它已经更胜一筹，因此它的锁更加细化，而不是像HashTable一样为几乎每个方法都添加了synchronized锁，这样的锁无疑会影响到性能。
本文的分析的源码是JDK1.8的版本，与JDK1.7的版本有很大的差异。实现线程安全的思想也已经完全变了，它摒弃]]></description><category></category></item><item><title><![CDATA[Java中的天使和魔鬼sun.misc.Unsafe]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108401507</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108401507</guid><author>sl1202</author><pubDate>Fri, 04 Sep 2020 12:58:45 +0800</pubDate><description><![CDATA[Java是一个安全的编程语言，它能最大程度的防止程序员犯一些低级的错误（大部分是和内存管理有关的）。但凡事不是绝对的，使用Unsafe程序员就可以操作内存，因此可能带来一个安全隐患。
这篇文章是就快速学习下sun.misc.Unsafe的公共API和一些有趣的使用例子。
1、Unsafe 实例化
在使用Unsafe之前我们需要先实例化它。但我们不能通过像Unsafe unsafe = new Unsafe()这种简单的方式来实现Unsafe的实例化，这是由于Unsafe的构造方法是私有的。Unsafe有一个]]></description><category></category></item><item><title><![CDATA[JDK1.7 ConcurrentHashMap源码分析]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108366054</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108366054</guid><author>sl1202</author><pubDate>Wed, 02 Sep 2020 23:54:25 +0800</pubDate><description><![CDATA[HashMap是java编程中最常用的数据结构之一，由于HashMap非线程安全，因此不适用于并发访问的场景。JDK1.5之前，通常使用HashTable作为HashMap的线程安全版本，HashTable对读写进行全局加锁，在高并发情况下会造成严重的锁竞争和等待，极大地降低了系统的吞吐量，ConcurrentHashMap应运而生。
相比于Hashtable以及Collections.synchronizedMap()，ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力，并且读操作]]></description><category></category></item><item><title><![CDATA[HashMap默认负载因子0.75和泊松分布有关系吗？]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108292693</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108292693</guid><author>sl1202</author><pubDate>Sat, 29 Aug 2020 12:24:19 +0800</pubDate><description><![CDATA[我们在看HashMap源码时，知道HashMap默认的负载因子是0.75。那这个0.75是怎么来的呢？
/**
 * The load factor used when none specified in constructor.
 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;

通常，加载因子需要在时间和空间成本上寻求一种折衷。
加载因子过高：
例如为1，虽然减少了空间开销，提高了空间利用率，但同时也增加了查询时间成本。
加载因子过低：
例如0.5，]]></description><category></category></item><item><title><![CDATA[JDK1.8 HashMap源码剖析]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108285673</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108285673</guid><author>sl1202</author><pubDate>Fri, 28 Aug 2020 22:54:22 +0800</pubDate><description><![CDATA[上篇我们介绍了JDK1.7版的HashMap，今天我们来讲解下JDK1.8版的HashMap。
JDK1.7的实现大家看出有没有需要优化的地方？
其实一个很明显的地方就是：当 Hash 冲突严重时，在桶上形成的链表会变的越来越长，这样在查询时的效率就会越来越低；时间复杂度为 O(N)。
因此JDK1.8 中重点优化了这个查询效率。
1、JDK1.8 HashMap 数据结构图

我们会发现优化的部分就是把链表结构变成了红黑树。原来jdk1.7的优点是增删效率高，于是在jdk1.8的时候，不仅仅增删效率高，而]]></description><category></category></item><item><title><![CDATA[JDK1.7 HashMap源码剖析，循环链表是如何产生的]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108218801</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108218801</guid><author>sl1202</author><pubDate>Tue, 25 Aug 2020 14:40:38 +0800</pubDate><description><![CDATA[Map 这样的 Key Value 在软件开发中是非常经典的结构，常用于在内存中存放数据。众所周知 HashMap 底层是基于 数组 + 链表 组成的，不过在 JDK1.7 和 1.8 中具体实现稍有不同。
今天我们只讲解JDK1.7版本的HashMap。
1、HashMap的数据结构图
是一个数组+链表结构

2、HashMap成员变量
/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DE]]></description><category></category></item><item><title><![CDATA[红黑树简单解析，动画演示]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108181532</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108181532</guid><author>sl1202</author><pubDate>Sun, 23 Aug 2020 12:27:54 +0800</pubDate><description><![CDATA[今天我们来了解下红黑树。
1、啥是红黑树？
红黑树（Red Black Tree） 是一种自平衡二叉查找树，是在计算机科学中用到的一种数据结构，典型的用途是实现关联数组。因此想要弄清楚红黑树，我们需要先解决几个问题：
① 二叉查找树是什么？
② 为什么会出现红黑树？
2、剖析二叉查找树
二叉查找树特性
二叉查找树（Binary Search Tree）是一颗二叉树，简称BST。就像我们说int都是整数一样，BST这一种二叉树需要满足如下三个特性：
① 某节点的左子树节点值仅包含小于该节点值
② 某节点的右子]]></description><category></category></item><item><title><![CDATA[面试官：说一下这头牛COW，Copy-On-Write]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108121533</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108121533</guid><author>sl1202</author><pubDate>Thu, 20 Aug 2020 13:59:50 +0800</pubDate><description><![CDATA[Copy-On-Write简称COW，是一种用于程序设计中的优化策略。其基本思路是，从一开始大家都在共享同一个内容，当某个人想要修改这个内容的时候，才会真正把内容Copy出去形成一个新的内容然后再改，这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用，可以在非常多的并发场景中使用到。
1、什么是CopyOnWrite容器
Co]]></description><category></category></item><item><title><![CDATA[为什么会出现ConcurrentModificationException异常，如何解决?]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108112274</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108112274</guid><author>sl1202</author><pubDate>Wed, 19 Aug 2020 23:10:58 +0800</pubDate><description><![CDATA[在前面一篇文章中提到，对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。
1、异常出现的原因
先看下面这段代码：
public class Test {

	public static void main(String[] args)  {
        ArrayList&lt;Integer&gt; list = new ArrayList]]></description><category></category></item><item><title><![CDATA[同步容器讲解]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108096425</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108096425</guid><author>sl1202</author><pubDate>Wed, 19 Aug 2020 11:56:12 +0800</pubDate><description><![CDATA[为了方便编写出线程安全的程序，Java里面提供了一些线程安全类和并发工具，比如：同步容器、并发容器、阻塞队列、Synchronizer（比如CountDownLatch）。今天我们就来讨论下同步容器。
1、为什么会出现同步容器？
在Java的集合容器框架中，主要有四大类别：List、Set、Queue、Map。
List、Set、Queue接口分别继承了Collection接口，Map本身是一个接口。
注意Collection和Map是一个顶层接口，而List、Set、Queue则继承了Collection]]></description><category></category></item><item><title><![CDATA[面试官都爱问这个：ThreadLocal与内存泄漏]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/108067254</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/108067254</guid><author>sl1202</author><pubDate>Tue, 18 Aug 2020 18:03:00 +0800</pubDate><description><![CDATA[https://www.cnblogs.com/dolphin0520/p/3920407.html
https://blog.youkuaiyun.com/JAck_chen0309/article/details/105257331
https://blog.youkuaiyun.com/puppylpg/article/details/80433271
https://blog.youkuaiyun.com/zzg1229059735/article/details/82715741?utm_medium=distribute.pc_r]]></description><category></category></item><item><title><![CDATA[大厂面试必问的CAS，你了解吗]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107977972</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107977972</guid><author>sl1202</author><pubDate>Thu, 13 Aug 2020 15:16:21 +0800</pubDate><description><![CDATA[我们在【大厂面试必问：volatile关键字详解】这篇文章中已经知道：
volatile关键字可以保证有序性、可见性、防止指令重排，但是不能保证原子性。
多线程并发修改volatile变量时，如果线程1读取volatile变量后，这时线程2读取并修改了这个变量，并写入了主内存，设置线程1工作内存中的缓存行失效。由于线程1已经读取过volatile变量了，此时不会再去缓存行读取了（此时缓存行已失效），也不会去主内存读取了，而是直接修改变量，写入主内存。这样就导致了并发修改的错误！
正是由于这种错误，导致了CA]]></description><category></category></item><item><title><![CDATA[大厂面试必问：volatile关键字详解]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107955841</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107955841</guid><author>sl1202</author><pubDate>Wed, 12 Aug 2020 17:34:30 +0800</pubDate><description><![CDATA[volatile关键字是面试中必问的一个知识点，今天我们来剖析下。
volatile这个关键字可能很多朋友都听说过，或许也都用过。在Java 5之前，它是一个备受争议的关键字，因为在程序中使用它往往会导致出人意料的结果。在Java 5之后，volatile关键字才得以重获生机。
1、内存模型的相关概念
大家都知道，计算机在执行程序时，每条指令都是在CPU中执行的，而执行指令过程中，势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存（物理内存）当中的，这时就存在一个问题，由于CPU执行速度很]]></description><category></category></item><item><title><![CDATA[校长发奖状了，要排排队领取哦，Java Lock简述]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107892917</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107892917</guid><author>sl1202</author><pubDate>Sun, 09 Aug 2020 14:31:55 +0800</pubDate><description><![CDATA[在小时候，校长发东西时，要我们一个一个排好队绝对不敢抢，不然后果很严重。
这个多人排队领取东西的场景和编程中的多线程访问共享资源的场景很像。今天我们结合Java Lock来讲解下。
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题，从Java 5之后，在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问，那就是Lock。
这时候有朋友就会问了，既然都可以通过synchronized来实现同步访问了，那么为什么还需要]]></description><category></category></item><item><title><![CDATA[老师发糖了，要排排队领取哦，Java synchronized关键字]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107877987</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107877987</guid><author>sl1202</author><pubDate>Sat, 08 Aug 2020 14:19:33 +0800</pubDate><description><![CDATA[在小时候，老师发东西时，要我们一个一个排好队不准抢，不然打屁屁。
这个多人排队领取东西的场景和编程中的多线程访问共享资源的场景很像。今天我们结合Java synchronized关键字来讲解下。
1、什么时候会出现线程安全问题？
在单线程中不会出现线程安全问题，而在多线程编程中，有可能会出现同时访问同一个资源的情况，这种资源可以是各种类型的的资源：一个变量、一个对象、一个文件、一个数据库表等，而当多个线程同时访问同一个资源的时候，就会存在一个问题：
由于每个线程执行的过程是不可控的，所以很可能导致最终的结果]]></description><category></category></item><item><title><![CDATA[Java Thread类简述]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107871139</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107871139</guid><author>sl1202</author><pubDate>Fri, 07 Aug 2020 23:19:45 +0800</pubDate><description><![CDATA[今天我们来看下java.lang.Thread这个类。
在学习Thread类之前，先看下线程相关知识：线程的几种状态、上下文切换，然后介绍Thread类中的方法的具体使用。
1、线程的状态
线程从创建到最终的消亡，要经历若干个状态。一般来说，线程包括以下这几个状态：创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡（dead）。
当需要新起一个线程来执行某个子任务时，就创建了一个线程。但是线程创建之后，不会立即进入就绪状态]]></description><category></category></item><item><title><![CDATA[漫画图解进程与线程，形象生动]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107850897</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107850897</guid><author>sl1202</author><pubDate>Thu, 06 Aug 2020 22:30:15 +0800</pubDate><description><![CDATA[初学程序的时候，很多人搞不清进程和线程的关系，今天整理了下网友们的答案，希望对大家有所帮助。
先看漫画：
1、计算机的核心是CPU，它承担了所有的计算任务。它就像一座工厂，时刻在运行。

2、假定工厂的电力有限，一次只能供给一个车间使用。也就是说，一个车间开工的时候，其他车间都必须停工。背后的含义就是，单个CPU一次只能运行一个任务。

3、进程就好比工厂的车间，它代表CPU所能处理的单个任务。任一时刻，CPU总是运行一个进程，其他进程处于非运行状态。

4、一个车间里，可以有很多工人。他们协同完成一个任务]]></description><category></category></item><item><title><![CDATA[看连环画，Java垃圾回收机制]]></title><link>https://blog.youkuaiyun.com/sl1202/article/details/107812960</link><guid>https://blog.youkuaiyun.com/sl1202/article/details/107812960</guid><author>sl1202</author><pubDate>Wed, 05 Aug 2020 13:42:03 +0800</pubDate><description><![CDATA[今天我们看一下的Java的垃圾回收机制。

上图是oracle官网给出的GC描述，热心网友进行了翻译，图文并茂，简单易懂。翻译内容如下：
什么是自动垃圾回收？
自动垃圾回收是一种在堆内存中找出哪些对象在被使用，还有哪些对象没被使用，并且将后者删掉的机制。所谓使用中的对象（已引用对象），指的是程序中有指针指向的对象；而未使用中的对象（未引用对象），则没有被任何指针给指向，因此占用的内存也可以被回收掉。
在用 C 之类的编程语言时，程序员需要自己手动分配和释放内存。而 Java 不一样，它有垃圾回收器，释放内存]]></description><category></category></item></channel></rss>