我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
推荐文章:Java 面试知识点解析;Mysql优化技巧(数据库设计、命名规范、索引优化
如何计算出一个二叉树的高度和深度
二叉树第i层上的结点数目最多为2i-1(i>=1)
深度为k的二叉树至多有2k-1个结点(k>=1)
包含n个结点的二叉树的高度至少为(log2n)+1
在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
一致性哈希为什么叫一致性哈希,是什么的一致性
多路调用IO模型指的是哪几路调用
在JAVA NIO中select 和 selectionKey 都是干啥用的,其意义是什么
jdk中实现原子性操作的是哪几个类,实现原理是什么
原子类 AtomicInteger
AtomicLong
AtomicBoolean
AtomicReference
底层是CAS(比较交换)实现 volatile保证内存可见, Unsafe类直接操作内存
cms收集器的内存大小是多少?在收集的时候是使用什么对新生代和老年代进行回收的
如何定位到服务器目前存在的问题,并找到问题所在
happend before 发生原则,为什么会有发生选择的存在
前一操作(执行的结果)必须对后一操作可见(volatile)
前一操作必须在后一操作之前(此处执行顺序不一定在前)
有传递性,例如A happens-before B , B happens-before C 那么A happens-before C
在Spring MVC 中 Dispatchservlet 和 ContextLoaderListener的区别
threadLocal 实现原理 具体在哪里使用到了
做一个书籍阅读排行榜的存储, 该用什么结构存储,为什么用它,好处是什么
rabbitmq 有那几个模块组成,优点是什么,让你实现他的队列你会使用哪种数据结构
如何进行两个服务间的通信,又如何保证服务间的数据一致性,以及数据库一致性
btree+索引的数据结构,存储方式,优点是什么
为字段A 字段B建立独立和关联索引,对SQL执行有什么影响,执行计划是什么
优先建立关联索引,关联索引效率高于独立索引。
MySql 使用到的锁有哪些,是基于什么来实现的
automicInteger基于什么实现的,实现原理是什么
1.volatile 保证内存可见
2.unsafe 直接操作内存
3. CAS :Compare and Swap,
dubbo整体架构有哪几个核心模块组成,每个模块的作用是什么,如何对模块进行扩展,dubbo的缺点是什么
myisam和innodb 两个索引的区别是什么
innodb是否支持全文检索,使用什么结构实现的全文索引
有一个由数字组成的数组,如何找到这个数组中2个数相加为4的数的下标
zookeeper的底层数据结构是什么,如何实现权限限制的
ZooKeeper会会维护一个具有层次关系的数据结构,非常类似于一个标准的文件系统
ZooKeeper这种数据结构有如下这些特点:
1. 每个子目录项如NameService都被称作znode,这个znode是被它所在的路径唯一标识,如Server1这个 znode的标识为/NameService/Server1
2. znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL类型的目录节点不能有子节 点目录
3. znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
4. znode可以是临时节点,一旦创建这个znode的客户端与服务器失去联系,这个znode也将自动删 除,ZooKeeper的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个 连接状态成为session,如果znode是临时节点,这个session失效,znode也就被删除.
5. znode的目录名可以自动编号,如App1已经存在,再创建的话,将会自动命名为App2.
6. znode可以被监控,包括这个目录节点中存储的数据被修改,子节点目录的变化等,一旦变化可以通知设 置监控的客户端,这个是ZooKeeper的核心特性.
权限参考:
https://segmentfault.com/a/1190000012279096
总结, 权限是基于每一个ZNODE zookeeper 是用ACL类对象来设定控制权限,
1). schecma
java ThreadPoolExecuter 线程池的构造函数有哪些配置,作用都是什么,如何基于它实现线程监控
在系统开发过程中,什么情况下使用多线程并行开发,是IO密集型还是CPU密集型
如何保证数据库主从的实时一致性,通过确认模式可以保证一致性
对SQL进行了explain分析 , 已经做到最优的优化后,依旧发现SQL执行非常慢,该如何解决这个问题
zookeeper和mysql 各自都实现了ZAP中的什么规则
CAS原则是基于什么来实现的,让你写一个CAS该怎么来写
在java中使用什么可以实现线程限流
memcached 和 redis mongoDB 的区别
tomcat的线程池配置,默认最大线程池是多少,以及各个配置的意义
CyclicBarrer 是怎么来实现的, 作用是什么
nginx的反向代理,加权轮询算法是怎么一个执行流程 IP_HASH是怎么一个执行流程,以及各自的优缺点,为什么叫反响代理
TCP/IP 三次握手和四次握手 在什么时候发生
indexOf方法是如何实现的
char[]数组
如何实现单向链表的反转 ,所有值反转
dubbo 在使用zookeeper作为注册中心时,是什么交互方式,具体流程是什么,你可有方案换另外一个注册中心
mysql innodb 引擎是如何实现重复读隔离级别的,如何实现事务的
JVM内存组成中,老年代数据都有哪几种来源,年轻代和老年代的回收算法是什么 收集器分别用的是什么
可达性分析算法都从哪几个位置可达,也就是root根节点都有哪几种类型组成
IO模型都有哪几种,分别都由什么来实现的
volatitle 关键字的作用是什么
ReentrantLock 的实现原理是什么
同步器AQS AQS 封装Syn 类
线程的状态都有哪些,使用哪些方法可以进行线程状态间的转换
hashMap 和 concurrentHashMap 的区别
补充:
cookie 和 session
cookie 是在客户端(浏览器) 通常以 key-value保存数据 保存 “过期时间”“域”“路径” cookie 限定只能访问指定域下的路径 跨路径的访问无效
session 是在服务端,关于session 每次新建第一次访问时是没有sessionid的 第一次访问会服务端会生成一个jsessionid放在concurrentHashMap里,并返回这个jsessionid给客户端,客户端会保存的cookie里? 在关闭浏览器之前 每次访问都会带有这个jsessionid ,然后服务端每次都会校验这个sessionid 。如果匹配不到就认为seesion失效。
session 共享问题: 分布式系统设计中session共享 解决方法:
(1)将 服务端生成sesionid 每个节点复制保存一份,
(2)也有服务端通过Redis保存
(3)通过JWT控制, JWT生成一个带有用户信息的token
mysql char 和 varchar 类型
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
CHAR
0-255字节
定长字符串
VARCHAR
0-65535 字节
变长字符串
spring atuoware 和 resource 区别
1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
(2)@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
3 . Tread 调用start( ) 和 run() 的区别
创建一个线程 Thread t1 = new Thread()
t1.run(); 只是调用了一个普通方法,并没有启动另一个线程,程序还是会按照顺序执行相应的代码。
t1.start(); 则表示,重新开启一个线程,不必等待其他线程运行完,只要得到cup就可以运行该线程。
如何控制线程的执行顺序
(1)用 Thrhead.join() 方法
例如: Thread t1 = new Thread();
Thread t2 = new Thread();
Thread t3 = new Thread();
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
join 方法是调用wait() 但是这个wait()是调用的Object 的 wait() 方法 所以join的原理就是 并不是调用当前Thread的wait方法, 是让主线程wait 等待调用join的线程也就是T1执行完成,而其他线程不能去执行, 当该线程执行完成,
(2) 通过 ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(t1);
executor.submit(t2);
executor.submit(t3);
executor.shutdown();
通过构建一个永远只有一个线程的线程池来实现, 因为该线程池 是FIFO的 实现了一个FIFO 先进先出的 队列
5.守护线程
Java分为两种线程:用户线程和守护线程
所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:
(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。
(3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
dubbo和 zookeeper 版本
dubbo 2.5.3
zookeeper 3.4
jvm 监控插件
PinPoint分布式全链路监控
mybatis SqlSessionFactory类
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");
SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例。
1). 调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法;
2). SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建XMLConfigBuilder 对象 ;
3.) SqlSessionFactoryBuilder 调用 XMLConfigBuilder 对象的 parse() 方法;
4. ) XMLConfigBuilder 对象返回 Configuration 对象;
5. )SqlSessionFactoryBuilder 根据 Configuration 对象创建一个DefaultSessionFactory 对象;
6. )SqlSessionFactoryBuilder 返回 DefaultSessionFactory 对象给 Client ,供 Client使用。
关于分布式事务
https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html
转载:https://www.cnblogs.com/yelasilent/p/9056419.html
推荐内容:
Java入门篇(四)——数组
java面试官如何面试别人
Java读取word中表格
Java的消息机制
面试系列-Java面试总则
Java--面试通关要点
Java视频教程等百度云资源分享——更新ing
详解Java的自动装箱与拆箱(Autoboxing and unboxing)
java面试整理
Java常见面试题一