Java 核心技术
文章平均质量分 94
Java 核心技术
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
一份Java工程师必读书单
关于这本书的阅读,我的建议是边学习边回顾,在吸收书中的经验时,多去想想自己在实际应用中是如何处理的。Netty 在性能、可扩展性等方面的突出表现,已经得到充分验证,作为基础的通信框架,已经广泛应用在各种互联网架构、游戏等领域,甚至可以说,如果没有仔细分析过 Netty,对 NIO 等方面的理解很可能还在很肤浅的阶段。这本书的特点是,不仅仅介绍 Java 编程的基础知识点,也会思考编程中的各种选择与判断,包括穿插设计模式的使用,作者从理论到实践意义从不同的角度进行探讨,构建稳固的 Java 编程知识体系。原创 2024-05-21 14:28:23 · 594 阅读 · 0 评论 -
谈谈对Java学习和面试的看法
对于底层技术,这个确实是比较有争议的问题,我个人并不觉得什么东西都要理解底层,懂当然好,但不能代表一切,毕竟知识和能力是有区别的,当然我们也要尊重面试官的要求。毕竟,除了特别的岗位,大多数任务,如果有良好的技术素养和工作热情,再配合一定经验,基本也就能够保证胜任了。在交流的过程中你会发现,很多似是而非的理解,竟然在试图组织语言的时候,突然就想明白了,而且别人的观点也验证了自己的判断。,比如,以 debug 某个问题的角度,结合实践去验证,让自己能够感到收获,既加深理解,也有实际帮助,激励我们坚持下来。原创 2024-05-21 12:02:40 · 280 阅读 · 0 评论 -
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
专栏的绝大部分主题都侧重于 Java 语言和虚拟机,基本都是单机模式下的问题,今天我会补充一个分布式相关的问题。严格来说,分布式并不算是 Java 领域,而是一个单独的大主题,但确实也会在 Java 技术岗位面试中被涉及。在准备面试时,如果有丰富的分布式系统经验当然好;如果没有,你可以选择典型问题和基础技术进行适当准备。关于分布式,我自身的实战经验也非常有限,专栏里就谈谈从理论出发的一些思考。今天要问你的问题是,谈谈常用的分布式 ID 的设计方案?Snowflake 是否受冬令时切换影响?原创 2024-05-21 11:29:45 · 925 阅读 · 0 评论 -
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
今天会对 NIO 进行一些补充,在专栏第 11 讲中,我们初步接触了 Java 提供的几种 IO 机制,作为语言基础类库,Java 自身的 NIO 设计更偏底层,这本无可厚非,但是对于一线的应用开发者,其复杂性、扩展性等方面,就存在一定的局限了。在基础 NIO 之上,Netty 构建了更加易用、高性能的网络框架,广泛应用于互联网、游戏、电信等各种领域。今天要问你的问题是,对比 Java 标准 NIO 类库,你知道 Netty 是如何实现更高性能的吗?原创 2024-05-21 09:59:44 · 791 阅读 · 0 评论 -
第37讲 | 谈谈Spring Bean的生命周期和作用域?
在企业应用软件开发中,Java 是毫无争议的主流语言,开放的 Java EE 规范和强大的开源框架功不可没,其中 Spring 毫无疑问已经成为企业软件开发的事实标准之一。今天这一讲,将补充 Spring 相关的典型面试问题,并谈谈其部分设计细节。今天要问你的问题是,谈谈 Spring Bean 的生命周期和作用域?原创 2024-05-20 18:05:40 · 1002 阅读 · 0 评论 -
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一。做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种数据库自身体系结构的理解。今天这一讲,作为补充 Java 面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习。今天要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?原创 2024-05-20 17:07:54 · 594 阅读 · 0 评论 -
第35讲 | JVM优化Java代码时都做了什么?
在专栏上一讲介绍了微基准测试和相关的注意事项,其核心就是避免 JVM 运行中对 Java 代码的优化导致失真。所以,系统地理解 Java 代码运行过程,有利于在实践中进行更进一步的调优。今天要问你的问题是,JVM 优化 Java 代码时都做了什么?原创 2024-05-20 16:27:13 · 1006 阅读 · 0 评论 -
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
在上一讲中,介绍了 Java 性能问题分析的一些基本思路。但在实际工作中,我们不能仅仅等待性能出现问题再去试图解决,而是需要定量的、可对比的方法,去评估 Java 应用性能,来判断其是否能够符合业务支撑目标。今天这一讲,我会介绍从 Java 开发者角度,如何从代码级别判断应用的性能表现,重点理解最广泛使用的基准测试(Benchmark)。今天要问你的问题是,有人说“Lambda 能让 Java 程序慢 30 倍”,你怎么看?为了让你清楚地了解这个背景,请参考下面的代码片段。原创 2024-05-20 15:52:55 · 594 阅读 · 0 评论 -
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
在日常工作中,应用或者系统出现性能问题往往是不可避免的,除了在有一定规模的 IT 企业或者专注于特定性能领域的企业,可能大多数工程师并不会成为专职的性能工程师,但是掌握基本的性能知识和技能,往往是日常工作的需要,并且也是工程师进阶的必要条件之一,能否定位和解决性能问题也是对你知识、技能和能力的检验。今天要问你的问题是,后台服务出现明显“变慢”,谈谈你的诊断思路?原创 2024-05-20 15:16:46 · 1111 阅读 · 0 评论 -
第32讲 | 如何写出安全的Java代码?
在上一讲中,我们已经初步接触了 Java 安全,今天我们将一起探讨更多 Java 开发中可能影响到安全的场合。很多安全问题,在特定的上下文,存在着不同的定义,尽管本质是相似或一致的,这是由于 Java 平台自身的特性所带来特有的问题。今天这一讲将侧重于 Java 开发者的角度谈代码安全,而不是讲广义的安全风险。今天要问你的问题是,如何写出安全的 Java 代码?原创 2024-05-20 14:33:35 · 941 阅读 · 0 评论 -
第31讲 | 你了解Java应用开发中的注入攻击吗?
安全是软件开发领域永远的主题之一,随着新技术浪潮的兴起,安全的重要性愈发凸显出来,对于金融等行业,甚至可以说安全是企业的生命线。不论是移动设备、普通 PC、小型机,还是大规模分布式系统,以及各种主流操作系统,Java 作为软件开发的基础平台之一,可以说是无处不在,自然也就成为安全攻击的首要目标之一。今天要问你的问题是,你了解 Java 应用开发中的注入攻击吗?原创 2024-05-20 11:55:46 · 775 阅读 · 0 评论 -
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
如今,Docker 等容器早已不是新生事物,正在逐步成为日常开发、部署环境的一部分。Java 能否无缝地运行在容器环境,是否符合微服务、Serverless 等新的软件架构和场景,在一定程度上也会影响未来的技术栈选择。当然,Java 对 Docker 等容器环境的支持也在不断增强,自然地,Java 在容器场景的实践也逐渐在面试中被涉及。希望通过专栏今天这一讲,能够帮你能做到胸有成竹。今天要问你的问题是,Java 程序运行在 Docker 等容器环境有哪些新问题?原创 2024-05-20 10:45:29 · 730 阅读 · 0 评论 -
第29讲 | Java内存模型中的happen-before是什么?
Java 语言在设计之初就引入了线程的概念,以充分利用现代处理器的计算能力,这既带来了强大、灵活的多线程机制,也带来了线程安全等令人混淆的问题,而 Java 内存模型(Java Memory Model,JMM)为我们提供了一个在纷乱之中达成一致的指导准则。今天要问你的问题是,Java 内存模型中的 happen-before 是什么?原创 2024-05-17 18:19:00 · 695 阅读 · 0 评论 -
第28讲 | 谈谈你的GC调优思路?
目前不少外部资料对 G1 的介绍大多还停留在 JDK 7 或更早期的实现,很多结论已经存在较大偏差,甚至一些过去的 GC 选项已经不再推荐使用。所以,今天会选取新版 JDK 中的默认 G1 GC 作为重点进行详解,并且我会从调优实践的角度,分析典型场景和调优思路。下面我们一起来更新下这方面的知识。今天要问你的问题是,谈谈你的 GC 调优思路?原创 2024-05-17 09:54:41 · 676 阅读 · 0 评论 -
第27讲 | Java常见的垃圾收集器有哪些?
垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。今天要问你的问题是,Java 常见的垃圾收集器有哪些?原创 2024-05-16 18:16:25 · 1046 阅读 · 0 评论 -
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
上一讲介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数、工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分。今天要问你的问题是,如何监控和诊断 JVM 堆内和堆外内存使用?原创 2024-05-16 17:24:41 · 2049 阅读 · 0 评论 -
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
今天,将从内存管理的角度,进一步探索 Java 虚拟机(JVM)。垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得 JVM 内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是 Java 工程师进阶的必备能力。今天要问你的问题是,谈谈 JVM 内存区域的划分,哪些区域可能发生 OutOfMemoryError?原创 2024-05-16 11:53:34 · 651 阅读 · 0 评论 -
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
在开始今天的学习前,建议先复习一下专栏第 6 讲有关动态代理的内容。作为 Java 基础模块中的内容,考虑到不同基础的同学以及一个循序渐进的学习过程,我当时并没有在源码层面介绍动态代理的实现技术,仅进行了相应的技术比较。但是,有了上一讲的类加载的学习基础后,是时候该进行深入分析了。今天要问你的问题是,有哪些方法可以在运行时动态生成一个 Java 类?原创 2024-05-16 10:48:25 · 673 阅读 · 0 评论 -
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件,也是个面试考察热点。今天要问你的问题是,请介绍类加载过程,什么是双亲委派模型?原创 2024-05-16 09:18:16 · 560 阅读 · 0 评论 -
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
在今天这一讲中,分析一下并发包内部的组成,一起来看看各种同步结构、线程池等,是基于什么原理来设计和实现的。今天要问你的问题是,AtomicInteger 底层实现原理是什么?如何在自己的产品代码中应用 CAS 操作?原创 2024-05-15 18:15:47 · 688 阅读 · 0 评论 -
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
在专栏第 17 讲中介绍过线程是不能够重复启动的,创建或销毁线程存在一定的开销,所以利用线程池技术来提高系统资源利用效率,并简化线程管理,已经是非常成熟的选择。今天要问你的问题是,Java 并发类库提供的线程池有哪几种?分别有什么特点?原创 2024-05-15 18:05:10 · 1051 阅读 · 0 评论 -
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
在上一讲中,分析了 Java 并发包中的部分内容,今天我来介绍一下线程安全队列。Java 标准库提供了非常多的线程安全队列,很容易混淆。今天要问你的问题是,并发包中的 ConcurrentLinkedQueue 和 LinkedBlockingQueue 有什么区别?原创 2024-05-15 17:42:15 · 944 阅读 · 0 评论 -
第19讲 | Java并发包提供了哪些并发工具类?
通过前面的学习,我们一起回顾了线程、锁等各种并发编程的基本元素,也逐步涉及了 Java 并发包中的部分内容,相信经过前面的热身,我们能够更快地理解 Java 并发包。今天要问你的问题是,Java 并发包提供了哪些并发工具类?原创 2024-05-15 17:11:08 · 997 阅读 · 0 评论 -
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
今天,会介绍一些日常开发中类似线程死锁等问题的排查经验,并选择一两个我自己修复过或者诊断过的核心类库死锁问题作为例子,希望不仅能在面试时,包括在日常工作中也能对你有所帮助。今天我要问你的问题是,什么情况下 Java 程序会产生死锁?如何定位、修复?原创 2024-05-15 16:40:57 · 1100 阅读 · 0 评论 -
第17讲 | 一个线程两次调用start()方法会出现什么情况?
今天我们来深入聊聊线程,相信大家对于线程这个概念都不陌生,它是 Java 并发的基础元素,理解、操纵、诊断线程是 Java 工程师的必修课,但是你真的掌握线程了吗?今天要问你的问题是,一个线程两次调用 start() 方法会出现什么情况?谈谈线程的生命周期和状态转移。原创 2024-05-15 15:52:19 · 1168 阅读 · 0 评论 -
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
在上一讲对比和分析了 synchronized 和 ReentrantLock,算是专栏进入并发编程阶段的热身,相信你已经对线程安全,以及如何使用基本的同步机制有了基础,今天我们将深入了解 synchronize 底层机制,分析其他锁实现和应用场景。今天要问你的问题是 ,synchronized 底层如何实现?什么是锁的升级、降级?原创 2024-05-15 15:35:42 · 1075 阅读 · 0 评论 -
第15讲 | synchronized和ReentrantLock有什么区别呢?
从今天开始,我们将进入 Java 并发学习阶段。软件并发已经成为现代软件开发的基础能力,而 Java 精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发基本功也成为各个公司面试 Java 工程师的必选项。今天要问你的问题是,synchronized 和 ReentrantLock 有什么区别?有人说 synchronized 最慢,这话靠谱吗?原创 2024-05-14 18:09:35 · 987 阅读 · 0 评论 -
第14讲 | 谈谈你知道的设计模式?
设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的“行话”的作用。理解和掌握典型的设计模式,有利于我们提高沟通、设计的效率和质量。今天要问你的问题是,谈谈你知道的设计模式?请手动实现单例模式,Spring 等框架中使用了哪些模式?原创 2024-05-14 17:09:45 · 943 阅读 · 0 评论 -
第13讲 | 谈谈接口和抽象类有什么区别?
Java 是非常典型的面向对象语言,曾经有一段时间,程序员整天把面向对象、设计模式挂在嘴边。虽然如今大家对这方面已经不再那么狂热,但是不可否认,掌握面向对象设计原则和技巧,是保证高质量代码的基础之一。面向对象提供的基本机制,对于提高开发、沟通等各方面效率至关重要。考察面向对象也是面试中的常见一环,下面我来聊聊。今天我要问你的问题是,谈谈接口和抽象类有什么区别?原创 2024-05-14 16:24:58 · 1204 阅读 · 0 评论 -
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
在专栏上一讲提到,NIO 不止是多路复用,NIO 2 也不只是异步 IO,今天我们来看看 Java IO 体系中,其他不可忽略的部分。今天要问你的问题是,Java 有几种文件拷贝方式?哪一种最高效?原创 2024-05-14 15:56:46 · 1036 阅读 · 0 评论 -
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
IO 一直是软件开发中的核心部分之一,伴随着海量数据增长和分布式系统的发展,IO 扩展能力愈发重要。幸运的是,Java 平台 IO 机制经过不断完善,虽然在某些方面仍有不足,但已经在实践中证明了其构建高扩展性应用的能力。今天要问你的问题是,?原创 2024-05-14 15:24:59 · 989 阅读 · 0 评论 -
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
在之前两讲介绍了 Java 集合框架的典型容器类,它们绝大部分都不是线程安全的,仅有的线程安全实现,比如 Vector、Stack,在性能方面也远不尽如人意。幸好 Java 语言提供了并发包(java.util.concurrent),为高度并发需求提供了更加全面的工具支持。今天要问你的问题是,如何保证容器是线程安全的?ConcurrentHashMap 如何实现高效地线程安全?原创 2024-05-13 16:52:42 · 867 阅读 · 0 评论 -
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
Map 是广义 Java 集合框架中的另外一部分,HashMap 作为框架中使用频率最高的类型之一,它本身以及相关类型自然也是面试考察的热点。今天要问你的问题是,对比 Hashtable、HashMap、TreeMap 有什么不同?谈谈你对 HashMap 的掌握。原创 2024-05-13 16:09:19 · 861 阅读 · 0 评论 -
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C 语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java 提供了强大的集合框架,大大提高了开发者的生产力。今天要问你的是有关集合框架方面的问题,对比 Vector、ArrayList、LinkedList 有何区别?原创 2024-05-13 14:40:52 · 744 阅读 · 0 评论 -
第7讲 | int和Integer有什么区别?
Java 虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以在面试中,经常考察原始数据类型和包装类等 Java 语言特性。今天要问你的问题是,int 和 Integer 有什么区别?谈谈 Integer 的值缓存范围。原创 2024-05-13 11:04:40 · 920 阅读 · 0 评论 -
第6讲 | 动态代理是基于什么原理?
编程语言通常有各种不同的分类角度,动态类型和静态类型就是其中一种分类角度,简单区分就是语言类型信息是在运行时检查,还是编译期检查。与其近似的还有一个对比,就是所谓强类型和弱类型,就是不同类型变量赋值时,是否需要显式地(强制)进行类型转换。那么,如何分类 Java 语言呢?通常认为,Java 是静态的强类型语言,但是因为提供了类似反射等机制,也具备了部分动态类型语言的能力。言归正传,今天要问你的问题是,谈谈 Java 反射机制,动态代理是基于什么原理?原创 2024-05-13 10:06:48 · 677 阅读 · 0 评论 -
第5讲 | String、StringBuffer、StringBuilder有什么区别?
今天会聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要组成。今天要问你的问题是,理解 Java 的字符串,String、StringBuffer、StringBuilder 有什么区别?原创 2024-05-11 18:47:34 · 950 阅读 · 0 评论 -
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
在 Java 语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握 Java 对象生命周期和 JVM 内部相关机制非常有帮助。今天要问你的问题是,强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?原创 2024-05-11 18:19:06 · 971 阅读 · 0 评论 -
第2讲 | Exception和Error有什么区别?
世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确处理好意外情况,才能保证程序的可靠性。Java 语言在设计之初就提供了相对完善的异常处理机制,这也是 Java 得以大行其道的原因之一,因为这种机制大大降低了编写和维护可靠程序的门槛。如今,异常处理机制已经成为现代编程语言的标配。今天要问你的问题是,请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?原创 2024-05-11 15:40:30 · 938 阅读 · 0 评论 -
第1讲 | 谈谈你对Java平台的理解?
从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停下来总结思考一下。今天要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?原创 2024-05-11 15:10:49 · 979 阅读 · 0 评论