
Java 基础笔记
文章平均质量分 81
Java 基础笔记
平头哥的技术博文
不忘初心,方得始终
展开
-
Java 多线程启动为什么调用 start() 方法而不是 run() 方法?
多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗?在探讨这个问题之前,我们先来了解一些多线程的基础知识~线程的状态Java 中,定义了 6 种线程状态,在 Thread 类可以找到:// 为了节约空间,我删除了注释public enum State { NEW,//初始状态 RUNNABLE,//运行状态 BLOCKED,// 阻塞状态 WAITING,//等待状态原创 2020-05-12 14:58:22 · 1998 阅读 · 0 评论 -
Java 经典面试题:聊一聊 JUC 下的 LinkedBlockingQueue
本文聊一下 JUC 下的 LinkedBlockingQueue 队列,先说说 LinkedBlockingQueue 队列的特点,然后再从源码的角度聊一聊 LinkedBlockingQueue 的主要实现~LinkedBlockingQueue 有以下特点:LinkedBlockingQueue 是阻塞队列,底层是单链表实现的~元素从队列尾进队,从队列头出队,符合FIFO~可以使用 ...原创 2020-05-08 13:18:02 · 937 阅读 · 0 评论 -
Java 经典面试题:聊一聊 JUC 下的 CopyOnWriteArrayList
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因:1、 ArrayList 自身的 elementData、size、modCount 在进行操作的时候,都没有加锁;2、这些变量没有被 volatile 修饰,在多线程的情况下,对这些变量操作可能会出现值被覆盖的情况;如果我们想在多线程情况下使用 A...原创 2020-05-07 15:00:08 · 912 阅读 · 0 评论 -
基于 XA 事务协议,用代码实现一个二阶段分布式事务
在上篇《漫谈分布式事务的那些解决方案》文章中,我提到了分布式事务的三种通用解决方案,但是没有具体的代码实现,有少小伙伴留言说原理知道了,但是还是不会写代码,那么这篇文章就简单聊一聊基于 XA 事务协议,用代码来实现二阶段提交。在具体的 Demo 之前,先来补充一点 XA 事务的知识:DTP 模型与 XA 规范。DTP 模型与 XA 规范是由 X/Open 维护,也就是现在的 open grou...原创 2020-04-29 13:46:08 · 1409 阅读 · 0 评论 -
戴上 CAP 这顶帽子,又能和面试官扯皮了
随着微服务和分布式系统的广泛运用,CAP 定理被大家熟悉起来,也成为了分布式系统的三大指标。这篇文章我们就来聊一聊 CAP 定理。CAP 定理1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:Consistency.Availability.Partition Tolerance.Eric Brewer 说,这三个指标不可能同时做到。然后就取首...原创 2020-04-29 13:39:27 · 721 阅读 · 0 评论 -
聊一聊二维码扫描登录原理
扫二维码登录现在比较常见,比如微信、支付宝等 PC 端登录,并且好像每款 APP 都支持扫码登录,不搞个扫码登录都不好意思。作为技术人员,不知道您对这背后的实现逻辑是否敢兴趣,反正我是一直都对这背后实现好奇。最近刚好看到一个关于扫码登录原理的视频,于是就整理出来了这篇文章,希望对您有所帮助。本文共三个主题:什么是二维码。移动端基于 token 的认证机制。二维码扫码登录的原理。1、什...原创 2020-04-01 08:59:24 · 1966 阅读 · 0 评论 -
JUC 中提供的限流利器-Semaphore(信号量)
在 JUC 包下,有一个 Semaphore 类,翻译成信号量,Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore 跟锁(synchronized、Lock)有点相似,不同的地方是,锁同一时刻只允许一个线程访问某一资源,而 Semaphore 则可以控制同一时刻多个线程访问某一资源。Semaphore(信号量)并不是...原创 2020-03-31 09:27:57 · 903 阅读 · 0 评论 -
使用消息中间件时,如何保证消息仅仅被消费一次?
消息中间件使用广泛,常用来削峰填谷、系统解耦、异步处理。异步处理可能是使用的最多的场景了,比如现在的技术博客网站,都采用积分制,用户发表一篇文章后,可以获取想要的积分,为了提升系统的性能,给用户加积分的操作可以异步处理,并不需要放在同步流程中。我们可以把用户ID,需要增加的积分封装成一条消息投递到消息系统中,异步处理加积分操作,由于这是发生在不同服务器之间,消息有可能投递失败、处理失败等问题,从...原创 2020-03-12 09:25:54 · 3017 阅读 · 4 评论 -
一分钟简单了解 JSON Web Token
JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。今天我们就来简单的认识一下 JSON Web Token。JWT 认证和 session认证的区别首先需要说明 JSON Web Token 是可以用于认证的,那么就先来对比一下 JSO...原创 2020-02-14 08:50:41 · 2495 阅读 · 1 评论 -
为什么TCP建立连接协议是三次握手,而关闭连接却是四次挥手呢?
看到了一道面试题:“为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?”,想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章,希望对你们有所帮助。TCP 连接我们先来补一下基础什么是 TCP 协议?传输控制协议( Transmission Control Protocol, TCP )是种面向连接、确保数据在端到端间可靠传输的协议。面向连...原创 2020-01-08 09:34:57 · 21702 阅读 · 10 评论 -
Java 浅拷贝、深拷贝,你知多少?
这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区。这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助。在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值、浅拷贝、深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存在一些误区,这篇文章会详细的介...原创 2019-12-04 11:10:42 · 6530 阅读 · 17 评论 -
list遍历方式效率分析
package list;import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.List;public class ListTest { public static void main(String[] args) { List<原创 2017-04-01 23:14:10 · 1846 阅读 · 0 评论 -
深入解析 ConcurrentHashMap 实现内幕,吊打面试官?没问题
在开发中,我们经常使用 HashMap 容器来存储 K-V 键值对,但是在并发多线程的情况下,HashMap 容器又是不安全的,因为在 put 元素的时候,如果触发扩容操作,也就是 rehash ,就会将原数组的内容重新 hash 到新的扩容数组中,但是在扩容这个过程中,其他线程也在进行 put 操作,如果这两个元素 hash 值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会...原创 2019-12-09 16:29:33 · 2430 阅读 · 6 评论 -
硬件内存模型到 Java 内存模型,这些硬核知识你知多少?
Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你碰到了半吊子面试官,那就要恭喜你了。Java 内存模型比 JVM 内存结构复杂很多,Java 内存模型有一个规范叫:《JSR 133 :Java内存模型与线程规范》,里面的内容很丰富,如果你没看过的话...原创 2019-11-12 09:54:02 · 2666 阅读 · 3 评论 -
这一次,终于系统的学习了 JVM 内存结构
最近在看《 JAVA并发编程实践 》这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课堂上,一直没有系统的学习这一块的知识,所以这一次我把《 深入理解Java虚拟机JVM高级特性与最佳实践 》、《 Java虚拟机规范 Java SE 8版 》这两本书中关于 JVM 内存结构的部分都看了一遍,算是...原创 2019-11-05 11:15:20 · 7769 阅读 · 21 评论 -
你的 Java 并发程序 Bug,100% 是这几个原因造成的
可见性问题可见性是指一个线程对共享变量进行了修改,其他线程能够立马看到该共享变量更新后的值,这视乎是一个合情合理的要求,但是在多线程的情况下,可能就要让你失望了,由于每个 CPU 都有自己的缓存,每个线程使用的可能是不同的 CPU ,这就会出现数据可见性的问题,先来看看下面这张图:对于一个共享变量 count ,每个 CPU 缓存中都有一个 count 副本,每个线程对共享变量 count ...原创 2019-10-29 23:10:00 · 4744 阅读 · 11 评论 -
内存崩溃了?其实你只需要换一种方式
在上一篇 Java 多线程爬虫及分布式爬虫架构探索 中,我们使用了 JDK 自带的 Set 集合来进行 URL 去重,看上去效果不错,但是这种做法有一个致命了缺陷,就是随着采集的 URL 增多,你需要的内存越来越大,最终会导致你的内存崩溃。那我们在不使用数据库的情况下有没有解决办法呢?还记得我们在上一篇文章中提到的布隆过滤器吗?它就可以完美解决这个问题,布隆过滤器有什么特殊的地方呢?接下来就一起来...原创 2019-10-28 12:09:58 · 2799 阅读 · 2 评论 -
Java 多线程爬虫及分布式爬虫架构探索
这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法。前面几篇文章我们把爬虫相关的基本知识都讲的差不多啦。这一篇我们来聊一聊爬虫架构相关的内容。前面几章内容我们的爬虫程序都是单线程,在我们调试爬虫程序的时候,单线程爬虫没什么问题,但是当我们在线上环境使用单线程爬虫程序去...原创 2019-10-16 09:25:55 · 3631 阅读 · 9 评论 -
Java 2019 生态圈使用报告,这结果你赞同吗?
这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告,主要调查了 Java 版本、开发框架、web 服务器等使用情况。虽然只有 7000 名开发者参与调查,这数目对于互联网从业者开始可以忽略不计,但是当你看完这份报告之后,再结合自身周围的情况,我相信你会非常认同这份调查报告,因为它真的太有代表性啦。1、JDK 版本使用情况Java13 在前段时间也正式发...原创 2019-10-14 12:22:57 · 3025 阅读 · 5 评论 -
Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器
这是 Java 爬虫系列博文的第四篇,在上一篇 Java 爬虫遇上数据异步加载,试试这两种办法! 中,我们从内置浏览器内核和反向解析法两个角度简单的聊了聊关于处理数据异步加载问题。在这篇文章中,我们简单的来聊一聊爬虫时,资源网站根据用户访问行为屏蔽掉爬虫程序及其对应的解决办法。屏蔽爬虫程序是资源网站的一种保护措施,最常用的反爬虫策略应该是基于用户的访问行为。比如限制每台服务器在一定的时间内只能访...原创 2019-10-12 09:27:07 · 2444 阅读 · 1 评论 -
HttpClient 三种 Http Basic Authentication 认证方式
Http Basic 简介HTTP 提供一个用于权限控制和认证的通用框架。最常用的 HTTP 认证方案是 HTTP Basic authentication。Http Basic 认证是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。优点基本认证的一个优点是基本上所有流行的网页浏览器都支持基本认证。基本认证很少在可公开访问的互联网网站上使用,...原创 2019-09-04 09:33:43 · 11417 阅读 · 1 评论 -
实现 Java 本地缓存,该从这几点开始
缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的。市面上有非常多的缓存工具,比如 Redis、Guava Cache 或者 EHcache。对于这些工具,我想大家肯定都非常熟悉,所以今天我们不聊它们,我们来聊一聊如何实现本地缓存。参考上面几种工具,要实现一个较好的本地缓存,平头哥认为要从以下三个方面开始。1、存储集合的选择实现本地缓存,存储容器肯定是 key/value 形式的数...原创 2019-09-11 09:12:02 · 9561 阅读 · 4 评论 -
Java String 对象,你真的了解了吗?
String 对象的实现String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对String对象的实现进行优化,以便提升String对象的性能,看下面这张图,一起了解一下String对象的优化过程。1. 在 Java6 以及之前的版本中String对象是对 char 数组进行了封装实现的对象,主要有四个成员变量: char 数组、偏移量 offset、字符数量...原创 2019-09-24 10:13:30 · 12128 阅读 · 9 评论 -
如何编写出高质量的 equals 和 hashcode 方法?
什么是 equals 和 hashcode 方法?这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object 中提供了 8 个基本的方法,equals 方法和 hashcode 方法就是其中的两个。equals 方法:Object 类中的 equals 方法用于检测一个对象是否等于另一个对象,在 Objec...原创 2019-09-27 09:46:38 · 6950 阅读 · 11 评论 -
从 Int 到 Integer 对象,细细品来还是有不少东西
int 是 Java 八大原始类型之一,是 Java 语言中为数不多不是对象的东西,Integer 是 int 的包装类,里面使用了一个 int 类型的变量来存储数据,提供了一些整数之间的常用操作,常规性的介绍就这么一点,程序员不喜欢说,程序员就喜欢源码,我们还是来看源码吧 * @author Lee Boynton * @author Arthur van Hoff * @author...原创 2019-09-29 09:26:29 · 4658 阅读 · 1 评论 -
学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少。有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬虫而且还能做的非常好,在开源社区中有不少优秀的 Java 网络爬虫框架,例如 webmagic 。我的第一份正式工作就是使用 webmagic 编写数据采集程序,当时参与了一个舆情分析系统的开发,这里...原创 2019-10-04 10:47:57 · 15780 阅读 · 22 评论 -
Java 网络爬虫,就是这么的简单
这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识。第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑列表新闻的新闻标题和详情页为例,需要提取的内容如下图所示:我们需要提取图中圈出来的文字及其对应的链接,在提取的过程中,我们会使用两种方式来提取,一种是 Jsoup 的方式,另一种是 httpcli...原创 2019-10-08 08:53:49 · 44224 阅读 · 69 评论 -
Java 爬虫遇到需要登录的网站,该怎么办?
这是 Java 网络爬虫系列博文的第二篇,在上一篇 Java 网络爬虫,就是这么的简单 中,我们简单的学习了一下如何利用 Java 进行网络爬虫。在这一篇中我们将简单的聊一聊在网络爬虫时,遇到需要登录的网站,我们该怎么办?在做爬虫时,遇到需要登陆的问题也比较常见,比如写脚本抢票之类的,但凡需要个人信息的都需要登陆,对于这类问题主要有两种解决方式:一种方式是手动设置 cookie ,就是先在网站上...原创 2019-10-09 09:15:24 · 19352 阅读 · 29 评论 -
Java 爬虫遇上数据异步加载,试试这两种办法!
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题,这也是爬虫中常见的问题。现在很多都是前后端分离项目,这会使得数据异步加载问题更加突出,所以你在爬虫时遇到这类问题不必惊讶,不必慌张。对于这类问题的解决办法总体来说有以下两种:1、内置一个浏览器内...原创 2019-10-10 06:55:19 · 4651 阅读 · 7 评论 -
easypoi 操作 excel 表格,这也太 easy 了吧
what is easypoi?easypoi是一款简化版的poi工具,让你不需要太多的poi知识就能够使用poi完成Excel和word的各种操作。easypoi官方文档,点击官方文档怎使用easypoi?1、创建一个springboot项目,在pom.xml中引入依赖 <dependency> <groupId>cn.af...原创 2019-07-29 22:06:07 · 3332 阅读 · 0 评论