- 博客(78)
- 资源 (1)
- 收藏
- 关注
原创 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看
前言HashMap 源码和底层原理在现在面试中是必问的。因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合。文章较长,介绍了很多原理性的问题,希望对你有所帮助~目录本篇文章主要包括以下内容:HashMap 的存储结构常用变量说明,如加载因子等HashMap 的四个构造函数tableSizeFor()方法及作用put()方法详解hash()方...
2020-04-13 10:16:14 54859 62
原创 字符编码和字符集有什么区别?Unicode是什么,和UTF-8是什么关系?你想知道的都在这篇文章了
前言想必大家编写代码时肯定和我一样,也遇到过汉字乱码的问题。特别是,有时候和上下游对接接口,不能统一编码格式的话,一堆乱码问题,让人头皮发麻。那么为什么会有这么多的乱码问题?什么是字符编码?什么是字符集?他们之间有什么区别和联系?什么是 Unicode ? Unicode 和我们常说的 UTF-8 又有什么关系?字符编码和解码要想搞清楚上面的问题,首先我们要知道,在计算机中,不管是一段文字、一张图片还是一段视频,最终都是以二进制的方式来存储。也就是最终都会转化为 0001 1011 0010
2021-08-29 10:10:40 929 1
原创 如何朴实无华的双开微信?
前言好久没更新技术文章了,如果细算的话,或许可能大概已经有半年之久了。。一方面是身体原因导致现在精力大不如以前了,这个很多关注我的老读者应该都知道,我就不一直拿这个说事了,说多了总感觉自己太矫情。另一方面应该也是自己懒散习惯了,就不想再费力写一些文章了,不过我也不想为自己的懒惰做开脱,实事求是就是了。写过文章的作者应该深有体会,写一篇文章真的要耗费非常久的时间和精力。可能业余时间和周末都会被写文章所占领。我曾经写过一篇文章,用下班的业余时间写的,可能你想象不到我用了多久才写出来。断断续续写了差不多
2021-08-18 22:47:30 958 9
原创 教你如何使用github+jsDelivr搭建免费图床
前言之前写了一篇文章,教你如何使用Typora+PicGo实现图片自动上传到图床 。这里我用的是七牛图床,七牛图床有一定的免费使用量(没记错的话应该是10个G),如果你的存储量超过这个大小就需要付费使用了。除此之外,还需要维护一个备案过的域名,绑定一台云服务器。这些都需要一定的费用。因此,对于白嫖党来说非常不友好。今天,我就教大家用 “全球最大同性交友网站” github 并搭配 jsDelivr 开源 CDN 来搭建一个免费图床。全程不需要任何费用哦,白嫖党欢呼吧~正文本文内容包括:创建一
2020-10-31 12:20:11 741
原创 面试官问我:创建线程有几种方式?我笑了
前言多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。接下来自然就会引出线程池,Lock,Synchronized,JUC的各种并发包。然后就会引出 AQS、CAS、JMM、JVM等偏底层原理,一环扣一环。这一节我们不聊其他的,只说创建线程有几种方式。是不是感觉非常简单,不就是那个啥啥那几种么。其实不然,只有我们给面试官解释清楚了,并加上我们自己的理解,才能在面
2020-10-24 13:46:32 1658 3
原创 面试官看完我手写的单例直接惊呆了!
前言单例模式应该算是 23 种设计模式中,最常见最容易考察的知识点了。经常会有面试官让手写单例模式,别到时候傻乎乎的说我不会。之前,我有介绍过单例模式的几种常见写法。还不知道的,传送门看这里:设计模式之单例模式本篇文章将展开一些不太容易想到的问题。带着你思考一下,传统的单例模式有哪些问题,并给出解决方案。让面试官眼中一亮,心道,小伙子有点东西啊!以下,以 DCL 单例模式为例。DCL 单例模式DCL 就是 Double Check Lock 的缩写,即双重检查的同步锁。代码如下,public
2020-09-28 00:19:49 539
原创 故事:坐在我隔壁的小王问我什么是HyperLogLog
1最近坐我隔壁的小王同志,心情真是糟透了。不但工作不顺心,被老板狠狠的批了一顿,连女朋友也跟别人跑了(Y 的让你天天在我面前秀)。真是不可谓不惨,我都快要同情他了。看着他萎靡又迷离的眼神,我实在不忍心,就劝他请假几天出去散散心。临走前,我交代他,有什么紧急的事,就联系哥。还有,不要忘了我们之间的暗号哦 ~2于是,小王就拖着疲惫的身躯,背着双肩背包和最新款mac,穿着他最心爱的格子衫出发了。去哪呢,这是一个问题。平时宅在家里习惯了,想来一场说走就走的旅行还是真不容易呀。就在小王犯难的时候。
2020-09-14 21:46:13 525 1
原创 全网最全JDK8新特性 3W 字总结(建议收藏)
微信搜「烟雨星空」,白嫖更多好文。现在 Oracle 官方每隔半年就会出一个 JDK 新版本。按时间来算的话,这个月就要出 JDK15 了。然而,大部分公司还是在使用 JDK7 和 8 。之前去我朋友家,竟然被嘲笑不会用 JDK8 。 不服气的我,回来之后,当然是重点学习之啊。话不多说,本文目录如下:目录:lambda 表达式接口默认方法和静态方法函数式接口方法引用OptionalStream API日期时间新 API一、lambda表达式先看下 lambda 表达式是怎.
2020-09-07 00:46:33 1178
原创 不要再问我 in,exists 走不走索引了
微信搜『烟雨星空』,获取最新好文。前言最近,有一个业务需求,给我一份数据 A ,把它在数据库 B 中存在,而又比 A 多出的部分算出来。由于数据比较杂乱,我这里简化模型。然后就会发现,我去,这不就是 not in ,not exists 嘛。那么问题来了,in, not in , exists , not exists 它们有什么区别,效率如何?曾经从网上听说,in 和 exists 不会走索引,那么事实真的是这样吗?带着疑问,我们研究下去。注意: 在说这个问题时,不说明 MySQL 版.
2020-08-31 00:12:16 3818 1
原创 同事问我MySQL怎么递归查询,我懵逼了
前言最近在做的业务场景涉及到了数据库的递归查询。我们公司用的 Oracle ,众所周知,Oracle 自带有递归查询的功能,所以实现起来特别简单。但是,我记得 MySQL 是没有递归查询功能的,那 MySQL 中应该怎么实现呢?于是,就有了这篇文章。文章主要知识点:Oracle 递归查询, start with connect by prior 用法find_in_set 函数concat,concat_ws,group_concat 函数MySQL 自定义函数手动实现 MySQL 递
2020-08-03 00:50:33 6318 4
原创 终于,病毒向我伸出了魔爪......
前言服务器好端端的竟然中了挖矿病毒!!!可怜我那 1 核 2 G 的服务器,又弱又小,却还免除不了被拉去当矿工的命运,实在是惨啊惨。事情原来是这样的。。。就在今天下午,我准备登陆自己的远程服务器搞点东西的时候,突然发现 ssh 登陆不上了。如上,提示被拒绝。这个问题很明显就是服务器没有我的公钥,或者不识别我的公钥,然后拒绝登录。这就很难办了,我确定我的公钥是一直没有变动过的,不应该会出现这种情况啊。还有让我头疼的是,我当初为了安全起见,设置过此台服务器只能通过 ssh 的方式免密登录。而且禁
2020-07-17 20:25:02 1009
原创 面试官:换人!他连哈希扣的都不懂...
前言相信你面试的时候,肯定被问过 hashCode 和 equals 相关的问题 。如:hashCode 是什么?它是怎么得来的?有什么用?经典题,equals 和 == 有什么区别?为什么要重写 equals 和 hashCode ?重写了 equals ,就必须要重写 hashCode 吗?为什么?hashCode 相等时,equals 一定相等吗?反过来呢?好的,上面就是灵魂拷问环节。其实,这些问题仔细想一下也不难,主要是平时我们很少去思考它。正文下面就按照上边的问题顺序,一个一
2020-06-23 19:59:45 597 1
原创 Linux 文件删除不了? 一招教你搞定!
前言最近不是redis 6.0 出了吗,官网介绍最新稳定版本是 6.0.3 。于是,我就准备在自己的破小服务器上安装一下。于是,出现了后续的糟心事 (linux 下的文件正常删除不了)。下载了最新版本,在源码包里边 make 之后,出现了好几个错误,上网查了下,有人说最新版本有问题,建议使用 5.0.8 。我嘞个去,我想也没想就相信了。(其实,也有可能跟我的系统没安装 tcl 有关系,这就是后话了)然后,我就下载了 5.0.8 版本的redis,重新安装。发现问题从官网下载了 5.0.8 的源码包
2020-05-27 09:22:38 5723 2
原创 我去,为什么最左前缀原则失效了?
问题最近,在 mysql 测试最左前缀原则,发现了匪夷所思的事情。根据最左前缀原则,本来应该索引失效,走全表扫描的,但是,却发现可以正常走索引。表结构如下( Mysql 版本 5.7.22):CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL, `age` int(11) DEFAULT NULL, `address
2020-05-20 09:19:24 1442 6
原创 技术人的福音!教你如何使用Typora+PicGo实现图片自动上传功能
前言写技术文章的小伙伴,对于 Typora 肯定不陌生,用来编写 Markdown 特别的方便。但是,有个问题,就是当我们插入一个图片,并且使之可以在公网访问时,操作流程特别的麻烦。首先,你需要截图生成一个图片文件。然后,把这个图片文件手动上传到图床,然后再复制图片的外链地址,然后,再把链接地址粘贴到文章中。沃德天,这一顿操作下来,想一想就可怕。而现在,我只需截图之后,直接 Ctrl+V 到 Typora,就会自动生成链接,并且自动上传图片到图床,简直不要太爽。因此,本篇文章就教你怎样用 Mark
2020-05-12 09:30:09 1116 1
原创 你还在为怎么查看字节码指令而担忧吗?
前言我们平时编码过程中,可能很少去查看 Java 文件编译后的字节码指令。但是,不管你是因为对技术非常热爱,喜欢刨根问底,还是想在别人面前装X 。我认为,都非常有必要了解一下常见的字节码指令。这对于我们理解代码的运行原理也会很有帮助。注释会被执行吗?比如,最近我就看到了二哥(沉默王二)的一篇文章,非常有意思,也让我涨了见识了。且看代码,可能会让你怀疑人生~public class Test...
2020-05-08 09:49:11 537
原创 3W字详细解析 ConcurrentHashMap 1.7和1.8源码,再也不用担心被面试官吊打了。
前言上篇文章介绍了 HashMap 源码后,在博客平台广受好评,让本来己经不打算更新这个系列的我,仿佛被打了一顿鸡血。真的,被读者认可的感觉,就是这么奇妙。然后,有读者希望我能出一版 ConcurrentHashMap 的解析。所以,今天的这篇文章,我准备讲述一下 ConcurrentHashMap 分别在JDK1.7和 JDK1.8 的源码。文章较长,建议小伙伴们可以先收藏再看哦~说一下...
2020-04-21 09:51:31 3398 5
原创 LFU五种实现方式,从简单到复杂
前言最近刷力扣题,对于我这种 0 基础来说,真的是脑壳疼啊。这个月我估计都是中等和困难题,没有简单题了。幸好,力扣上有各种大牛给写题解。看着他们行云流水的代码,真的是羡慕不已。让我印象最深刻的就是人称 “甜姨” 的知心姐姐,还有名叫威哥的大哥。几乎每天他们的题解我都是必看的。甜姨的题解,虽然姿势很帅,但是对于我这种新手来说,感觉不是太友好,因为思路写的太少,不是很详细。所以,每次我看不明白的...
2020-04-07 08:38:13 3439 4
原创 面试官说,你会堆排序吗?会,那好手写一个吧。
前言最近明显文章更新频率降低了,那是因为我在恶补数据结构和算法的相关知识,相当于是从零开始学习。找了很多视频和资料,最后发现 b 站尚硅谷的视频教程还是相对不错的,总共 195 集。每个小节都是按先概念、原理,然后代码实现的步骤讲解。如果你也准备入门数据结构和算法,我推荐可以看下这个系列教程。昨天一天一下子肝了 40 多集,从树的后半部分到图的全部部分。可以看到,每一集其实时间也不算长,短...
2020-04-03 17:29:20 1335
原创 图解汉诺塔问题( Java 递归实现)
汉诺塔简介最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。先看下百度百科是怎么定义汉诺塔的规则的:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动...
2020-03-23 22:30:23 1441 1
原创 ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)
前言上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadWriteLock。(若是遇到之前讲过的方法,将不再赘述)先思考一下,为什么我们用读写锁分离?我们知道 ReentrantLock 用的是独占锁,不管线程是读还是写状态,都会阻塞,这无疑会降低并发量...
2020-03-17 20:45:07 1028 1
原创 刷了力扣题之后,我也变的一发不可收拾了?
作为程序员界的一枚小菜鸟,可谓是,从大量的 CRUD 业务中,练就了一身复制粘贴即可用的本领。因为大家不是都说:程序 = 复制 + 百度 吗,再高级一点的就是复制 + 谷歌喽。(我不禁想,难道科学^上网就高级了?)反正都是拿来主义嘛,代码能跑起来就完事,实在不行,删库跑路也很轻松呀 ^_^。但是呢,迫于网上不断流出的 “35岁程序员危机” 话题,我不得不开始认真思考,我这马上奔三的大龄青年...
2020-03-16 20:52:33 1371 1
原创 ReentrantLock 源码分析以及 AQS (一)
前言JDK1.5 之后发布了JUC(java.util.concurrent),用于解决多线程并发问题。AQS 是一个特别重要的同步框架,很多同步类都借助于 AQS 实现了对线程同步状态的管理。AQS 中最主要的就是独占锁和共享锁的获取和释放,以及提供了一些可中断的获取锁,超时等待锁等方法。ReentranLock 是基于 AQS 独占锁的一个实现。ReentrantReadWriteLoc...
2020-03-13 21:46:12 1265 3
原创 现在卖网课的都已经这么浮躁了吗?
昨天,发生了一件非常有意思的事情。事情经过是这样的。。。微信上有一个好友申请,备注是免费送学习资料的。对送资料我是不感冒的(因为我收藏的资料,我有信心比他的多)。但是,对于他是怎么获得我的微信这件事,我还是挺感兴趣的。本着好奇的心态,我就同意了好友请求。我想搞清楚,这位是怎么知道我的联系方式的。加了好友之后,对面主动说话了,问我是不是要学习资料的,我就客气的说了是的。然后,他给我发了一个网...
2020-03-10 17:58:50 2013 1
原创 终于有人把 CountDownLatch,CyclicBarrier,Semaphore 讲明白了!
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别。一、CountDownLatch先看一下,CountDownLatch 源码的官方介绍。意思是,它是一个同步辅助器,允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完成。public CountDownLa...
2020-03-06 18:00:19 652
原创 常用阻塞队列 BlockingQueue 有哪些?
为什么要使用阻塞队列之前,介绍了一下 ThreadPoolExecutor 的各参数的含义(并发编程之线程池ThreadPoolExecutor),其中有一个 BlockingQueue,它是一个阻塞队列。那么,小伙伴们有没有想过,为什么此处的线程池要用阻塞队列呢?我们知道队列是先进先出的。当放入一个元素的时候,会放在队列的末尾,取出元素的时候,会从队头取。那么,当队列为空或者队列满的时候怎么...
2020-03-04 23:30:06 845
原创 线程中断 interrupt 和 LockSupport
本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题:线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗?判断线程是否中断的方法有几个,它们之间有什么区别?LockSupport的 park/unpark 和 wait/notify 有什么区别?sleep 方法是怎么响应中断的?park 方法又是怎么响应中断的?线程中断相关方法...
2020-03-01 22:47:50 921 1
原创 线程sleep,wait,notify,join,yield方法解析
线程的五种状态线程从创建到销毁一般分为五种状态,如下图:1) 新建当用new关键字创建一个线程时,就是新建状态。2) 就绪调用了 start 方法之后,线程就进入了就绪阶段。此时,线程不会立即执行run方法,需要等待获取CPU资源。3) 运行当线程获得CPU时间片后,就会进入运行状态,开始执行run方法。4) 阻塞当遇到以下几种情况,线程会从运行状态进入到阻塞状态。调用sl...
2020-02-29 22:28:26 1511
原创 并发编程之线程池ThreadPoolExecutor
前言在我们平时自己写线程的测试demo时,一般都是用new Thread的方式来创建线程。但是,我们知道创建线程对象,就会在内存中开辟空间,而线程中的任务执行完毕之后,就会销毁。单个线程的话还好,如果线程的并发数量上来之后,就会频繁的创建和销毁对象。这样,势必会消耗大量的系统资源,进而影响执行效率。所以,线程池就应运而生。线程池ThreadPoolExecutor可以通过idea先看下线...
2020-02-27 23:15:13 1090
原创 怎么用IDEA快速查看类图关系
做Java开发的,现在普遍都用上idea了。可以说,idea是当之无愧的Java开发神器。如果,你现在还没用idea,那肯定是你还没有感受过它的强大。好了,话不多说,今天的主题主要是教大家怎么通过idea快速的查看一个类的类图关系,即一个类继承了哪些类,实现了哪些接口,以及接口有哪些子接口和实现类。一、类关系以一个阻塞队列LinkedBlockingQueue为例:1)通过 Ctrl+Sh...
2020-02-26 11:10:43 24707
原创 面试官让我手写一个生产者消费者模式
不知道你是否遇到过面试官让你手写生产者消费者代码。别说,前段时间有小伙伴还真的遇到了这种情况。当时是一脸懵逼。但是,俗话说,从哪里跌倒就要从哪里爬起来。既然这次被问到了,那就回去好好研究一下,争取下一次不再被虐呗。于是,今天我决定手敲一个生产者消费者模式压压惊。(因为我也不想以后被面试官血虐啊)生产者消费者模式,其实很简单。无非就是生产者不停的生产数据,消费者不停的消费数据。(这不废话吗,字...
2020-02-25 22:58:25 1740
原创 怎么用wait、notify巧妙的设计一个Future模式?
我们知道多线程可以实现同时执行多个任务(只是看起来是同时,其实是CPU的时间片切换特别快我们没感觉而已)。现在假设一个做饭的场景,你没有厨具也没有食材。你可以去网上买一个厨具,但是这段时间,你不需要闲着啊,可以同时去超市买食材。设想这是两个线程,主线程去买食材,然后开启一个子线程去买厨具。但是,子线程是需要返回一个厨具的。 如果用普通的线程,只有一个Run方法,而Run方法是没有返回值的,这个...
2020-02-23 21:15:18 1443
转载 HashMap 与HashTable的区别(终结版)
HashMap 与HashTable的区别HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如...
2020-02-22 12:02:54 305
原创 并发编程之Master-Worker模式
我们知道,单个线程计算是串行的,只有等上一个任务结束之后,才能执行下一个任务,所以执行效率是比较低的。那么,如果用多线程执行任务,就可以在单位时间内执行更多的任务,而Master-Worker就是多线程并行计算的一种实现方式。它的思想是,启动两个进程协同工作:Master和Worker进程。Master负责任务的接收和分配,Worker负责具体的子任务执行。每个Worker执行完任务之后把结...
2020-02-21 14:04:51 1149
原创 Java三大变量类变量、实例变量和局部变量
最近看到有的地方说: 成员变量包括实例变量和类变量。而有的地方说成员变量就是实例变量,不是包含关系。我又求证了一些群友和查资料,最终还是认为成员变量就是实例变量这种说法比较靠谱。因为类变量是在类加载的时候就存在了,是存在方法区的。随着类卸载才消失。而实例变量,就是随着对象的创建而创建,对象销毁也就销毁。实例变量别名叫做成员变量。(我理解就是对象中的一个成员,所以形象地称为成员变量)参考:h...
2020-02-19 10:19:51 498
原创 你和那些优秀的人差距在哪里?
前言也许,有的人看到上边这个标题,首先会觉得这肯定是一篇广告文吧。确实,我们可能见过有很多号主用类似于“你的同龄人已经XXX了,而你还在XXX”这种风格,来写软文。但是,我可以明确的告诉你,这篇文章不是广告,只是记录我的一些感想而已。再说了,也没有广告主来找我合作呀(手动捂脸)。正文今天,无意间在CSDN首页看到一个熟悉的id。之前在公众号还有其他地方对这个id有点印象,但是没有关注过,也...
2020-02-17 20:21:07 2494
转载 csdn积分获取攻略
下载积分攻略:1. 个人设置里进行手机绑定CSDN账户 奖励50分 (右上角设置-账户安全-手机绑定)2. 完成任务送若干分积分 http://task.csdn.net/3. ...
2020-02-17 10:35:33 623 6
原创 JVM垃圾回收详解
通常,我们在写java程序的时候,似乎很少关注内存分配和垃圾回收的问题。因为,这部分工作,JVM已经帮我们自动实现了。这样看起来,好像很美好,但是任何事情都有两面性。虽然JVM会自动的进行垃圾回收,但是,如果遇到有些问题,JVM自己也处理不了呢?因此,我们需要了解一下JVM垃圾回收是怎样运作的,这样才能在遇到问题的时候,有的放矢。所以,今天就来聊一聊JVM的垃圾回收吧。首先,思考一下,为什么...
2020-02-16 21:53:11 1784
原创 Java类加载器和双亲委派机制
前言之前详细介绍了Java类的整个加载过程(类加载机制详解)。虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括。1)加载:查找并加载类的二进制字节流数据。2)验证:保证被加载的类的正确性。3)准备:为类的静态变量分配内存,并设置默认初始值。4)解析:把类中的符号引用转换为直接引用。5)初始化:为类的静态变量赋予正确的初始值。当然,要想掌握类加载机制,还是需要去...
2020-02-12 17:18:21 1103
原创 类加载机制详解
之前在介绍JVM内存模型的时候(参看:JVM内存模型),提到了在运行时数据区之前,有个Class Loader,这个就是类加载器。用以把Class文件中的描述信息加载到内存中运行和使用。以下是《深入理解Java虚拟机第二版》对类加载器机制的定义原文:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加...
2020-02-11 20:07:41 3573
ts+socket.io.zip
2019-10-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人