小知识
文章平均质量分 61
IllTamer
一只梦想成为Java架构师的小程序员
展开
-
深入研究 Java 中的 char 类型
众所周知在 Java 中,char 类型是可以储存汉字的,你可以以 char='人' 的方式对其进行赋值,也可以直接以指定编码进行赋值如:char = '\u4eba'。能达到这种效果的原因是 Java 的 char 类型比较特殊,它是以 Unicode 编码对字符进行存储,即每个 char 类型有 16bit,这一点从允许直接使用 Unicode 码的形式给 char 类型赋值就可以得知。显然,Java 中的 char 类型以 UTF-16 规范进行编码。注意:U...原创 2022-04-06 10:12:05 · 463 阅读 · 0 评论 -
StandardWatchEventKinds.ENTRY_MODIFY 重复触发原因及解决方案
今天在测试监听文件修改自动更新缓存数据这一功能时偶然发现 StandardWatchEventKinds.ENTRY_MODIFY 竟然会多次触发。刚开始还以为是重载代码中涉及到文件的二次保存,后来 Debug 了一波发现不是,又想了想,要真是套娃不久直接 OOM 了嘛,那就只有一种可能,是编辑器保存修改这个操作本身就涉及到两次对文件内容的更新,查看官方 doc,注释如下:这里面有句话很耐人寻味The event count for this e...原创 2022-03-26 02:32:52 · 791 阅读 · 0 评论 -
7k字详解! HTTP的前世今身 [超详细]
HTTP协议Http - HyperText Transfer Protocol,超文本传输协议,用于客户端和服务器端之间的通信。Http 1.0Http/1.0 是无状态[^1]、无连接[^2]的协议。缺陷 无状态 每个TCP连接只能发送一个请求,发送完数据后连接即关闭,如果还要请求必须新建请求连接。没有持久化处理。 不安全 HTTP 比较严重的缺点就是不安全: 通信使用明文(不加密),内容可能会被窃听。比如,账号信息容易泄漏,号没了。 不原创 2021-10-08 08:30:00 · 168 阅读 · 0 评论 -
Java小知识:线程池如何实现线程复用?
闲来没事突然想到这个问题,便百度了下想查看具体实现,无果。便自己翻看了下源码,以下是分析过程。众所周知,Java内部自带了个线程池实现 ExecutorService (虽然一直被人看不起)。随便找到其中的一个静态方法 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads,...原创 2021-10-02 20:48:59 · 1876 阅读 · 0 评论 -
Java小知识:JVM、JIT、HotSpot ?
定义:JVM -Java Virtual Mathine JIT -Just-in-time HotSpot -HotSpot VMJVMJVM实际上指的是Java虚拟机规范,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JITJIT 即 实时编译技术。按照其原始的、严格的定义,是每当一部分代码准备要第一次执行的时候,将这部分代码编译,然后跳进编译好的代码里执行。这样,所有执行过的代码都必然会被编译过。早期的JIT编...原创 2021-10-01 22:09:25 · 395 阅读 · 0 评论 -
Java面试宝典:synchronized 原理
synchronized是原子性内置锁,又称监视器锁。编译器会在同步代码块前后加上monitorenter和monitorexit字节码,其依赖操作系统底层互斥锁实现。该关键字主要作用是实现原子性操作和解决共享变量的内存可见性问题。在执行monitorenter指令时会尝试获取对象锁,如果该对象没有被锁定 / 已经获得了锁,则锁计数器+1,其它竞争的线程进入等待队列中。执行monitorexit执行时将锁计数器-1,当计数器值为0时,释放锁,处于等待队列中的线程再次竞争锁。synchronized时原创 2021-10-01 12:13:21 · 157 阅读 · 0 评论 -
Java面试宝典:重复消费、顺序消费、分布式事务
重复消费诱因消息队列拥有重试机制,下游业务因(服务器网络抖动,开发人员代码BUG,数据问题)等原因发生异常后,程序会抛出异常并要求重新发送请求。解决方法幂等(idempotent、idempotence):在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。 强检验:用于金钱相关的操作,将金钱与流水接口一起事物.原创 2021-10-01 00:22:19 · 260 阅读 · 0 评论 -
Java面试宝典:消息队列
QPS - Queries Per Second 每秒吞吐量应用背景为了使上图中顺序执行的多个重叠步骤并发执行(异步),减少多功能情况下用户的等待时间为什么不用线程 / 线程池 解耦合:避免一个功能一个接口,调用接口后重新发布系统 便于故障排查与处理:减少流程中出现异常的可能,避免处处try catch 如何实现消息队列实现监听者模式,新增功能部分订阅付款完成的事件广播,便于解耦与规避风险。优化使用消息队列需要解决 数据一致性 (可用分布式事务解决)原创 2021-10-01 00:18:58 · 87 阅读 · 0 评论 -
Java面试宝典:你一定不知道的 HashMap
```java考点: 1. HashMap的底层数据结构? 2. HashMap的存取原理? 3. Java7和Java8的区别? 4. 为啥会线程不安全? 5. 有什么线程安全的类代替么? 6. 默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂? 7. HashMap的扩容方式?负载因子是多少?为什是这么多? 8. HashMap的主要参数都有哪些? 9. HashMap是怎么处理hash碰撞的? ...原创 2021-09-30 00:02:37 · 61 阅读 · 0 评论 -
什么是取模?
因为之前在开发中一直没涉及到这部分的内容,所以也是今天才学习了相关知识,发布在这里记录一下。对于整型数a,b来说,取模运算或者求余运算的方法都是:1.求 整数商: c = a/b;2.计算模或者余数: r = a - c*b.求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。例如:计算-7 Mod 4那么:a = -7;b = 4;第一步:求整数商c,如进行求模运算c = -2(向负无原创 2021-09-15 17:03:57 · 10709 阅读 · 0 评论 -
Java小知识:遍历64千万次和遍历4千万次一样快?
引子先看以下一段代码及其输出结果:思考第一个循环的次数为,而第二个循环的次数为,循环次数相差了四倍,用时却几乎相同!原因首先我们需要了解下计算机的缓存结构cpu进行计算时,所有的数据都从 CPU Cache(高速缓存)之中读取。若CPU Cache 中无数据,则再将数据从内存读取到CPU Cache CPU Cache 与 内存 进行一次交互时,使用 CacheLine (大小为64Bytes) 存储一次交互的数据对于上图程序中的数组来说,无论是访问下...原创 2021-09-29 18:56:19 · 400 阅读 · 0 评论