Java SE
文章平均质量分 85
qq_27986857
这个作者很懒,什么都没留下…
展开
-
JDK 8 - SerializedLambda
SerializedLambda是Java提供的关于lambda表达式的序列化方案,会将实现了Serializable接口的lambda表达式转换成 SerializedLambda 对象之后再去做序列化。其核心在于Java在对lambda表达式序列化时,虚拟机会添加一个writeReplace()方法。根据Java的序列化机制,虚拟机在调用write(obj)序列化对象前,如果被序列化对象有writeReplace方法,则会先调用该方法,用该方法返回的对象进行序列化,即序列化对象被替换了。原创 2024-01-28 17:29:21 · 1444 阅读 · 0 评论 -
lambda 方法引用
four kinds of method referenceAccording to Oracle Java tutorial, there are four kinds of method reference:I prepared 3 interfaces - for 0, 1 and 2 parameters. Then we have 3 static and 3 instance methods:Now look how each of the methods may be used as a原创 2024-01-28 17:28:49 · 330 阅读 · 0 评论 -
Java 类加载器
类加载器可以说是Java语言的一项创新,让应用程序自己决定如何去获取所需的类的二进制字节流。原创 2024-01-28 17:24:11 · 885 阅读 · 0 评论 -
多线程传递 ThreadLocal 解决方案
通过定义 static final 变量,在同一个线程内可以在任何时候、任何地方获取该 ThreadLocal 变量,减少冗余的函数传参。在编写业务方法时,尽量符合函数式编程中确定性(determinism)的要求:方法的结果,只取决于方法的参数,不依赖任何其它上下文环境(包括全局变量等)或者内部可变状态。那什么时候我们应该使用ThreadLocal呢?原创 2024-01-28 17:14:12 · 1142 阅读 · 0 评论 -
Java 高并发相关理论
传统意义上的 Java 线程(以下称为平台线程)跟操作系统的内核线程是一一映射的关系(如图1所示)。平台线程通常持有一个线程堆栈和其他由操作系统维护的资源,基本适合运行所有类型的任务。过去的三十年里,平台线程为 Java 开发人员提供了构建并发应用程序的基础。服务端应用程序需要处理彼此独立的并发请求,因此使用一个独立的平台线程来处理一个请求是容易理解的,同时也易于编程,这也是 Spring 应用处理请求的方式。然而,这种请求处理方式受到利特尔定律(Little’s Law)的约束。原创 2024-01-28 17:12:28 · 675 阅读 · 0 评论 -
ThreadLocal 关键源码阅读及思考
前言使用 ThreadLocal 类来定义变量能确保每个线程访问的是该变量的副本,这样就能避免多线程访问一个变量时产生的线程安全问题。使用步骤创建 ThreadLocal 对象普通创建方式ThreadLocal<Long> createdTime = new ThreadLocal<>();带有初始值的创建方式方式一ThreadLocal<Long> createdTime = ThreadLocal.withInitial(() -> Sy原创 2021-08-22 01:00:26 · 177 阅读 · 0 评论 -
翻译 - Java 8 新特性
interface 允许默认方法Java 8 允许接口中包含非 abstract 关键字修饰的方法,但是需要在有实现体的方法的声明前加上 default 关键字,这种特性也被称为 Extension Methods。下面是这种特性的第一个代码示例。interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); }}接口 Formula 除了声明了一个 抽象方法翻译 2021-08-15 10:59:58 · 179 阅读 · 0 评论 -
Collectors.toMap 在批量缓存中的运用
前言在实际项目中经常有一个需求,就是在本地将对象缓存起来,Java 里面常被作为缓存工具的数据结构就是 Map。关于 Collectors.toMap 的更多说明可以查看 Java 8 特性 - Collectors. toMap缓存体系首先定义个缓存键接口public interface Cacheable<K> { K getCachedKey();}其次构建一个对象类public static class Person implements Cacheable原创 2021-08-14 17:04:31 · 179 阅读 · 0 评论 -
Java 8 特性 - Collectors. toMap
使用案例将一个对象数组转为 Map 对象import java.util.stream.Collectors;import java.util.Arrays;import java.util.HashMap;public class ToMapDemo { public static class Person { private Integer id; private String name; public Person(Integer id, String name) {原创 2021-08-14 17:00:59 · 213 阅读 · 0 评论 -
父类方法抛出的异常,子类重写时怎么处理?
前言重写(注意与重载的区别)是面向对象语言实现多态特性的重要知识点,与其它知识点结合一起使用过程中,会产生一些让人疑惑的点,这篇文章是为了演示与解释重写与异常两个知识点碰撞时产生的问题。这里先给出结论:子类在重写父类带有异常的方法时,可以自行决定是否抛出异常,但如果要抛出异常,那么抛出的异常的层级一定不能高于父类方法抛出的异常所处的层级。测试测试1父类抛出异常,子类不抛出异常public class ExceptionDemo { private static class Parent {原创 2021-08-08 18:38:49 · 1482 阅读 · 1 评论 -
BufferedInputStream源码阅读
前言BufferedInputStream 使用 装饰者模式 对InputStream的功能进行了加强。通过阅读该类的代码实现,对理解装饰者模式大有助益。继承体系FilterInputStreamFilterInputStream 类的定义就已经用到了装饰者模式——它本身继承自抽象类InpuStream,又定义了一个InputStream的成员变量 in,而且对继承的所有抽象方法的实现...原创 2020-07-11 17:35:00 · 212 阅读 · 0 评论 -
改名换姓的Java字节码压缩包
前言项目开发过程中,总会在项目中添加各式各样的 jar。那么什么是 jar?jar是什么?jar 其实就是一种以ZIP压缩协议进行压缩的压缩包,不过只是把得到的压缩包的 .zip 后缀改为了 .jar 而已。所以任何可以打开后缀为 .zip 的压缩包的软件也能打开 jar。上图就是使用 Bandizip 打开的一个 Demo.jar,展示了jar常见的内容。其中example 是代码...原创 2020-02-19 12:41:13 · 253 阅读 · 0 评论 -
通过例子理清 Java 中的重写(Override)与重载(Overload)
Override翻译为覆写或者重写都可以,它指在子类在继承父类时,如果父类已经存在一个方法 ,子类可以继续沿用该方法,但必须保证在子类中该方法的方法签名与父类的方法签名必须一致,且必须要保证子类中该方法的返回值类型要么是父类该方法的返回值类型,要么是父类该方法的返回值类型的子类型。在Java中方法签名相同可以方法的简单地理解为方法名参数个数参数类型顺序方法签名。常用的重写案例符合规则的重写案例(返回类型不一致)原创 2020-02-17 12:35:02 · 335 阅读 · 1 评论 -
Java 8未使用自定义配置的JAVA_HOME
前言我将JDK安装到了 C:\Program Files\Java 目录下,并且配置了系统变量 JAVA_HOME=C:\Program Files\Java\jdk1.8.0_212 和环境变量 PATH=%JAVA_HOME%\bin 但在实际运行过程中,我的JAVA_HOME并没有生效。问题与分析从前言中,我们知道了我电脑上的配置情况 JAVA_HOME=C:\Program File...原创 2020-02-16 17:49:40 · 680 阅读 · 1 评论 -
单例模式的Java实现以及优劣分析
单例模式因其可以保证资源的重用从能提高性能,所以在 Java EE 中被广泛使用,比如Spring框架中的ApplicationContext类就被设计成单例模式。下面来看看单例模式在Java中的几种实现形式,以及他们的优劣对比。1.懒加载单例模式class Singleton{ private static Singleton instance; public static Singl...原创 2020-02-14 12:27:39 · 198 阅读 · 0 评论 -
探究Java中的枚举实现原理
Java从JDK1.5开始引入了枚举类型,使用关键字enum来定义枚举类。在一个类的实例固定且数目有限时,可以考虑使用枚举最简单的枚举类型enum WeekDay{ SUNDAY, MONDAY, TUESDAY, WEDSNESDAY, TURSDAY, FRIDAY, SATURDAY;}这里需要值得注意的地方有:定义一个枚举类型主要使用到了关键字enum所有枚举类型对象必...原创 2020-02-14 10:39:19 · 198 阅读 · 1 评论 -
Java整型数据与常量池
众所周知,Java会自动将字符串字面量(如"hello")放到常量池中,但作为整型字面量是否会被放到常量池中呢?下面进行实验实验环境为:Java 1.8.0_212实验一public class Test{ public static void main(String[] args){ // 整型最大值 int i1 = 0x80000000; int i2 = 1; }...原创 2019-11-05 16:38:44 · 980 阅读 · 0 评论