美文网首页
jvtool笔记

jvtool笔记

作者: 涂改 | 来源:发表于2019-03-30 14:47 被阅读0次
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。

相关文章

网友评论

      本文标题:jvtool笔记

      本文链接:https://www.haomeiwen.com/subject/jtajbqtx.html