A collection of 34 posts

如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全? - 《java核心技术》笔记

简述 问:为什么需要ConcurrentHashMap? 答:因为Hashtable本身比较低效,它在所有的put、get、size方法上面加上了“synchronized”。而Collections提供的同步包装器,只是将“this”作为互斥的mutex。 早期的ConcurrentHashMap基于: 分段锁,将内部进行分段(Segment),里面是HashEntry的数组; HashEntry内部使用volatile的value字段保证可见性,也利用了不可变对象的机制以改进利用Unsafe提供的底层能力, ...

Exception和Error的区别-《Java核心技术》笔记

Exception是程序正常运行时可以预料到并且应该被捕获的情况,Error是指在正常情况下不太可能出现的情况。绝大部分Error都会导致程序处于非正常、不可恢复的情况,所以不便于也不应该被捕获,比如OutofMemoryError。Exception分为checked和unchecked,checked在代码里必须显式捕获,比如IOException,而unchecked是不可查异常,比如NullPointerException、ArrayIndexOutOfBoundException,通常是可以编码避免的逻辑错误。 抛异常的最佳实践:throw early,catch late。 try-catch会产生额外的性能开销,建议仅捕获有必要的代码段, ...

“解释执行”的理解-《Java核心技术》笔记

编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的。而解释是对源程序的翻译与执行一步到位完成,不生成可存储的目标代码。最大的区别在于控制权:对于解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,程序运行时的控制权在用户。 根据程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言,可以分为两大类:编译型语言和解释型语言。 由编译型语言编写的源程序需要经过编译、汇编和链接才能生成目标代码,然后机器执行目标代码得出结果。目标代码由机器指令组成,一般不能独立运行; 解释型语言中,翻译器并不生成目标代码,而是产生易于执行的中间代码, ...

java一些优化点

减少临时对象; 减少list的拷贝,如果要添加到末尾,不要新增一个临时对象; 在初始化map和list的时候,在一开始设置初始化容量,减少扩容引起的数据拷贝; if else如果是string,用switch替换; 删除缓存可能会引起性能提升; 可以按照index寻址的,不要用map。 其实思路跟C++差不多。 ...