Java
文章平均质量分 87
学习、记录、分享、优化。
Q.E.D.
放弃亦是坚持,坚持亦是放弃。
展开
-
Java 基础 - idea汉字输出乱码
在使用 IntelliJ IDEA 时,如果在控制台输出汉字出现乱码,通常是因为控制台的字符编码设置不正确。原创 2024-05-31 07:30:00 · 1337 阅读 · 1 评论 -
Java 基础 - Unsafe应用解析
如下Unsafe源码所示,Unsafe类为一单例实现,提供静态方法getUnsafe获取Unsafe实例,当且仅当调用getUnsafe方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常。// 单例对象// 仅在引导类加载器`BootstrapClassLoader`加载时才合法if(!} else {那如若想使用这个类,该如何获取其实例?有如下两个可行方案。其一,从getUnsafe方法的使用限制条件出发,通过Java命令行命令。原创 2023-12-15 18:00:00 · 2138 阅读 · 0 评论 -
CentOS - 离线安装JDK
将JDK包上传到服务器指定路径下,如:/home/tool。原创 2023-07-13 07:30:00 · 4606 阅读 · 1 评论 -
JVM - G1垃圾收集器深入剖析
HotSpot团队一直努力朝着高效收集、减少停顿(STW: Stop The World)的方向努力,也贡献了从串行Serial收集器、到并行收集器Parallerl收集器,再到CMS并发收集器,乃至如今的G1在内的一系列优秀的垃圾收集器。G1(Garbage First)垃圾收集器关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集。G1最大的特点是引入分区的思路,弱化了分代的概念。合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。原创 2023-02-26 22:20:23 · 9844 阅读 · 2 评论 -
多线程与并发 - 常见的几种锁的实现方式
正如其名,它是指对数据修改时持保守态度,认为其他人也会修改数据。因此在操作数据时,会把数据锁住,直到操作完成。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过长,其他用户长时间无法访问,影响程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是长事务而言,这样的开销往往无法承受。使用悲观锁的时候,我们要注意锁的级别,MySQL innodb 在加锁时,只有明确的指定主键或(索引字段)才会使用 行锁;否则,会执行 表锁,将整个表锁住,此时性能会很差。原创 2022-11-25 07:30:00 · 18699 阅读 · 0 评论 -
微信公众号 - Java推送小程序订阅消息给用户
不啰嗦,我们直接开始!本文使用体验版小程序进行调试。一、开发前小程序准备:1、登录微信公众平台点开下面链接,使用微信扫码微信公众平台然后选择一个小程序并登录2、在小程序后台找到Appid和AppSecret参数AppSecret忘记了可以自行重置3、选用订阅消息模板,找到模板ID在"公共模板库"选用一个模板"公共模板库"没有合适的话,可以在最后一页进行申请,这里就不进行申请了选用模板后可以自行勾选关键词,没有合适的关键词也可以申请...原创 2021-09-13 09:21:30 · 211358 阅读 · 14 评论 -
微信公众号 - Java推送公众号模板消息给用户
不啰嗦,我们直接开始!由于没有公众帐号,本文使用微信公众平台接口测试帐号进行调试。一、申请测试帐号1、使用微信扫码登录下面网址微信公众平台 (qq.com)2、登录成功后能看到appID和appsecret3、当前页面往下翻,能看到测试公众号的二维码,使用微信扫码关注后,能看到我们在这个测试号下的的openid4、在往下翻,在“模板消息接口”处,新增测试模板,然后能看新增的测试模板ID模板内容可以自定义占位字段的key(小写)可以自定义,但是属性必须是DATA(必须大原创 2021-09-07 11:09:47 · 210167 阅读 · 16 评论 -
多线程与并发 - Java 8 CompletableFuture 异步多线程
CompletableFuture的get()方法是阻塞的,我们一般建议使用future.get(5, TimeUnit.SECONDS)。并且一般建议使用自定义线程池。但是如果线程池拒绝策略是DiscardPolicy或者DiscardOldestPolicy,当线程池饱和时,会直接丢弃任务,不会抛弃异常。因此建议,CompletableFuture线程池策略最好使用AbortPolicy,然后耗时的异步线程,做好线程池隔离哈。原创 2022-08-22 07:30:00 · 39538 阅读 · 1 评论 -
多线程与并发 - 多线程访问同步方法的7种情况
不啰嗦,我们直接开始!1、两个线程同时访问一个对象的同步方法代码:public class SynchronizedObjectMethod implements Runnable { static SynchronizedObjectMethod instance = new SynchronizedObjectMethod(); @Override public void run() { method(); } public sy原创 2021-09-14 23:53:29 · 208766 阅读 · 11 评论 -
多线程与并发 - 如何实现处理线程的返回值
如何给run()方法传参构造函数传参 成员变量传参 回调函数传参如何实现处理线程的返回值主线程等待法(即让主线程循环等待,直到目标子线程返回值为止)原创 2021-03-16 20:46:26 · 209212 阅读 · 0 评论 -
多线程与并发 - Thread和Runnable是什么关系
源码对比Thread源码Thread其实是一个类,并且这个类实现了Runnable接口。Thread利用自身的start方法创建线程,执行实现了的run方法,使其具有多线程的特性Runnable源码Runnable其实是一个接口,这个接口很简单,只有一个抽象的run方法,那也就说明这个接口并不具有多线程的特性实现多线程的方式对比Thread创建自己的线程类MyThread,继承Thread,重写run方法public class Mythread extends原创 2021-03-15 07:19:46 · 208172 阅读 · 0 评论 -
多线程与并发 - Thread中的start和run方法的区别
run方法public class ThreadTest { public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { attack(); } }; System.out.println("main原创 2021-03-14 22:49:46 · 208146 阅读 · 3 评论 -
多线程与并发 - 进程和线程的区别
进程和线程的由来:进程是资源分配的最小单位,线程是CPU调度的最小单位所有与进程相关的资源,都被记录在PCB中 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源 线程只由堆栈寄存器、程序计数器和线程控制表(TCB)组成总结:线程不能看做是独立应用,二进程可看做是独立应用 进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径(如果子线程的崩溃是由于自己的一亩三分地引起的,那就不会对主线程和其他子线程产生影响,但是如果子线程的崩溃是因为对共享区域造成了破坏,那么大家就一起原创 2021-03-14 21:31:22 · 208018 阅读 · 0 评论 -
Map - LinkedHashSet & LinkedHashMap 源码解析
总体介绍如果你已看过前面关于HashSet和HashMap,以及TreeSet和TreeMap的讲解,一定能够想到本文将要讲解的LinkedHashSet和LinkedHashMap其实也是一回事。LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,前者仅仅是对后者做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。因此本文将重点分析LinkedHashMap。LinkedHashMap实现了Map接口,即允许放入key转载 2021-10-24 09:06:39 · 196813 阅读 · 7 评论 -
Map - HashSet & HashMap 源码解析
JDK版本JDK 1.8.0_110参考Java HashSet & HashMap 源码解析 结合源码对HashSet和HashMap进行讲解 https://www.cnblogs.com/CarpenterLee/p/5440428.html概述之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)**。因此本文将重点分析HashMap。HashM转载 2021-03-08 22:37:27 · 207559 阅读 · 0 评论 -
Collection - PriorityQueue源码解析
JDK版本JDK 1.8.0_110参考深入理解Java PriorityQueue 结合源码对PriorityQueue进行讲解 http://www.cnblogs.com/CarpenterLee/p/5488070.html概述前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素.转载 2021-03-08 22:19:06 · 207527 阅读 · 0 评论 -
Collection - Stack & Queue 源码解析
JDK版本JDK 1.8.0_110参考Stack & Queue概述Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。QueueQueue接口继承自Collection接口,除了最基本的Collection的方法之外,它还支持额外的insertion,转载 2021-03-08 22:04:14 · 207436 阅读 · 0 评论 -
Collection - LinkedList源码解析
JDK版本JDK 1.8.0_110参考Java LinkedList源码剖析 结合源码对LinkedList进行讲解 http://www.cnblogs.com/CarpenterLee/p/5457150.html概述LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedL转载 2021-03-08 21:41:28 · 207170 阅读 · 0 评论 -
Collection - ArrayList 源码解析
JDK版本JDK 1.8.0_110参考深入Java集合学习系列: ArrayList的实现原理 http://zhangshixi.iteye.com/blog/674856 Java ArrayList源码剖析 结合源码对ArrayList进行讲解 http://www.cnblogs.com/CarpenterLee/p/5419880.html概述ArrayList实现了List接口,是顺序容器,即元素存放的数据顺序与放进去的顺序相同,允许放入 null 元素,底层通过数组实现。转载 2021-03-07 23:22:57 · 207326 阅读 · 0 评论 -
Collection - 类关系图
知识体系结构介绍容器,就是可以容纳其他Java对象的对象。*Java Collections Framework(JCF)*为Java开发者提供了通用的容器,其始于JDK 1.2,优点是:降低编程难度 提高程序性能 提高 API 间的互操作性 降低学习难度 降低设计和实现相关 API 的难度 增加程序的重用性Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Dou转载 2021-03-07 14:35:00 · 207112 阅读 · 0 评论 -
Java 8 新特性 - Optional 实践
来自作者的说明首先我们来看一下Optional的作者 Brian Goetz 对这个 API 的说明:Our intention was to provide a limited mechanism for library method return types where there needed to be a clear way to represent "no result", and using null for such was overwhelmingly likely to cau原创 2021-07-30 10:37:27 · 208011 阅读 · 0 评论 -
Java 基础 - SPI机制详解
SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。什么是SPI机制SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制转载 2021-03-07 14:09:37 · 207713 阅读 · 0 评论 -
Java 基础 - 反射机制详解
JAVA反射机制是在运行状态中:对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制在框架设计中极为广泛,需要深入理解。反射基础RRIT(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,转载 2021-03-07 12:38:34 · 206645 阅读 · 0 评论 -
Java 基础 - Java 类加载机制
类的生命周期类加载的过程包括了加载、验证、准备、解析、初始化这五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。类的加载: 查找并加载类的二进制数据加载是类加载过程的第一个阶段,在加载阶段,转载 2021-03-06 23:51:57 · 206485 阅读 · 0 评论 -
Java 基础 - 类字节码详解
源代码通过编译器编译为字节码,再通过类加载子系统进行加载到JVM中运行。多语言编译为字节码在JVM运行计算机是不能直接运行java代码的,必须要先运行java虚拟机,再由java虚拟机运行编译后的java代码。这个编译后的java代码,就是本文要介绍的java字节码。为什么jvm不能直接运行java代码呢,这是因为在cpu层面看来计算机中所有的操作都是一个个指令的运行汇集而成的,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以java代码必须要先编译成字节码文件,jvm才能正转载 2021-03-06 22:00:11 · 206629 阅读 · 0 评论 -
Java 基础 - 异常机制详解
Java异常是Java提供的一种识别及响应错误的一致性机制,java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。异常的层次结构异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。转载 2021-03-06 18:41:14 · 206131 阅读 · 1 评论 -
Java 基础 - 注解机制详解
注解基础注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:生成文档,通过代码里标识的元数据生成javadoc文档。 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。这么来说是比较抽象的,我们具体看下注解的常见分类:Java自带的标转载 2021-03-05 07:15:24 · 205907 阅读 · 1 评论 -
Java 基础 - 泛型机制详解
Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。为什么会引入泛型泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类转载 2021-03-04 22:32:33 · 205610 阅读 · 1 评论 -
Java 基础 - 图谱 & Q/A
Thinking in Java (Java 编程思想) Gitbook中文文档 https://java.quanke.name/ Thinking in Java (Java 编程思想) Github https://github.com/quanke/think-in-java Thinking in Java (Java 编程思想) Gitbook2 https://www.gitbook.com/book/wizardforcel/thinking-in-java/details知识体系转载 2021-03-03 20:44:58 · 205756 阅读 · 0 评论 -
Java 基础 - 知识点
数据类型包装类型八个基本类型: 类型 字节数 位数(bit) min max default 包装类 备注 整数类型 byte 1byte 8位,有符号的以二进制补码表示的整数 -128(-2^7) 127(2^7-1) 0 Byte byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一; 整数类型 short 2byte.转载 2021-02-26 11:54:08 · 205517 阅读 · 0 评论 -
Java 基础 - 面向对象
三大特性封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。优点:减少耦合: 可以独立地开发、测试、优化、使用、理解和修改 减轻维护的负担: 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块 有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能 提高软件的可重用性转载 2021-02-25 10:34:37 · 205440 阅读 · 0 评论