
Java 开发中最基本的,在于对数据结构,JDK 常用类、方法,常用工具包的使用。
Integer
自动装箱和拆箱
1 | Integer i = 100; |
缓存
1 | // 缓存 |
线程不安全
Integer 非线程安全,例如 i + +,i - -,多线程访问无法保证一致性。
1 | Integer i = new Integer(0); |
AtomicInteger
java.util.concurrent.atomic.AtomicInteger,一个提供原子操作的 Integer 类。内部通过 volatile 实现多线程可见性。使用原生 Unsafe 类实现同步修改
Unsafe.compareAndSwapInt:比较 obj 的 offset 处内存位置中的值和期望的值,如果相同则更新,并返回 TRUE。
1 | // AtomicInteger |
当我们使用 VO 或 Form 封装前端传入的参数时,数值型参数我们是定义成 int 还是 Integer?
String
不可变性
一个字符串常量只有一个拷贝,具有不可变性,内容存放常量池。
1 | String str0 = "123"; |
常用方法
1 | public int compareToIgnoreCase(String str); // 比较(忽略大小写) |
StringBuffer&StringBuilder
StringBuilder 线程不安全,StringBuffer 线程安全(synchronized)。定义常量时,使用 String。速度快。
StringUtils
1 | >>> org.apache.commons.lang.StringUtils |
Array
初始化
1 | // 初始化 |
相关常用类
1 | >>> java.util.Arrays |
List
面向接口编程
1 | // 调用方不需要知道 List 的实现。 |
ArrayList
增长机制,源码。特性:插入慢(当数据到一定量时),遍历速度快。
1 | // JDK 源码 |
LinkedList
源码。特性:插入速度快,遍历速度慢。
1 | // JDK 源码 |
两者比较
链表插入数据速度快的说法是相对的,在数据量很小的时候,ArrayList 的插入速度不仅不比 LinkedList 慢,而且还快很多。只有当数据量达到一定量,这个特性才会体现出来,使用时根据场景选择。
集合工具类
1 | >>> java.util.Collections |
CopyOnWriteArrayList
可并发的 ArrayList,读写分离。
1 | List<String> lst = new ArrayList<String>(); |
Map
- Map 作为最基本的数据结果,在代码中出现频率非常大。Java JDK、C++ STL 都对其有很好的支持。
- HashMap、Hashtable 内部维护了一个 Entry 数组。不同的是 Hashtable 对操作的方法都使用了 synchronized 确保线程安全。
- HashTable 中 hash 数组默认大小是 11,增加的方式是 old * 2 + 1。HashMap 中 hash 数组的默认大小是 16,而且一定是 2 的指数。
- 加载因子:Hash 表中元素的填满的程度。加载因子越大,填满的元素越多,空间利用率高,Hash 冲突的机会大。加载因子越小,填满的元素越少,冲突的机会减小,空间浪费多了。冲突的机会越大,则查找的成本越高。反之,查找的成本越小。
HashMap 源码
1 | /** |
TreeMap
内部通过红黑树保证取出来的是排序后的键值对。插入、删除需要维护平衡会牺牲一些效率。但如果要按自然顺序或自定义顺序遍历键,那么 TreeMap 会更好。
参考:Comparable,Comparator。TreeMap 详解
TreeSet
内部通过 TreeMap 实现。TreeSet 元素实现 Comparable 接口或自定义比较器。
ConcurrentHashMap
HashMap 效率高线程不安全,Hashtable 线程安全但效率不高。ConcurrentHashMap 折中办法。
Guava 增强的集合
Multiset
可重复的 Set。HashMultiset,内部 HashMap 实现。
1 | List<Integer> lst = Lists.newArrayList(1, 2, 3, 4, 2, 3); |
BiMap
一个双向映射的 Map,强制 Value 唯一性。
1 | BiMap<String, String> map = HashBiMap.create(); |
Multimap
一个 Key 对应多个 Value,比 Map<String, List
1 | Map<String, List<Integer>> map = new HashMap<String, List<Integer>>(); // 一般写法。 |
反射
Java 反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
1 | class User { |
Bean 属性复制
常用的有 Commons 的 BeanUtils 和 PropertyUtils,Spring 的 BeanUtils。
Commons 的 BeanUtils.copyProperties()会对类型转换,如:Integer 默认 0。Spring 的 BeanUtils.copyProperties()不会。
Commons 的 PropertyUtils.copyProperties()对属性的类型强校验。
类型转换:org.apache.commons.beanutils.converters
1 | public class User1 { |