1、----高度注意各种Map类集合Key/Value能不能存储null值的情况
Map | Key | Value |
---|---|---|
HashMap | Nullable | Nullable |
ConcurrentHashMap | NotNull | NotNull |
TreeMap | NotNull | Nullable |
- 由于HashMap的干扰,很多人认为ConcurrentHashMap是可以置入null值。同理,Set中的value实际是Map中的key。
2、----ConcurrentHashMap 使用
//RIGHT
E e = map.get(key);
if (e == null) {
e = new E();
E previous = map.putIfAbsent(key, e);
if ( previous != null) {
return previous;
}
}
return e;
- putIfAbsent 如果传入key对应的value已经存在,就返回存在的value,不进行替换。如果不存在,就添加key和value,返回null
3、----【推荐】Array 与 List互转的正确写法
// list -> array,构造数组时不需要设定大小
String[] array = (String[])list.toArray(); //WRONG;
String[] array = list.toArray(new String[0]); //RIGHT
String[] array = list.toArray(new String[list.size()]); //RIGHT,但list.size()可用0代替。
// array -> list
//非原始类型数组,且List不能再扩展
List list = Arrays.asList(array);
//非原始类型数组, 但希望List能再扩展
List list = new ArrayList(array.length);
Collections.addAll(list, array);
//原始类型数组,JDK8
List myList = Arrays.stream(intArray).boxed().collect(Collectors.toList());
//原始类型数组,JDK7则要自己写个循环来加入了
4、----【强制】静态方法不能被子类覆写。
因为它只会根据表面类型来决定调用的方法。
Base base = new Children();
// 下句实际调用的是父类的静态方法,虽然对象实例是子类的。
base.staticMethod();
5、---- BlockQueue 相关
- 从队列添加元素的方法有:put,add,offer
add:若超出了度列的长度会直接<u>抛出异常</u>。
put: 若向队尾添加元素的时候发现队列已经满了会发生<u>阻塞</u>一直等待空间,以加入元素。
offer:将指定元素插入此队列中,成功时返回 true,如果当前没有可用的空间,则<u>返回 false</u>,不会抛异常
- 从队列中取出并移除元素的方法有:poll,remove,take
remove:若队列为空,抛出NoSuchElementException<u>异常</u>。
take:若队列为空,发生<u>阻塞</u>,等待有元素。
poll: 若队列为空,<u>返回null</u>。 poll(long timeout, TimeUnit unit) 设定等待的时间,如果在指定时间内队列还无值则返回null,不为空则返回队首值
6、---- netty IntObjectHashMap
在插入时,同样把int先取模落桶,如果遇到冲突,则不采样HashMap的链地址法,而是用开放地址法(线性探测法)index+1找下一个空桶,
最后在keys[index],values[index]中分别记录。在查找时也是先落桶,然后在key[index++]中逐个比较key。所以,对比整个数据结构,省的不止是int vs Integer,还有每个Node的内容。
而性能嘛,IntObjectHashMap还是稳赢一点的,随便测了几种场景,耗时至少都有24ms vs 28ms的样子,好的时候甚至快1/3。