
java
文章平均质量分 71
秋夫人
将军赶路不追野兔
展开
-
map<Long,Long> resultCache = new HashMap<Long,Long>(1000000),100w数据存满时,粗估resultCache大约占多少内存?
Java中HashMap的内存占用取决于多个因素,包括键值对的数量、负载因子、容量以及每个对象的内存占用。对于,我们可以大致估算其内存占用。假设我们有一个,其初始容量设置为100万(1,000,000),默认负载因子为0.75。LongLongHashMap假设HashMap的容量扩展到足以容纳100万个键值对,实际容量会是大于或等于100万的最小2的幂次,即1048576(2^20)。因此,数组部分大约占用8 * 1048576 = 8388608字节(8MB)。原创 2024-10-31 21:49:14 · 1011 阅读 · 0 评论 -
jdk 相关网址
JEP,即 JDK Enhancement Proposal(JDK 增强提案),是一种正式的提案过程,用于提出和跟踪对 JDK(Java Development Kit)的重大改进。每个 JEP 都包含了一个特定的目标或新功能的详细说明,包括其背景、目标、设计概述、风险和依赖关系等。这些仓库涵盖了 JDK 核心开发、特性项目、工具和基础设施等多个方面,为 Java 平台的持续发展和创新提供了基础。:JEP 包含详细的设计文档,说明提案的技术细节和实现方案。原创 2024-10-03 08:38:02 · 1795 阅读 · 0 评论 -
idea 同一个项目不同模块如何设置不同的jdk版本
在IntelliJ IDEA中,可以为同一个项目中的不同模块设置不同的JDK版本。这样做可以让你在同一个项目中同时使用多个Java版本,这对于需要兼容多个Java版本的开发非常有用。通过以上步骤,你可以轻松地为同一个IntelliJ IDEA项目中的不同模块设置不同的JDK版本。这样,每个模块都可以根据需要使用特定版本的Java进行编译和运行。,为其他模块设置不同的JDK版本。原创 2024-10-01 15:33:33 · 1021 阅读 · 0 评论 -
lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic
1.lambda 表达式的本质:函数式接口的匿名子类的匿名对象2.lambda表达式是语法糖原创 2024-09-30 14:47:39 · 1097 阅读 · 0 评论 -
asm技术简介
ASM是一个Java字节码操作和分析框架。它可以用于直接生成类或动态生成、修改已存在的类。ASM提供了一些核心组件和API,使得开发者可以在运行时创建或修改编译后的Java类。动态生成类:在运行时根据特定的需求动态生成新的类。这对于某些需要根据用户输入或其他运行时数据动态定义行为的应用程序非常有用。修改现有类:在不改变原有代码的情况下,修改已经编译好的类的行为。这可以用于增加日志、性能监控、安全检查等。分析字节码:分析已编译的Java类的结构和内容,用于工具开发或性能优化等场景。原创 2024-09-30 14:07:08 · 720 阅读 · 0 评论 -
LambdaMetafactory lambda元工厂类 源码解析
是Java在引入Lambda表达式后,为了在运行时动态生成和实例化Lambda表达式所对应的类而提供的一个工具。它是Java 8中引入的一部分,位于包下。主要用于底层的Lambda表达式的实现机制,对于大多数Java开发者来说,是透明的,不需要直接使用。原创 2024-09-30 13:34:36 · 449 阅读 · 0 评论 -
InnerClassLambdaMetafactory 内部类Lambda元工厂 源码解析
是 Java 中用于生成 lambda 表达式实现类的一个关键类。它的主要功能是在运行时动态生成一个内部类来实现函数式接口。下面是对这个类的一些关键点的解释:CallSite这个类是 Java 8 引入 lambda 表达式后,在 JVM 层面实现 lambda 的核心机制之一,它使得 Java 能够高效地支持函数式编程范式。原创 2024-09-30 13:29:55 · 263 阅读 · 0 评论 -
CFR( Java 反编译器)---> lambda 表达式底层实现机制
CFR 0.152--aexagg和--aexagg2:控制异常聚合的程度,可能有助于简化生成的代码。:更积极地复制代码片段,可能使反编译的代码更易于理解。:控制CFR在处理某些代码结构时的积极程度。:设置积极处理代码的大小阈值。:允许CFR进行一些修正以提高代码准确性。:允许处理格式错误的switch语句。:指定分析的类型(DETECT, JAR, WAR, CLASS)。--antiobf:针对混淆代码的处理。:控制数组和集合迭代的处理。:文件系统大小写不敏感。--clobber。原创 2024-09-28 00:47:00 · 1712 阅读 · 0 评论 -
java.util.TreeMap#firstKey
这段代码通过从根节点开始,沿着左子树一直向下遍历,来找到并返回TreeMap中的第一个条目。这个条目包含了最小的键。如果TreeMap为空,则方法返回null。这是实现TreeMap迭代器和其他相关功能的基础逻辑之一。原创 2024-09-09 23:58:28 · 370 阅读 · 0 评论 -
java.util.TreeMap#tailMap(K, boolean)
通过这个方法,用户可以方便地操作映射的一部分,而不必处理整个映射,这在处理大型数据集时特别有用。这个方法允许用户操作映射的一个特定范围,而不是整个映射。尾部视图包含了所有大于(或等于,取决于。,这个映射包含原映射中所有键大于(或等于,根据。接口的一部分,通常用于有序映射,如。方法的主要目的是返回一个新的。的方法,它是用来获取一个。这段代码定义了一个名为。原创 2024-09-09 23:52:55 · 389 阅读 · 0 评论 -
org.apache.commons.lang.math.NumberUtils#isNumber 解释
循环结束后,代码检查字符串的最后一个字符。如果是数字,返回。原创 2024-08-27 15:23:35 · 862 阅读 · 0 评论 -
java8 Stream mapToLong方法
方法是 Java 中Stream接口的一部分,用于将流中的每个元素通过给定的函数mapper转换成一个long类型的值,并将这些long值组成一个新的LongStream。这个方法主要用于类型转换,特别是当你需要从对象中提取一个long类型的字段或属性时非常有用。原创 2024-08-25 19:32:00 · 731 阅读 · 0 评论 -
idea debug 各个步骤含义
允许你自定义 Debug 窗口中显示的线程信息,例如,你可以选择隐藏某些线程,以便更专注于你感兴趣的线程。原创 2024-08-25 10:35:06 · 1183 阅读 · 0 评论 -
Java集合的快速失败机制 “fail-fast”
通过分段锁的策略,实现了高效的并发更新操作,同时允许多线程无锁地进行读取操作。通过写时复制的策略,保证了并发读的高效性,适用于读多写少的场景。这两种集合都避免了快速失败机制,提供了更强的并发性能和数据一致性保证。然而,它们的实现策略也决定了各自的使用场景和性能开销,开发者在选择使用时需要根据实际需求做出合理的决策。原创 2024-08-23 10:35:23 · 433 阅读 · 0 评论 -
Java中有针对基本类型或者引用类型有哪些内部缓存机制
在Java虚拟机(JVM)中,为了提高性能和减少内存使用,对于基本类型和引用类型,实现了一些内部缓存机制。这些缓存机制主要体现在包装类的自动装箱过程中,以及字符串常量池的使用上。原创 2024-08-23 10:24:15 · 281 阅读 · 0 评论 -
Integer a= 127 与 Integer b = 127相等吗
是的,在Java中,和是相等的,但这里需要区分==和equals()方法的区别。Java为Integer类型实现了一个称为整数缓存的机制,这个机制默认缓存了从-128到127之间的整数。当我们使用自动装箱(即将基本类型转换为包装类型)时,对于这个范围内的数值,Java会直接返回缓存中的对象。因此,当我们声明和时,a和b实际上引用了同一个Integer对象。原创 2024-08-23 10:21:46 · 503 阅读 · 0 评论 -
Java 内部类
当一个内部类被编译时,Java编译器会隐式地处理内部类和外部类之间的关系,确保内部类可以访问外部类的成员,包括私有成员。这样,当创建内部类的实例时,就会传递一个外部类的实例给内部类,从而使内部类能够通过这个实例访问外部类的成员。根据其定义和作用域,内部类主要可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。对于非静态内部类(成员内部类和匿名内部类),Java编译器会自动为内部类添加一个外部类实例的引用。:使用static修饰的内部类,不需要依赖外部类的实例,不能访问外部类的非static成员。原创 2024-08-23 10:15:12 · 269 阅读 · 0 评论 -
InheritableThreadLocal使用详解
InheritableThreadLocal详解原创 2022-09-18 13:39:05 · 5703 阅读 · 2 评论 -
CGLib动态代理原理
CGLib动态代理原理CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法;看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调用代理类的方法都会被方法拦截器拦截,在拦截器中才是调用目标类的该方法的逻辑,结构还是一目了然的;1.CGLib的基本使用使用一下CGLib,在JDK动态代理中提供一个Proxy类来创建代理类,而在CGLib动态代理中也提供了一个类似的类Enhancer;使用的CGLib版本是2.2.2,我是随便找的,不转载 2021-01-07 14:55:36 · 4911 阅读 · 1 评论 -
Json转换工具类FastJsonUtil
pom.xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.44</version> </dependency>FastJsonUtil工具类package com.common原创 2021-01-07 12:47:35 · 1025 阅读 · 0 评论 -
JDK动态代理的实现原理
JDK动态代理JDK动态代理是代理模式的一种实现方式,其只能代理接口。使用步骤 1、新建一个接口2、 为接口创建一个实现类3、 创建代理类实现java.lang.reflect.InvocationHandler接口4、 测试被代理的接口:package com.mikan.proxy; /** * @author Mikan * @date 2015-09-15 18:00 */public interface HelloWorld { void转载 2021-01-07 10:42:44 · 161 阅读 · 0 评论 -
记录spring cloud项目线上JVM配置
linux硬盘详情:# df -h Filesystem Size Used Avail Use% Mounted on/dev/vda1 99G 35G 60G 37% /tmpfs 7.8G 0 7.8G 0% /dev/shmlinux 内存详情:# free -h total used free shared buffers cachedMe原创 2020-12-31 15:35:02 · 1088 阅读 · 1 评论 -
Java 原子性CAS 原理 ,atomic包 详解
java.util.concurrent.atomic包类的原理atomic包底层原理都是Unsafe.compareAndSwapXXX()方法,也就是通常说的CAS,compareAndSwapXXX方法是native标识的方法,是Java底层代码,不是Java代码实现的,public final class Unsafe { //object public final native boolean compareAndSwapObject(Object obj, long offset,原创 2020-12-15 14:42:30 · 573 阅读 · 0 评论 -
StampedLock源码详解解析
StampedLockStampedLock 是Java.util.concurrent并发包里JDK1.8版本新增的一个锁,该锁是对读写锁ReentrantReadWriteLock的增强,优化了读锁、写锁的访问,同时使写锁之间可以相互转换,更细粒度控制并发。StampedLock的主要特点概括一下,有以下几点:所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功;所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Sta原创 2020-11-20 14:16:23 · 719 阅读 · 0 评论 -
AQS 源码解析 - 结合ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier,Semaphor
JDK1.5以前只有synchronized同步锁,并且效率非常低,因此大神Doug Lea自己写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能非常高,所以被引入JDK包中,即JUC。那么AQS是怎么实现的呢?本篇就是对AQS及其相关组件进行分析,了解其原理,并领略大神的优美而又精简的代码。AbstractQueuedSynchronizerAQS是JUC下最核心的类,没有之一,所以我们先来分析一下这个类的数据结构。AbstractQ原创 2020-11-11 21:34:56 · 475 阅读 · 0 评论 -
面试题 - JVM内存结构
JVM内存结构JVM 可以分为 5 个部分,分别是:类加载器(Class Loader):加载字节码文件到内存。运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型。执行引擎(Execution Engine):对 JVM 指令进行解析,翻译成机器码,解析完成后提交到操作系统中。本地库接口(Native Interface):供 Java 调用的融合了不同开发语言的原生库。本地方法库(Native Libraies):Java 本地方法的具体实现。这其中最复杂翻译 2020-10-28 15:05:57 · 787 阅读 · 0 评论 -
面试题 - synchronized 和Lock区别
一、synchronized实现原理Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的class对象同步方法块,锁是括号里面的对象当一个线程访问同步代码块时,它首先是需要得到锁,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先看一段简单的代码:public class SynchronizedTest { public synchronized void test1(){原创 2020-10-26 13:20:22 · 3316 阅读 · 0 评论 -
面试题 - ThreadLocal详解
目录(jdk1.8)一、什么是ThreadLocal二、ThreadLocal怎么用三、ThreadLocal的原理四、ThreadLocal源码分析1.ThreadLocal的内部属性2.ThreadLocal 之 set() 方法3.ThreadLocal 之 get() 方法4.TreadLocal的remove方法5.内部类ThreadLocalMap的基本结构和源码分析5.1先看成员和结构部分5.2接着看ThreadLocalMap的构造函数5.原创 2020-09-30 17:29:07 · 11895 阅读 · 2 评论 -
面试题 - Java泛型、协变、逆变、类型擦除
Java 泛型之-协变&逆变先说一下java中的协变,逆变,不可变:假设有如下类:class Food{} // 默认继承Objectclass Fruit extends Food{}class Meat extends Food {}class Apple extends Fruit{}class Beef extends Meat{}逆变与协变Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型原创 2020-09-21 16:44:40 · 855 阅读 · 0 评论 -
面试题 - Java Comparable和Comparator 区别
Comparablepackage java.lang;public interface Comparable<T> { public int compareTo(T o);}Comparatorpackage java.util;public interface Comparator<T> { //必须实现的方法 int compare(T o1, T o2); //选择实现 boolean equals(Object obj)原创 2020-09-15 22:12:11 · 1276 阅读 · 0 评论 -
面试题 - Java序列化和反序列化
Java 序列化的高级认识引言将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写。然而在有些情况下,光知道这些还远远不够,文章列举了笔者遇到的一些真实情境,它们与 Java 序列化相关,通过分析情境出现的原因,使读者轻松牢记 Java 序列化中的一些高级认识。文章转载 2020-09-15 18:03:22 · 3900 阅读 · 0 评论 -
异常-覆盖时的异常特点
/*异常在子父类覆盖中的体现;1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。 如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。*/class AExcept原创 2015-09-25 18:18:22 · 636 阅读 · 0 评论 -
异常的特殊情况
/*Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;之所以不用在函数声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。自定义异常时:如果该异常的发生,原创 2015-09-25 17:35:33 · 371 阅读 · 0 评论 -
抽象类
/*当多个类中出现相同功能,但是功能主体不同,这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。抽象:看不懂。抽象类的特点:1,抽象方法一定在抽象类中。2,抽象方法和抽象类都必须被abstract关键字修饰。3,抽象类不可以用new创建对象。因为调用抽象方法没意义。4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。 如果子类只覆盖了部原创 2015-09-25 18:34:40 · 347 阅读 · 0 评论 -
异常其他格式
第一个格式:try{}catch (){}第二个格式:try{}catch (){}finally{}第三个格式:try{}finally{}//记住一点:catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明。//出现异常要么抛(在方法后throws),要么tryclass Demo{ public原创 2015-09-25 18:09:09 · 329 阅读 · 0 评论 -
package 包 , jar 包
package pack;/*编译时,javac -d . PackageDemo.java //会自动创建pack这个文件夹 其中‘.’表示当前目录,也可以自己定义pack在哪里创建,当自定义路径时,在运行时必须要用set classpath=指定地址,,然后才能成功运行运行时,java pack.PackageDemo //成功为了简化类名的书写,使用一个关键字,import.impo原创 2015-09-28 17:43:31 · 709 阅读 · 0 评论 -
欢迎使用优快云-markdown编辑器
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2015-09-21 10:57:38 · 448 阅读 · 0 评论 -
帮助文档的制作javadoc
/*静态的应用。每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装。以便复用。虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作。发现了问题:1,对象是用于封装数据的,可是ArrayTool对象并未封装特有数据。2,操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。这时就考虑,让程序更严谨,是不需要对象的。可以将ArrayTool中原创 2015-09-21 11:06:05 · 489 阅读 · 0 评论 -
java内部类规则
/*内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有。 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必须建立内部类对象。访问格式:1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。格式 外部类名.内部类名 变量名 = 外部类对象.内部类原创 2015-09-23 15:51:21 · 492 阅读 · 0 评论 -
多线程(创建线程-实现Runnable接口)
/*需求:简单的卖票程序。多个窗口同时买票。创建线程的第二种方式:实现Runable接口步骤:1,定义类实现Runnable接口2,覆盖Runnable接口中的run方法。 将线程要运行的代码存放在该run方法中。3,通过Thread类建立线程对象。4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。 为什么要将Runnable接口的子类对象传原创 2015-10-13 12:04:26 · 1417 阅读 · 0 评论