赞
踩
说到B+
树,一般和B
树做对比,都是多叉树,B+
数组叶子结点存储数据,其他节点存储索引,而B
树每个节点都存储数据,B+
树叶子结点内通过单向链表连接,节点和节点之间通过双向链表连接
从磁盘IO
方面来看:查询的数据量很大,不可能都存储到内存,所以需要把数据存储到磁盘当中;B
树最坏情况IO
次数达到树的最大深度,而B+
树通常为2~4
次,所以从大量数据找到一条数据,进行的磁盘IO
次数最少
从范围查询方面来看:B+
树叶子节点是通过双向链表连接,所以支持范围查询,而B
树数据分散到各个节点,范围查询相对来说比较难
从全表扫描方面来看:B+
树查询所有数据只需要查询叶子结点,而B
树需要查询整个树
lambda
表达式:在方法参数里传入函数
StreamAPI
:简化对集合的操作;例dishList.stream().map(item -> {}).collect(Collectors.toList());
DateAPI
:方便处理日期和时间
接口可以使用default
关键字,默认实现某个方法
泛型:指定集合存储什么类型的对象,例List<String>
泛型擦除:泛型在编译阶段会擦除,作用兼容之前版本的代码,例List<String> -> List
常用的有两种Monitor
和Condition
,使用不同的线程同步就对应的不同线程通信;
使用synchronize
关键字实现线程同步,即使用Monitor
锁对象实现线程通信,因为锁对象是任意类型,所以通信方式主要在object
中;wait
方法将某个线程状态改变为等待,notify
方法唤醒某个等待线程,notifyall
唤醒所有等待线程
使用lock
接口实现线程同步,即使用Condition
实现线程通信,主要使用await
、signal
、signalall
;await
方法将某个线程状态改变为等待,signal
方法唤醒某个等待线程,signalall
唤醒所有等待线程
Condition
通信方式更加常用,因为synchronizer
只有一个Monitor
,而Lock
可以创建多个Condition
,例如在实现生产者消费者模式,不能生产者通知生产者,消费者通知消费者,而是生产者通知消费者,消费者通知生产者
java.util.concurrent
包,主要有五个方面
atomic
包下的类,使用CAS
(compare and swap
比较与交换)保证单个变量线程安全lock
:锁,比synchronize
主要多三个功能,支持可中断获取锁、非阻塞获取锁、可超时获取锁concurrent
为开头的类,主要降低锁的粒度提高并发能力CopyOnWrite
为开头的类,写时复制的并发容器semaphore
信号量,可以同时访问特定资源的线程数量CountDownLatch
闭锁,等待的线程可以是一个或多个CyclicBarrier
循环屏障,只有当最后一个线程达到屏障时,屏障才会打开,所有被拦截的线程才会执行HashMap | HashTable | |
---|---|---|
底层数据结构 | 数组+链表/红黑树 | 数组+链表 |
父类 | AbstractMap | Dictionary |
线程安全 | 不安全 | 安全 |
初始容量 | 16 | 11 |
扩容方法 | 2n | 2n+1 |
null支持 | key、value 都支持 | 都不支持 |
单线程下使用HashMap
,多线程可以使用ConcurrentHashMap
,HashTable
是古老的API
,``JDK1.0就有了,同步方案不够成熟,性能不好
不是线程安全的,可以通过HashTable
,Collections.synchronizedMap()
将HashMap
转为线程安全的集合,ConcurrentHashMap
解决:
HashTable
是古老的API
,JDK1.0
时就出现了,同步方案不成熟,性能不好;synchronizedMap
方法主要是使用synchronize
关键字;ConcurrentHashMap
降低锁的粒度提高并发能力Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。