Java面试题总结

这篇博客的题目,主要来自下面的这个链接,是阿里的一些面试题汇总,我自己在网上找了一些自己感觉还不错的答案,外加自己的一些小总结,汇总如下,后续还会持续更新:

corejava
1.hashcode相等两个类一定相等吗?equals呢?相反呢?
2.介绍一下集合框架?
3.hashmap和hashtable底层实现什么区别?hashtable和concurrenthashmap呢?(还有hashmap和concurrentHashmap的区别)*********
Hashtable 线程安全很好理解,因为它每个方法中都加入了Synchronize。
4.hashmap和treemap什么区别?底层结构是什么?
5.线程池用过么?都有什么参数?底层是如何实现的?
到这里,大家应该明白了ThreadPoolExecutor、AbstractExecutorService、ExecutorService和Executor几个之间的关系了。
Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;
然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;
抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;
然后ThreadPoolExecutor继承了类AbstractExecutorService。
在ThreadPoolExecutor类中有几个非常重要的方法:
1
2
3
4
execute()
submit()
shutdown()
shutdownNow()
6.synchronized和lock的区别?synchronized什么情况是对象锁,什么时候是全局锁,为什么?
7.ThreadLocal是什么?底层如何实现?写一个例子。
8.volatile的工作原理
9.cas知道吗?如何实现的?
10.请用至少四中写法,写一个单例模式。


抽象类和接口的区别: http://www.cnblogs.com/dolphin0520/p/3811437.html

JVM
JVM纯洁的微笑: http://www.ityouknow.com/jvm.html
称为java GC专家前四篇: http://www.importnew.com/author/wangxiaojie
1.请介绍一下JVM内存模型?用过什么垃圾回收器?都说说呗?
直接看深入理解java虚拟机这本书的第三章。

2.线上发送频繁full gc如何处理?CPU使用率过高怎么办?如何定位问题?如何解决?说一下解决思路和处理方法
CPU:
3.知道字节码吗?字节码都有哪些?Integer x=5,int y=5,比较x==y都经过哪些步骤?
4.讲讲类加载机制?都有哪些类加载器,这些类加载器都加载哪些文件?手写一下类加载Demo。
http://blog.csdn.net/briblue/article/details/54973413 (类加载器详解和demo,这个链接都有)
注意:这里父类加载器并不是通过继承关系来实现的,而是采用组合实现的。
如果要编写一个classLoader的子类,也就是自定义一个classloader,建议覆盖findClass()方法,而不要直接改写loadClass()方法。
5.知道osgi吗?他是如何实现的?
OSGI全称为Open Service Gateway Initiative(开放服务网关规范)
6.做过哪些JVM优化?使用什么方法?达到什么效果?
7.class.forName("java.lang.String")和String.class.getClassLoader().loadClass("java.lang.String")什么区别?
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
Class.forName()的newInstance()和直接new一个对象的区别: https://www.cnblogs.com/xingzc/p/5760166.html
另外,要知道连接数据库的时候,为甚么只写一个Class.forName()就可以了:加载了静态代码块。
spring(要保证AOP和IOC的底层代码都会写)
1.Spring都有哪些机制?AOP底层如何实现的?IOC呢?
2.cglib知道吗?他和jdk动态代理什么区别?手写一个jdk动态代理呗?

分布式消息队列
1.为什么使用消息队列?消息队列有什么优点和缺点?
2.如何保证消息队列的高可用?如何保证消息不被重复消费?
高可用:集群
1. 消费端处理消息的业务逻辑保持幂等性 
2. 保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现 (RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重)
3.kafka,activemq,RabbitMQ,rocketmq各有什么优点,缺点?
4.如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。
各种消息队列的使用场景:

数据库
1.使用mysql索引都有哪些原则?索引是什么数据结构?B+tree和B tree有什么区别?
索引其他收集: http://blog.jobbole.com/86594/
MySQL 百万级分页优化(Mysql千万级快速分页): http://www.jb51.net/article/31868.htm
MySQL 对于千万级的大表要怎么优化:https://www.zhihu.com/question/19719997/answer/81930332
B树(就是所谓的B-树),B+树和B*树: http://www.cnblogs.com/tgycoder/p/5077017.html#top
MySQL普遍使用B+Tree实现其索引结构。MySQL默认的存储引擎是MYISAM。
2.mysql有哪些存储引擎?都有啥区别?要详细!!!
MySQL常用的四种引擎:MyISAM,InnoDB,Memory,merge。
3.设计高并发系统数据库层面该怎么设计?数据库锁有哪些模型?如何实现呢?
4.数据库事务有哪些?

分库分表
分库分表需要考虑的问题及方案
1.如何设计可以动态扩容缩容的分库分表方案?
2.用过哪些分库分表中间件,有啥优点和缺点,讲一下你了解的分库分表中间件的底层实现原理?
3.我现在有一个未分库分表的系统,以后系统需分库分表,如何设计,让未分库分表的系统动态切换到分库分表的系统上??
4. 分布式事务知道么?你们怎么解决的?TCC?那若出现网络原因,网络连不通怎么办呢?
5.为什么要分库分表?
6.分布式寻址方式都有哪些算法?知道一致性hash吗?手写一下java实现代码?你若userId取摸分片,那我要查一点连续时间里的数据怎么办?
7.如何解决分库分表主键问题?有什么实现方案?

分布式缓存
1.redis和Memcached什么区别?为什么单线程的redis比多线程的Memcached效率要高呢?
I/O多路复用是同步非阻塞
I/O多路复用涉及到网络编程,下面的博客介绍了Socket编程及三次握手和四次挥手在socket中的解释:
在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别
2.redis有什么数据类型?都在哪些场景下使用呢?
3.redis的主从复制是怎么实现的?redis的集群模式是如何实现的呢?redis的key是如何寻址的呢?
redis支持多个数据库: https://www.cnblogs.com/EasonJim/p/7818004.html
4.使用redis如何设计分布式锁?使用zk可以么?如何实现呢?这两种哪个效率更高呢?
5.知道redis的持久化吗?都有什么优点缺点呢?具体底层实现呢?
6.redis过期策略都有哪些?LRU?写一下java版本的代码吧??
过期策略: https://www.cnblogs.com/java-zhao/p/5205771.html (定时删除,惰性删除,定期删除)
内存淘汰策略: https://www.jianshu.com/p/8aa619933ebb (LRU【 最近最少使用算法】 就是这里的)
LRU (Least Recently Used) 算法: http://blog.jobbole.com/107084/ (python版本,比较详细)
java版本: http://www.importnew.com/16264.html (用的现成的库)

分布式服务框架
1.说一下dubbo的实现过程?注册中心挂了可以继续通信么?
Architecture
  1. Provider: 暴露服务的服务提供方。
  2. Consumer: 调用远程服务的服务消费方。
  3. Registry: 服务注册与发现的注册中心。
  4. Monitor: 统计服务的调用次调和调用时间的监控中心。
  5. Container: 服务运行容器。
Relations
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务 提供者地址列表 给消费者,如果有变更,注册中心将 基于长连接推送变更数据 给消费者。
4.  服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如调用失败,选另一台调用
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
6. 注册中心,服务提供者,服务消费者三者之间均为 长连接 ,监控中心除外
7.  注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
8.  注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
2.zk原理知道么?zk都可以干什么?Paxos算法知道么?说一下原理和实现?
3.dubbo支持哪些序列化协议?hessian?说一下hessian的数据结构?PB知道么?为啥PB效率是最高的呢?
4.知道netty吗?netty可以干嘛?NIO,BIO,AIO都是什么呢?有什么区别?
NIO,BIO,AIO时什么,以及三者的区别: http://blog.csdn.net/haoyuyang/article/details/53231585
5.dubbo负载均衡策略和高可用策略都有哪些呢?动态代理策略呢?
6.为什么要进行系统拆分呢?拆分不用dubbo可以么?dubbo和thrift什么区别呢?

通信协议
1.说一下TCP/IP四层?
七层和四层:https://www.cnblogs.com/wxgblogs/p/5641643.html(里面有张七层的图挺不错)
2.http的工作流程???http1.0 http1.1 http2.0 具体哪些区别?
3.TCP三次握手,四次分手的工作流程?画一下流程图?为什么不是四次五次或者两次?
4.画一下https的工作流程?具体如何实现啊?如何防止被抓包啊?

备用知识:
redis的I/O多路复用
链接:https://www.zhihu.com/question/28594409/answer/52835876
下面举一个例子,模拟一个tcp服务器处理30个客户socket。
假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:
1. 第一种选择: 按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主,全班都会被耽误。
这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
2. 第二种选择:你 创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
3. 第三种选择,你 站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。
这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用 非阻塞模式
这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是 事件驱动,所谓的reactor模式。
同步,异步,阻塞,非阻塞: https://www.jianshu.com/p/aed6067eeac9
解释I/O多路复用为啥是同步非阻塞的: https://www.jianshu.com/p/486b0965c296
select,poll,epoll: https://www.jianshu.com/p/dfd940e7fca2

总结的相当不错的博客:
牛客网( https://www.nowcoder.com ),有很多面试题和各个公司的笔试题。







  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值