来赞达 Java 面试题

一面

1 HashMap,HashTable,ConcurrentHashMap 1.7 与 1.8 的区别

HashMap

image.png

HashTable

Hashtable 和 HashMap 采用相同的存储机制,但 Hashtable 是线程安全的,其内部方法几乎都被 synchronized 修饰,粒度比较大

ConcurrentHashMap

image.png

具体见文章:并发容器碎碎念

2 实际项目中使用 es 碰到的问题,es的缺点,es-sql 的缺点,es索引的重建

实际项目中使用 es 碰到的问题

  • 同步延时,ES的数据同步来源于MySQL,会出现不同程度的同步延时
  • 数据丢失,当同步服务出现异常或ES不可用,可能会出现ES数据丢失
  • 并发度低,在压测过程中,发现从es查询的接口性能较差,不能支持高并发,容易出现cpu100%和es集群卡死的情况
    es索引的重建
    由于某些es索引可能一开始没有设计很好,在持续运行过程中发现对于查询或使用不友好、存在性能问题时,需要对这些索引进行重建。
    image.png

3 elastic-job 的原理

Elastic-Job是当当⽹开源的⼀个分布式调度解决⽅案,依赖于Zookeeper进⾏分布式协调。


image.png

4 1亿的数据,找出 top100,怎样实现,怎样划分(海量数据top K 问题)

分治+trie树/hash+小顶堆,即先将数据集按照hash方法分解成多个小数据集,然后使用trie树或者hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出频率最高的前K个数,最后在所有top K中求出最终的top K。

5 垃圾收集器;jvm 老年代和年轻代

垃圾收集器
串行收集器 Serial:Serial,Serial Old
并行收集器 Paraller:Paraller Scavenge,Paraller Old,吞吐量高
并发收集器:CMS,G1,停顿时间少

jvm 老年代和年轻代
Java 的堆进行分代管理是为了方便垃圾回收
年轻代:存放新创建的对象。当对象从这块内存区域消失时,说明发生了一次Minor GC。
老年代:存活下来的年轻代对象被复制到这里。GC 发生的次数少于年轻代,对象从老年代消失,说明发生了一次 Major GC 或 Full GC。

具体见文章学到便秘之 JVM

7 kafka 怎样处理重复消费,为什么选择kafka

Kafka是一款开源的消息引擎系统,用来实现解耦的异步式数据传递。即系统 A 发消息给到 消息引擎系统,系统 B 通过消息引擎系统读取 A 发送的消息,在大数据场景下,能达到削峰填谷的效果。


image.png

手动提交与自动提交结合来处理重复消费

具体见文章:学到羊之Kafka

8 redis 主从复制

Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。
读操作:主库、从库都可以接收;
写操作:首先到主库执行,然后,主库将写操作同步给从库。

具体见文章:学到生无可恋之 Redis(下)

9 spring bean 生命周期,可以自主销毁单例 bean 吗

image.png

也可以自主调方法销毁单例bean

  • 在配置类中指定 @Bean(initMethod = “init”,destroyMethod = “destory”)注解
  • 实现InitializingBean接口并重写其afterPropertiesSet方法,实现DisposableBean接口并重写destroy方法
  • @PostConstruct标注在init方法上,@PreDestroy标注在destroy方法上

10 哪个中间件你最熟悉,具体说一说

11 mybatis 分页插件的原理

12 String,SringBuilder,Stringbuffer 的区别

String 和 StringBuffer
1)String是个不可变长度的字符串;StringBuffer是个可变长度的字符串;
2)在对String类进行操作的时候(例如增加字符),实际上是在内存中产生了一个新的String对象;StringBuffer是给原对象增加字符,不是新创建一个对象;
3)String 覆盖了equals() 方法和 hashCode() 方法,而StringBuffer没有覆盖equals() 方法和 hashCode() 方法。
StringBuilder 和 StringBuffer
StringBuilder是线程非安全的,StringBuffer是线程安全的,二者的方法都是一样的

13 valotile 关键字用来保证可见性

在变量的前面加上 volatile 关键字修饰,该变量就拥有了可见性,每一次变量被修改时,其他线程都对此可见,这样一旦线程 1 改变了这个值,那么线程 2 就可以立刻看到。


image.png

你可能感兴趣的:(来赞达 Java 面试题)