0927Java面试知识点准备

  1. 并发集合和普通集合有何区别?
    常见的并发集合包含ConcurrentHashMap,ConcurrentLinkedDeque,ConcurrentLinkedQueue.java中的集合分为普通集合,同步集合,并发集合.
    普通集合读写效率最高,同步(线程安全)集合知识例如HashTable,Vectory,这种采用了sychronzied关键字,严重降低了系统的性能.所以只能被称为线程安全集合,还没能做到并发集合的目的.而并发集合就是通过复杂的策略不仅保证线程的安全同时保证并发的效率.
  2. Java并发包concurrent——ConcurrentHashMap相关知识点?

java中常见的集合包含Collection集合+Map集合.平时使用最多的也就是LinkedList、ArrayList、HashMap,但是这些集合实际上是非线程安全的.所以出现了如HashTable,Vector等线程安全集合.但是这些集合控制并发的方式是在put方法里面添加synchronzied关键字,通过锁对象的方式控制并发的.但这种方案明显效率太低,所以在jdk1.5之后引入ConcurrentHashMap,ConcurrentLinkedQueue,ConcurrentLinkedDeque,这里重点讲一下线程安全ConcurrentHashMap集合,jdk1.7版本下是通过锁分段的方式控制多线程并发安全问题,而jdk1.8版本是通过数据+链表+红黑树的方式控制(jdk1.8版本下hashMap集合也是这种方式).

**jdk1.5~jdk1.7下通过分段锁控制:**最简单的理解就是ConcurrentHashMap内部存在着Segment数组,每一个Segment即每个分段锁都类似一个HashTable.每次添加一个新的元素,根据key计算hash值,判断属于哪个Segment对象,将Segment元素进行加锁.这样便实现多线程下线程安全的问题,同时提高了并发效率.

jdk1.8采用数据+链表+红黑树.加锁的方式通过CAS+synchronzied方法控制.
CAS(compare and swap):悲观锁与乐观锁.悲观锁认为在并发情况下,数据一定发生修改(不允许其他线程操作静态数据).而乐观锁则认为并发修改同一个数据并不一定发生修改,采用不断重试的机制(说白了允许修改,但是修改前得判断,中间版本号是否发生修改.如果发生修改利用ABA重试机制,允许其他线程访问共享数据).
CAS有三个操作数,内存值V,预期值A,修改值B.当且仅当A=V的时候,才将V修改为V.Java中本地通过JNI实现。jdk1.8版本下的ConcurrentHashmap集合的数据结构通hashmap一致,是数组+链表+红黑树.内部有一个Node类,继承自Map.Entry.当Node链表的长度超过8的时候,链表会升级为红黑树结构.ConcurrentHashMap有一个sizeCtl数字,表示控制标识符.当其表示0的时候,表示还未初始化.大于0表示初始化或扩容的大小.-1表示正在扩容,其他负数表示正在由n-1个线程进行扩容.

ConcurrentHashMap的重要概念:初始化 扩容 预计并发量
构造方法:默认容器长度 负载因子 预计并发量,判断这些参数是否有问题,如果为负数则抛出异常,如果默认容器长度小于预计并发量,那么说明容量长度不足,将预计并发量concurrentLevel设置为默认容器长度,然后计算sizeCtl扩容表示的值.
可以看到实际上构造方法中并没有对Segment数组进行初始化只是简单的设置扩容表示符.sizeCtl表示扩容标识符,当sizeCtl的值等于0表示还未初始化,>0表示初始或扩容的个数.一般是当前容量的0.75.当为-1表示正在扩容.-N表示正在有N-1个线程进行扩容.
实际上集合容器的初始化是在put方法中,如果判断发现Node数组长度为0或者为空的话,会调用intaitalTable方法初始化.

  1. 什么是红黑树数据结构?
    红黑树是一种平衡查找二叉树.常用于与数组关联.java中在jdk1.8版本之后在HashMap集合中添加了这一特性,当数组上链表的长度超过8的时候,会将链表的结构转换为红黑树结构.而当红黑树的结构长度小于6的时候,会将红黑树结构转换为单链表结构.(实际上jdk1.8版本当链表长度增加时首先会考虑扩容,只有在扩容超过64的时候才会进行数据结构的转换)

红黑树结构存在以下特点:
1.根节点是黑色
2.节点由红色和黑色组成
3.从任意节点到每个叶子的节点的黑色节点数量是一样的.
4.红色节点是有2个黑色节点组成的

你可能感兴趣的:(Java从入门到精通)