牛客面试题库(9)

请你说说索引怎么实现的B+树,为什么选这个数据结构?

说到B+树,一般和B树做对比,都是多叉树,B+数组叶子结点存储数据,其他节点存储索引,而B树每个节点都存储数据,B+树叶子结点内通过单向链表连接,节点和节点之间通过双向链表连接

从磁盘IO方面来看:查询的数据量很大,不可能都存储到内存,所以需要把数据存储到磁盘当中;B树最坏情况IO次数达到树的最大深度,而B+树通常为2~4次,所以从大量数据找到一条数据,进行的磁盘IO次数最少

从范围查询方面来看:B+树叶子节点是通过双向链表连接,所以支持范围查询,而B树数据分散到各个节点,范围查询相对来说比较难

从全表扫描方面来看:B+树查询所有数据只需要查询叶子结点,而B树需要查询整个树

请你讲一下Java8的新特性

lambda表达式:在方法参数里传入函数

StreamAPI:简化对集合的操作;例dishList.stream().map(item -> {}).collect(Collectors.toList());

DateAPI:方便处理日期和时间

接口可以使用default关键字,默认实现某个方法

请你说说泛型、泛型擦除

泛型:指定集合存储什么类型的对象,例List<String>

泛型擦除:泛型在编译阶段会擦除,作用兼容之前版本的代码,例List<String> -> List

说说你了解的线程通信方式

常用的有两种MonitorCondition,使用不同的线程同步就对应的不同线程通信;

使用synchronize关键字实现线程同步,即使用Monitor锁对象实现线程通信,因为锁对象是任意类型,所以通信方式主要在object中;wait方法将某个线程状态改变为等待,notify方法唤醒某个等待线程,notifyall唤醒所有等待线程

使用lock接口实现线程同步,即使用Condition实现线程通信,主要使用awaitsignalsignalallawait方法将某个线程状态改变为等待,signal方法唤醒某个等待线程,signalall唤醒所有等待线程

Condition通信方式更加常用,因为synchronizer只有一个Monitor,而Lock可以创建多个Condition,例如在实现生产者消费者模式,不能生产者通知生产者,消费者通知消费者,而是生产者通知消费者,消费者通知生产者

请你说说JUC

java.util.concurrent包,主要有五个方面

  • 原子类:atomic包下的类,使用CAScompare and swap比较与交换)保证单个变量线程安全
  • lock:锁,比synchronize主要多三个功能,支持可中断获取锁、非阻塞获取锁、可超时获取锁
  • 线程池:方便管理线程,避免重复开线程和关线程带来的消耗
  • 并发集合:
    • concurrent为开头的类,主要降低锁的粒度提高并发能力
    • CopyOnWrite为开头的类,写时复制的并发容器
  • 同步工具:
    • semaphore信号量,可以同时访问特定资源的线程数量
    • CountDownLatch闭锁,等待的线程可以是一个或多个
    • CyclicBarrier循环屏障,只有当最后一个线程达到屏障时,屏障才会打开,所有被拦截的线程才会执行

请你说说HashMap和HashTable的区别

HashMapHashTable
底层数据结构数组+链表/红黑树数组+链表
父类AbstractMapDictionary
线程安全不安全安全
初始容量1611
扩容方法2n2n+1
null支持key、value都支持都不支持

单线程下使用HashMap,多线程可以使用ConcurrentHashMapHashTable是古老的API,``JDK1.0就有了,同步方案不够成熟,性能不好

HashMap是线程安全的吗?如果不是该如何解决?

不是线程安全的,可以通过HashTableCollections.synchronizedMap()HashMap转为线程安全的集合,ConcurrentHashMap解决:

  • HashTable是古老的APIJDK1.0时就出现了,同步方案不成熟,性能不好;
  • synchronizedMap方法主要是使用synchronize关键字;
  • 推荐使用ConcurrentHashMap降低锁的粒度提高并发能力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值