分类: Java 基础

31 篇文章

使用双花括号初始化集合,可别这么干
Double Brace Initialization should not be used 前言 最近在修改sonar问题时,发现有人使用双花括号初始化集合,提示可能发生内存泄漏。这种初始化方式倒是见过,只知道是使用了匿名内部类,但没有意识到这个问题。 实测 A 提供两种Map的初始化方法,为了观察是否被回收,重写了finalize方法。 pub…
HashMap源码解读:扩容
HashMap源码解读:扩容 引言 HashMap的扩容是个很重要的操作,jdk1.7往前这里会发生死链问题,都是值得研究的。我最开始以为HashMap线程不安全的原因是因为扩容,没有注意到jdk版本的影响,就去看1.8的扩容为啥会发生死链,但因此也发现了这个方法里的巧妙设计。 分析 以下这段代码是jdk1.8HashMap扩容时,遍历原HashM…
JMH基准测试
前言 我们写的代码性能如何?用StopWatch来监控方法得出方法执行时间就是准确的? 使用JMH就可以回答第一个问题。JMH是方法级别的性能测试工具,并且是openjdk官方开发的(值得信赖),它有很多针对性能测试的功能,例如预热,该功能就可以解决StopWatch测试不准确的问题。 StopWatch测试不准确的原因如下: Java8引入的la…
《代码整洁之道》笔记(10-12章节)
类 类的组织 标准的Java约定,类结构定义如下: 公共静态变量 私有静态变量 私有实体变量 公共函数 私有函数 类应该短小 不应有太多全责。 单一权责原则 Single Responsiblility:类或模块应该有且只有一条加以修改的理由。 职责越清晰,被复用的可能性就越大。 内聚 类应该只有少数实体变量,方法操作的实体变量越多,内聚性越强。 …
《代码整洁之道》笔记(7-9章节)
错误处理 使用异常而非返回码 多个条件分支记录错误信息,可以封装进一个方法,在记录异常信息的地方抛出异常,并给出相应信息。在该方法外部捕获,记录异常信息。异常处理和正常业务流程隔离。 缩小异常类型,反例:全部使用Excception。 使用未检异常 代价:违反开闭原则。该方法调用链路上的方法签名都得修改。 给出异常发生的环境说明 应创建信息充分的错…
《代码整洁之道》笔记(4-6章节)
注释 什么也不会比陈旧,提供错误信息的注释更有破坏性。 若编程语言有足够的表达力,就根本不需要注释。 注释的恰当用法时弥补我们在用代码表达意图时遭遇的失败。 如果你发现自己需要写注释,就再想想看是否有方法翻盘。 个人认为注释还是要写,算是对代码的中文翻译,因为我们的英语水平,命名习惯各不相同。 注释掉的代码 其他人不敢删除注释掉的代码。他们会想,代…
《代码整洁之道》笔记(1-3章节)
序言:这是一本很多前辈推荐的书,阅读这本书后,我最大的感想就是:特别实在。书中时不时的出现一个句子,戳中你的内心。例如序言中的: 那堆“可以运行”的乱麻程序,就在我们的眼皮底下慢慢腐败。 对于软件而言,百分之八十或更多的工作量集中在我们美其名曰“维护”的事情上:其实就是修修补补。 习艺之要有二:知和行。你应当习得有关原则、模式和实践的知识,穷尽应知…
查找第K小/大数据,千万数据排序
思路 刚开始我以为这题的考点是如何快速读取文件(因为这是公司多线程学习分享后布置的作业),我就用多线程来解题。后来出题人跟我说:200m测试数据时我的程序OOM了,我才醒悟这题的考点不是快速读取文件,而是大文件排序。 这题挺有意思的,解题运用了多路归并,有个巧妙的地方估计只有实操才知道——复用流。 题目 查找第K小/大数据 每个法官都有不同的办案能…
线程池(一)What Is ThreadPool
一、写在前面 1.1 线程池是什么 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开…
Java垃圾回收(一)
GC 一、定义 1. 什么是垃圾 没有引用的对象(注意Java引用分为强软弱虚) 2. 怎么找到垃圾 引用计数法(Reference Counting): 虽然循环引用的问题可通过 Recycler 算法解决,但是在多线程环境下,引用计数变更也要进行昂贵的同步操作,性能较低,早期的编程语言会采用此算法。 可达性分析,又称引用链法(Tracing G…