Java基础
文章平均质量分 90
程序新视界
个人公众号【程序新视界】,一个硬技术,软实力同步提升的平台。《Spring Boo技术内幕:架构设计与实现原理》作者,《深入以太坊智能合约开发》联合作者之一。主要从事于三方支付行业。
展开
-
Java 21 的虚拟线程:高性能并发应用的福音
Java 21 最重要的特性之一就是虚拟线程 (JEP 444)。这些轻量级的线程降低了编写、维护和观察高吞吐量并行应用所需的努力。在讨论新特性之前,让我们先看一下当前的状态,以便更好地理解它试图解决什么问题以及带来了哪些好处。原创 2023-12-09 10:56:24 · 206 阅读 · 0 评论 -
API与Endpoint的区别,你知道多少?
API是一个众所周知的概念,当涉及到应用程序监控时,通常还会提到另一个概念——端点(Endpoint)。有时候这两个术语会被结合在一起使用,比如API端点。虽然它们有一定的关联,但也存在一些区别。那么,在概念和使用上,API和端点有什么区别呢?在本文中,我们将探讨这个话题。原创 2023-11-16 08:33:03 · 639 阅读 · 0 评论 -
Java的类与Golang的结构体的区别
Java作为一门面向对象(OOP)的编程语言,它有类(class)的存在,而对于Golang,它不完全遵从OOP编程语言的设计思想,但它也有类似Java类的结构存在,那就是结构体(struct)。这篇文章就带大家通过对比的形式来了解一下Java中的类与Golang中的结构体。通过对比讲解的好处是,能够更加透彻、深入的理解一个事物。在此,无论你的主语言是Java还是Golang,在对比的过程中都会有意外的收获的。原创 2023-11-12 10:39:44 · 421 阅读 · 0 评论 -
因为缩进风格不同,两个程序员分手了~
在HBO的喜剧片《硅谷》第三季中,不同的缩进风格导致了两位程序员分手。在现实编程中,缩进时使用空格键还是Tab键,也不是一个小问题。原创 2023-10-27 07:24:38 · 149 阅读 · 0 评论 -
Spring获取Bean的9种方式
随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。本文为大家整理汇总了常见的获取Bean的方式,并提供一些优劣分析,方便大家在使用到时有更好的选择。同时,也会为大家适当的普及和拓展一些相关知识。原创 2023-01-13 09:16:03 · 719 阅读 · 0 评论 -
一台机器下,多个Java版本的粗放与精细管理
在软件开发过程中,经常会遇到“古老”的项目,这些项目的JDK还处于Java 6、Java 7甚至更早的版本。同时,在学习新的JDK特性时,往往又需要安装最新版本的JDK。鉴于这些情况,我们就需要在在本机环境中安装多个JDK,并且能够方便的切换。本篇文章以Mac OS操作系统为例,演示一下如何安装多个JDK版本,并且进行切换。这里重点介绍两种方式,基于别名的形式和基于jenv软件的形式。原创 2022-11-02 09:04:37 · 526 阅读 · 2 评论 -
一篇搞定CAS,深度讲解,面试实践必备
CAS是的缩写,直译就是比较并交换。CAS是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令,这个指令会对内存中的共享数据做原子的读写操作。其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新。本质上来讲CAS是一种无锁的解决方案,也是一种基于乐观锁的操作,可以保证在多线程并发中保障共享资源的原子性操作,相对于synchronized或Lock来说,是一种轻量级的实现方案。C/C++...原创 2022-07-22 08:44:36 · 796 阅读 · 1 评论 -
不掌握这些坑,你敢用BigDecimal吗?
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于不需要准确计算精度的数字,可以直接使用Float和Double处理,但是Double.valueOf(String)和Float.valueOf(String)会丢失精度。所以如果需要精确计算的结果,则必须使用BigDecimal类来操作。...原创 2022-07-19 07:09:42 · 534 阅读 · 0 评论 -
JDK的一个Bug,监听文件变更要小心了
在某些业务场景下,我们需要自己实现文件内容变更监听的功能,比如:监听某个文件是否发生变更,当变更时重新加载文件的内容。看似比较简单的一个功能,但如果在某些JDK版本下,可能会出现意想不到的Bug。本篇文章就带大家简单实现一个对应的功能,并分析一下对应的Bug和优缺点。监听文件变动并读取文件,简单的思路如下:这里写一个简单功能实现(不包含定时任务部分)的demo:在上述代码中,先创建一个文件(方便测试),然后两次读取文件的修改时间,并用LAST_TIME记录上次修改时间。如果文件的最新更改时间与上一次不一致原创 2022-07-06 17:34:45 · 5671 阅读 · 5 评论 -
奇怪,为什么ArrayList初始化容量大小为10?
看ArrayList源码时,无意中看到ArrayList的初始化容量大小为10,这就奇怪了!我们都知道ArrayList和HashMap底层都是基于数组的,但为什么ArrayList不像用HashMap那样用16作为初始容量大小,而是采用10呢?于是各方查找资料,求证了这个问题,这篇文章就给大家讲讲。在聊ArrayList的初始化容量时,要先来回顾一下HashMap的初始化容量。这里以Java 8源码为例,HashMap中的相关因素有两个:初始化容量及装载因子:在HashMap当中,数组的默认初始化容量为原创 2022-06-18 17:12:12 · 727 阅读 · 2 评论 -
使用HTTP Client踩到的一个坑,你一定要避免
前言作为软件开发者,我们知道一切看似正常的系统,不知埋藏着多少坑。今天跟大家分享一个实战过程中遇到的HTTP Client使用不当导致的坑。笔者通过问题的表象一路追踪下去,最终找到导致问题的根源:HTTP Client。结论很简单,先卖个关子,但分析的过程值得你借鉴。问题现象场景:几乎每个系统都有异步调用三方服务的功能,所负责的系统基于阻塞队列实现了一个消息队列,来调用三方服务。为了确保幂等性,队列是顺序消费。这就导致一个问题,一旦其中一个消息被阻塞,后面的消息就无法消费。当队列满时,也无法向队列中原创 2022-04-29 06:43:24 · 750 阅读 · 0 评论 -
捕获了一只发生概率小于万分之一的Bug
前言在开始这篇文章之前想先说一句:如果一套系统暂时没问题,那只是因为它的并发量不够而已。上周在查看系统日志时,发现了一条与众不同的日志。日志中有一半内容是正常的报文数据,而另一半内容是0x00这样的空数据。虽然系统没抛出任何异常,但这些日志肯定是反常的。多年的经验告诉我,这其中一定有什么不对的地方,加上好奇心的驱使,终于揭开了一个隐藏非常深的Bug。有时候找到Bug,解决Bug很容易,难的是如何发现Bug,并推理出哪里出问题解决。下面就带大家来剖析一下这个Bug。奇怪的日志输出一个调用外部接口的原创 2022-04-21 21:10:17 · 4754 阅读 · 8 评论 -
架构师聊的四层代理和七层代理,都在聊什么?
日常与大佬沟通或看文章,时不时总会遇到两个概念“四层代理负载均衡”和“七层代理负载均衡”,那么,所谓的四层代理和七层代理分别指的是什么?又在什么场景下用到呢?这篇文章就带大家聊聊这方面的知识点。OSI七层模型要聊几层代理,需要先看一下网络分层,在之前的文章中也提到,标准的七层网络分层,也就是OSI七层模型。TCP/IP五层模型和TCP/IP四层模型是从OSI七层优化而来。这里所谈的四层代理和七层代理,便是基于OSI七层模型来划分的。从下往上看,第四层为传输层、第七层为应用层。再来看看每层对应的常见原创 2022-01-20 20:59:01 · 2828 阅读 · 0 评论 -
HttpClient使用不当,服务挂了,是时候系统学习一下了
背景最近发生了两件事,觉得有必要系统的学习一下Apache的HttpClient了。事件一:联调微信支付接口,用到HttpClient,花时间整理了一番。如果有一篇文章,读一读就可以掌握HttpClient 80%的内容,再有可以直接用的Demo,下次再遇到是不是就可以非常容易集成了?这篇便是这篇文章的目标之一。事件二:上家公司同事发消息求助,说系统JVM溢出,找不到原因不了。查看了发来的日志文件,基本定位是HttpClient调用三方接口时内存溢出导致的。无论出于哪种原因,HTTP调用的熟练使用都原创 2021-12-20 09:32:19 · 1021 阅读 · 0 评论 -
大厂都在用EhCache,它到底比Redis强在哪里?
故事背景随着硬件价格的走低,大家对硬件的依赖越来越高。甚至听说,代码不重要,不行就加机器呗。比如缓存的使用,通常有基于虚拟机内存、基于磁盘存储、基于中间件(Redis内存)等方式,我们都知道,最适合的才是最好的,但实践中,往往是动不动就直接上Redis。那么,Redis一定是最好的选择吗?单不说对内存的要求,从效率和性能上来说,也未必是最优的。所以,不同的场景使用不同的缓存策略才是高手应该追求的。这篇文章就带大家认识除Redis之外的另一种缓存框架:EhCache。之所以要写写,也是因为项目中运用了此原创 2021-12-15 09:40:44 · 1752 阅读 · 3 评论 -
Log4j史诗级漏洞,从原理到实战,只用3个实例讲明白
背景最近互联网技术圈最火的一件事莫过于Log4j2的漏洞了。同时也涌现出了各类分析文章,关于漏洞的版本、漏洞的原因、漏洞的修复、程序员因此加班等等。经常看我文章的朋友都知道,面对这样热门有意思的技术点,怎能错过深入分析一波呢?大概你也已经听说了,造成漏洞的”罪魁祸首“是JNDI,今天我们就聊它。JNDI,好熟悉,但……熟悉的陌生人?JNDI到底是个什么鬼?好吧,如果你已经有一两年的编程经验,但还不了解JNDI,甚至没听说过。那么,要么赶紧换工作,要么赶紧读读这篇文章。JNDI是个什么鬼?说起JND原创 2021-12-13 10:03:29 · 14270 阅读 · 7 评论 -
Log4j史诗级漏洞,我们这些小公司能做些什么?
事件背景12月10日,看到朋友圈中已经有人在通宵修改、上线系统了。随即,又看到阿里云安全、腾讯安全部门发出的官方报告:”Apache Log4j2存在远程代码执行漏洞“,且漏洞已对外公开。看到相关消息,马上爬起来把所有项目的日志系统过滤一遍,还好老项目采用的log4j,新项目采用的logback,没有中招。随后就看到朋友圈铺天盖地的相关消息。作为一个史诗级的事件,紧急修改漏洞是必然的。作为程序员,如果看到这则消息,连去核查一下系统都做不到,那真的不是一个合格的程序员。经历过这次事件,不仅是看热闹而已原创 2021-12-11 09:18:35 · 6036 阅读 · 22 评论 -
一个HTTPS转HTTP的Bug,他们忍了2年,原谅我无法接受,加班改了
今天这篇文章给大家讲一个追查Bug的故事和过程。个人一直认为:事出反常必有妖,程序中的Bug也是如此。希望通过这个Bug的排查故事,大家不仅能够学到一系列的知识点,同时也能学会如何解决问题,如何更加专业的做事。而解决问题的方式及思维比单纯的技术更加重要。Let’s go!故事的起因刚接手新团队新项目没多久,在发布一个系统时,同事友善的提醒:发布xx系统时,在测试环境要注释掉一行代码,上线发布时再放开注释。听此友善提醒,一惊:这又是什么黑科技啊?!在我的经验里,还没有什么系统需要这样处理,暗下决心要原创 2021-11-24 07:23:32 · 2501 阅读 · 3 评论 -
还在用new Date计算任务执行时间?强烈建议使用这个API
在实践过程中,我们经常需要记录一个任务执行的耗时,这是评价代码好坏,评测代码性能,排查业务执行问题的重要操作。那么,你是如何来获取并计算任务执行耗时的呢?通过new Date获得时间进行换算?还是有更好的方案?本文给你答案。获取任务耗时通常做法获取任务耗时,最简单的方式就是打印当前时间与任务开始执行时间的差值,实例代码如下: @Test public void testElapsedTimes() throws InterruptedException { long startTime = n原创 2021-11-05 07:52:19 · 454 阅读 · 1 评论 -
90%的人以为会用ThreadPoolExecutor了,看了这10张图再说吧
在阿里巴巴手册中有一条建议:【强制】线程池不允许使用 Executors 去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。如果经常基于Executors提供的工厂方法创建线程池,很容易忽略线程池内部的实现。特别是拒绝策略,因使用Executors创建线程池时不会传入这个参数,直接采用默认值,所以常常被忽略。下面我们就来了解一下线程池相关的实现原理、API以及实例。线程池的作用在实践应用中创建线程池主要是为了:原创 2021-11-02 08:03:10 · 1026 阅读 · 0 评论 -
99%的人没弄懂volatile的设计原理,更别说灵活运用了
写volatile的文章非常多,本人也看过许多相关文章,但始终感觉有哪里不太明白,但又说不上来说为什么。可能是过于追求底层实现原理,老想问一个为什么吧。而写这篇文章的目的很简单,就是突然之间明白了volatile为什么要这样设计了。好东西当然要拿出来分享了,于是就有了这篇文章。我们就从硬件到软件,再到具体的案例来聊聊volatile的底层原理,文章比较长,可收藏之后阅读。CPU缓存的出现最初的CPU是没有缓存区的,CPU直接读写内存。但这就存在一个问题,CPU的运行效率与读写内存的效率差距百倍以上。原创 2021-10-08 09:05:56 · 2913 阅读 · 6 评论 -
Maven Jar包冲突?看看高手是怎么解决的
接手了一套比较有年代感的系统,计划把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家。【重构02篇】:Maven项目Jar包管理机制、冲突解决。知识背景Jar包冲突在软件开发过程中是不可避免的,因此,如何快速定位冲突源,理解冲突导致的过程及底层原理,是每个程序员的必修课。也是提升工作效率、应对面试、在团队中脱颖而出的机会。实践中能够直观感受到的Jar包冲突表现往往有这几种:程序抛出java.lang.ClassNotFoundException异常;程序抛出java.lan原创 2021-10-06 08:51:12 · 2646 阅读 · 3 评论 -
从Jar包冲突搞到类加载机制,就是这么霸气
接手了一套比较有年代感的系统,计划把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家。【重构01篇】,给大家讲讲Jar包冲突及原理。背景目前市面上项目管理要么是基于Maven,要么是基于Gradle,最近接手了一套纯手动添加jar包的项目。对于纯手动添加jar包的项目已经是多年前的方式了,现在工作三五年的技术人员可能都没有经历过。就是把项目中所需的jar包挨个找出来,添加到一个lib目录中,在IDE中再将jar包依赖手动添加上。这种方式来添加jar包依赖,不仅费事,而且很容易出原创 2021-10-05 09:05:40 · 783 阅读 · 0 评论 -
05 网络面经:使用HTTPS就绝对安全了吗?
朋友面试阿里,关于HTTPS被问了三道题,看看你能回到上几道题。第一,为什么使用HTTPS之后,通信就安全了?第二,HTTPS实现通信安全的原理是什么?第三,使用了HTTPS就绝对安全了吗?本篇文章就带大家一起聊聊HTTPS,顺便解答上面三个问题。关于HTTPS前面学习过HTTP协议的报文格式及交互模式,我们知道HTTP传输的内容本质上就是文本,HTTP/2采用了二进制字节的形式传输,但依旧可以进行反编译。也就是说,在通信的过程中只要拦截对应的请求,就可以获得通信的报文信息。从这个层面来讲,我们原创 2021-09-03 07:28:33 · 703 阅读 · 2 评论 -
04 网络面经:HTTP 2.0的这些新特性,是时候了解一下了
面试中关于HTTP 2.0的面试题并不多,但基于HTTP 2.0的应用已经很多了,比如谷歌的gRPC框架就是基于HTTP 2.0来提升效率的。同时,HTTP 1.0中的存在的很多缺陷也都在HTTP 2.0中得到了解决。所以,如果你在面试中脱颖而出,同时,在实践中更好的理解类似gRPC这类框架的实现,了解HTTP 2.0还是非常必要的。而且HTTP 2.0也在很多场景下逐步替代HTTP 1.0。HTTP 1.0存在的问题了解过HTTP 1.0的协议实现之后,会发现它存在不少问题。问题一:TCP连接数限原创 2021-08-31 21:59:35 · 420 阅读 · 1 评论 -
03 网络面经:你真的了解Cookie和Session吗?
在初级面试中,关于Cookie和Session的区别是一个高频的面试题。如果只是机械的回答一下它们的区别,那你可能真的不了解Cookie和Session,就更别说灵活运用了。这篇文章带你从Cookie和Session的初级应用到高级应用捋一遍,看看有多少不知道的内容。什么是Cookie?我们知道HTTP协议是无状态的,一次请求完成,不会持久化请求与相应的信息。那么,在购物车、用户登录状态、页面个性化设置等场景下,就无法识别特定用户的信息。这时Cookie就出现了。Cookie是客户端保存用户信息的一原创 2021-08-26 07:25:48 · 387 阅读 · 0 评论 -
02 网络面经:一个TCP连接可以发送多少个HTTP请求?
一个TCP连接可以发送多少个HTTP请求?就这这个问题,我们聊聊TCP、HTTP以及浏览器之间的关系和对请求处理的优化。TCP与HTTP的渊源我们知道TCP协议对应于传输层,HTTP协议对应于应用层。WEB项目中,HTTP协议是建立在TCP的基础上的。最初浏览器从服务器加载一个网页,会发起一个HTTP请求,这时需要先建立一个TCP连接。当本次数据请求完毕之后,会立刻断开TCP连接。但随着时间的推理,HTML网页内容越来越复杂,不仅有内容,还有JS、CSS和图片资源,每个资源的请求都建立一次TCP连接原创 2021-08-25 09:27:43 · 3364 阅读 · 9 评论 -
01网络面经:你每天都用的HTTP协议,到底是什么鬼?
作为开发人员,每天都在使用HTTP协议,但是否详细了解过一下该协议的构成及特性吗?本文就带大家全面的梳理一下。先来看一下本篇文章涉及到的知识点脑图。脑图原文件可在公众号【程序新视界】内回复“http”获得。下面,看具体关于HTTP协议的介绍。HTTP协议简介超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。HTTP协议基本格式:协议://服务器IP:[端口]/路径/[?查询原创 2021-08-24 07:52:27 · 378 阅读 · 0 评论 -
双重检查锁,原来是这样演变来的,你了解吗
在看Nacos的源代码时,发现多处都使用了“双重检查锁”的机制,算是非常好的实践案例。这篇文章就着案例来分析一下双重检查锁的使用以及优势所在,目的就是让你的代码格调更加高一个层次。同时,基于单例模式,讲解一下双重检查锁的演变过程。Nacos中的双重检查锁在Nacos的InstancesChangeNotifier类中,有这样一个方法:private final Map<String, ConcurrentHashSet<EventListener>> listenerMap原创 2021-08-17 07:24:31 · 817 阅读 · 2 评论 -
Java中定时任务的6种实现方式,你知道几种?
几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损。还记得多年前在做金融系统时,出款业务是通过定时任务对外打款,当时由于银行接口处理能力有限,外加定时任务使用不当,导致发出大量重复出款请求。还好在后面环节将交易卡在了系统内部,未发生资损。所以,系统的学习一下定时任务,是非常有必要的。这篇文章就带大家整体梳理学习一下Java领域中常见的几种定时任务实现。线程等待实现先从最原始最简单的方式来讲解。可以先创建一个thread,然后让它在while循环里一直运行着,通过sleep方法原创 2021-08-05 07:37:06 · 59267 阅读 · 9 评论 -
Protocol Buffers,一款比xml快100倍的序列化框架
我们通常习惯用Json、XML等形式的数据存储格式,但相信还有很多人没有听说过Protocol Buffer(简称protobuf)。protobuf是Google开源的一个语言无关、平台无关的通信协议,其小巧、高效和友好的兼容性设计,使其被广泛使用。性能比Json、XML真的强太多了!而且,随着微服务架构的流行,RPC框架也成为服务框架的重要组成部分。在很多RPC的设计中,都采用了高性能的编解码技术,而protobuf就属于其中的佼佼者。也就说,要想深入了解微服务架构中的RPC环节底层实现,设计出高效原创 2021-08-03 07:35:11 · 548 阅读 · 0 评论 -
使用了synchronized,竟然还有线程安全问题!
实战中受过的伤,才能领悟的更透彻,二师兄带你分析实战案例。线程安全问题一直是系统亘古不变的痛点。这不,最近在项目中发了一个错误使用线程同步的案例。表面上看已经使用了同步机制,一切岁月静好,但实际上线程同步却毫无作用。关于线程安全的问题,基本上就是在挖坑与填坑之间博弈,这也是为什么面试中线程安全必不可少的原因。下面,就来给大家分析一下这个案例。有隐患的代码先看一个脱敏的代码实例。代码要处理的业务逻辑很简单,就是多线程访问一个单例对象的成员变量,对其进行自增处理。SyncTest类实现了Runna.原创 2021-07-26 06:50:59 · 566 阅读 · 0 评论 -
一篇文章,只用看三遍,终生不忘网络分层
前言如果你对网络分层不太了解,当听到三层协议、五层协议时是不是一头雾水?不知道所谓的层是什么,所谓的协议是什么?甚至对网络通信都知之甚少,那么这篇文章一定能够让你快速学到,如果没有收获就别点赞。网络、通信、协议在深入学习之前,先了解一些基本的概念。网络是什么?网络是用物理链路将工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。这里的物理链路不仅仅指的是我们能够看得到的双绞线、光纤,也可能是无线电波。网络通信,狭义的讲,可以理解为计算机与计算机之间基于网络进行的数据交换。当然,这个原创 2021-06-12 10:41:09 · 4177 阅读 · 19 评论 -
REST API返回结果对象设计
基于REST API的项目返回的数据结构题都是统一的,这样方便接口对接和使用。因此,对结果对象的设计会有一定的要求:一个结果对象要能够同时支持成功和失败的数据结构;要能够处理多种类的返回结果对象;能够很轻易的判断出结果是成功还是失败;能够存储错误编码和错误信息;下面就基于Spring Boot项目来设计一下对应的统一结果返回对象。这里定义对应的类为ApiResponse:import com.fasterxml.jackson.annotation.JsonCreator;import c原创 2021-05-13 09:40:45 · 1057 阅读 · 3 评论 -
String拼接出现null?你看到的分析可是错的
前言String类型真是个神奇的存在,动不动就会出现一些迷惑人的错误。今天看到一篇文中提到当String的值为null时,进行字符串相加拼接,会出现把null当做字符串拼接的现象。比如下面这段代码:String s = null;s = s + "hello";System.out.println(s + " world");你预期的结果可能是“hello world”,但实际的结果是“nullhello world”,神奇吧。其实这倒没什么,实践一下就可以看到结果。但当你好奇心作祟,在网上原创 2021-05-12 09:16:06 · 6132 阅读 · 5 评论 -
Nacos中已经有Optional使用案例了,是时候慎重对待这一语法了
前言Java 8提供了很多新特性,但很多朋友对此并不重视,依旧采用老的写法。最近个人在大量阅读开源框架的源码,发现Java 8的很多API已经被频繁的使用了。以Nacos框架为例,已经有很典型的Optional使用案例了,而且场景把握的非常好。如果此时你还没意识到要学习了解一下,以后看源代码可能都有些费劲了。今天这篇文章我们就基于Nacos中对Optional的使用作为案例,来深入讲解一下Optional的使用。老规矩,源码、案例、实战,一样不少。Nacos中的Optional使用在Nacos中有原创 2021-05-10 06:52:56 · 5140 阅读 · 3 评论 -
String最大长度是多少?涉及知识面太多,不要错过!
前言当你看到这个问题“String长度限制是多少”时是不是感觉很无聊?的确,这就是我第一眼看到时的感觉。但当深入追踪该问题时,才发现String的长度限制本身的意义并不重要,重要的是在此过程中会将大量知识点串联起来,简直是一个完美的问题。难怪在高阶段的面试中会出现类似的问题。本篇文章就来带大家追寻String长度的限制,需要提醒读者的是,结论并不重要,重要的是分析的过程,以及涉及到的知识储备。比如,String的底层实现、int类型的范围、《Java虚拟机规范》、Java编译器源码实现等大量知识点。原创 2021-05-07 09:20:46 · 8587 阅读 · 3 评论 -
你给HashMap初始化了容量,却让性能变加更糟?
前言项目中,看到大家已经意识到初始化HashMap时给Map指定初始容量大小,甚是欣慰。但仔细一看,发现事情好像又有一些不对头。虽然指定了大小,却让性能变得更加糟糕了。可能你也是如此,看了《阿里巴巴Java开发手册》感觉学到了很多,于是在实践中开始尝试给Map指定初始大小,并感觉自己写的代码高大上了一些。的确,当你意识到指定初始化值时,已经比普通人更进了一步,但是如果这个值指定的不好,程序的性能反而不如默认值。这篇文章就来从头到尾分析一下,读者多注意分析的方法和底层的原理实现。阿里开发规范我们先原创 2021-05-05 08:55:52 · 5474 阅读 · 5 评论 -
Nacos源码中为什么使用了String.intern方法?
前言面试的时候经常被问到String的intern方法的调用及内存结构发生的变化。但在实际生产中真正用到过了吗,看到过别人如何使用了吗?最近阅读Nacos的源码,还真看到代码中使用String类的intern方法,NamingUtils类中有这样一个方法: public static String getGroupedName(final String serviceName, final String groupName) { // ...省略参数校验部分 final String原创 2021-04-28 07:16:03 · 464 阅读 · 0 评论 -
ThreadLocal全攻略:使用实战,源码分析,内存泄露分析
前言说起ThreadLocal即便你没有直接用到过,它也间接的出现在你使用过的框架里,比如Spring的事物管理,Hibernate的Session管理、logback(和log4j)中的MDC功能实现等。而在项目开发中,比如用到的一些分页功能的实现往往也会借助于ThreadLocal。正是因为ThreadLocal的无处不在,所以在面试的时候也经常会被问到它的实现原理、核心API使用以及内存泄露的问题。而且基于这些问题还可以拓展到线程安全方面、JVM内存管理与分析、Hash算法等等知识点。可见Thr原创 2021-04-24 08:33:27 · 1015 阅读 · 3 评论