Java基础

String

StringBuffer:线程安全
StringBuilder:线程不安全

集合

List

  • ArrayList
  • LinkedList
  • CopyOnWriteList
  • Collections.synchronizedList 内部包装类,用sync修饰方法

Set

  • HashSet 基于HashMap
  • TreeSet 基于TreeMap

Map

HashMap

特点

  • 允许null值、null键
  • 线程不安全

旧版底层实现

  • 哈希表 + 链表

新版底层实现

  • 哈希表 + 链表
  • 链表长度大于8时,转化为红黑树(避免严重哈希冲突时,性能退化为单链表)

长度为啥是2的次方

1、取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作
2、HashMap的key的hash采用上述方法,性能更高
3、所以分布在2的次方空间,长度取2的次方分布才均匀

ConcurrentHashMap

特点
线程安全的HashMap

版本1.7底层实现
进一步采用分段的方式,每段配置一个锁。Segment继承自ReentranLock

版本1.8底层实现
抛弃了分段方式,使用自旋锁 + Sychronized 方式来保证并发安全
put时,若key对应的value为null,通过cas保证写入成功,否则加Sychronized锁

对于读操作,由于数组被volatile关键字修饰,因此不用担心数组的可见性问题。同时每个元素是一个Node实例(Java 7中每个元素是一个HashEntry),它的Key值和hash值都由final修饰,不可变更,无须关心它们被修改后的可见性问题。而其Value及对下一个元素的引用由volatile修饰,可见性也有保障。

static class Node<K,V> implements Map.Entry<K,V> {
  final int hash;
  final K key;
  volatile V val;
  volatile Node<K,V> next;
}

对于Key对应的数组元素的可见性,由Unsafe的getObjectVolatile方法保证。

static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) {
  return (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE);
}

TreeMap

红黑树,Node.Key 即为 key,Node.value 即为 value

因此:

  • 不允许重复Key
  • 可以排序,需要实验Compartable

BlockingQueue

阻塞队列,用于生产者消费者

  • ArrayBlockingQueue (ReentrantLock.Condition来实现)
  • LinkedBlockingQueue
  • PriorityBlockingQueue 优先级队列
  • DelayQueue 延时队列
  • SynchronousQueue (无缓存,生产者直接对接消费者)

异常

try-with-resource

自动关闭资源,需要实现AutoCloseAble接口

try (Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
    // code
} catch (IOException e){
    // handle exception
}

发布于 2020/08/22 浏览