JAVA基础面试题,java高级面试笔试题


我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色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

 




  1.  
  2.  

    java ThreadPoolExecuter 线程池的构造函数有哪些配置,作用都是什么,如何基于它实现线程监控


     


     
  3.  

    在系统开发过程中,什么情况下使用多线程并行开发,是IO密集型还是CPU密集型


     


     
  4.  

    如何保证数据库主从的实时一致性,通过确认模式可以保证一致性


     


     
  5.  

    对SQL进行了explain分析 , 已经做到最优的优化后,依旧发现SQL执行非常慢,该如何解决这个问题


     


     
  6.  

    zookeeper和mysql 各自都实现了ZAP中的什么规则


     


     
  7.  

    CAS原则是基于什么来实现的,让你写一个CAS该怎么来写


     


     
  8.  

    在java中使用什么可以实现线程限流


     


     
  9.  

    memcached 和 redis mongoDB 的区别


     


     
  10.  

    tomcat的线程池配置,默认最大线程池是多少,以及各个配置的意义


     


     
  11.  

    CyclicBarrer 是怎么来实现的, 作用是什么


     


     
  12.  

    nginx的反向代理,加权轮询算法是怎么一个执行流程 IP_HASH是怎么一个执行流程,以及各自的优缺点,为什么叫反响代理


     


     
  13.  

    TCP/IP 三次握手和四次握手 在什么时候发生


     


     
  14.  

    indexOf方法是如何实现的

     

    char[]数组


     


     
  15.  

    如何实现单向链表的反转 ,所有值反转


     


     
  16.  

    dubbo 在使用zookeeper作为注册中心时,是什么交互方式,具体流程是什么,你可有方案换另外一个注册中心


     


     
  17.  

    mysql innodb 引擎是如何实现重复读隔离级别的,如何实现事务的


     


     
  18.  

    JVM内存组成中,老年代数据都有哪几种来源,年轻代和老年代的回收算法是什么 收集器分别用的是什么


     


     
  19.  

    可达性分析算法都从哪几个位置可达,也就是root根节点都有哪几种类型组成


     


     
  20.  

    IO模型都有哪几种,分别都由什么来实现的


     


     
  21.  

    volatitle 关键字的作用是什么


     


     
  22.  

    ReentrantLock 的实现原理是什么

     

    同步器AQS AQS 封装Syn 类


     


     
  23.  

    线程的状态都有哪些,使用哪些方法可以进行线程状态间的转换


     


     
  24.  

    hashMap 和 concurrentHashMap 的区别


     


     



 

补充:




  1.  
  2.  

    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




  1.  
  2.  

    mysql char 和 varchar 类型

     

    CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

     

    CHAR

     

    0-255字节

     

    定长字符串




     

    VARCHAR

     

    0-65535 字节

     

    变长字符串




     


     
  3.  

    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.  
  2.  

    如何控制线程的执行顺序


     


     

 

(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) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。




  1.  
  2.  

    dubbo和 zookeeper 版本


     


     

dubbo 2.5.3

zookeeper 3.4




  1.  
  2.  

    jvm 监控插件


     


     

PinPoint分布式全链路监控




  1.  
  2.  

    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");

 

MyBatis 初始化基本过程:

 

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使用。

 




  1.  
  2.  

    关于分布式事务

     

    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常见面试题一

 

绝对想你所想,超乎想象!够详细,够给力! 目录 1. Jvm内存空间结构是什么样的? 1 程序计数器 1 Java栈 1 本地方法栈 2 堆 2 方法区 3 2. Jvm堆内存的划分结构和优化 3 2.1. 原理 6 2.1.1. 年轻代 6 2.1.2. 年老代 6 2.1.3. 持久代 7 2.2. 参数说明 8 2.3. 疑问解答 9 2.4. 垃圾回收器选择 10 2.4.1. 串行收集器 10 2.4.2. 并行收集器(吞吐量优先) 10 2.4.3. 并发收集器(响应时间优先) 11 2.4.4. 其它垃圾回收参数 11 2.5. 辅助信息参数设置 12 2.6. 关于参数名称等 13 3. JVM服务参数调优实战 14 3.1. 大型网站服务器案例 14 3.2. 内部集成构建服务器案例 15 4. 常量池在jvm的哪个空间里边? 17 5. jvm垃圾回收是什么时候触发的? 17 5.1. 那究竟GC为我们做了什么操作呢? 17 5.1.1. Jvm怎么判断对象可以回收了? 18 5.2. 下面我们来看一下几种垃圾收集算法 18 5.2.1. 在JDK1.2之前,使用的是引用计数器算法, 18 5.2.2. 根搜索算法 19 5.2.3. 引用的分类 19 5.3. 方法区也是会被回收的 20 5.4. 下面我们来逐一介绍一下每个垃圾回收器。 22 5.4.1. 1、 Serial收集器 22 5.4.2. 2、 ParNew收集器 23 5.4.3. 3、 ParallelScavenge 23 5.4.4. 4、 ParallelOld 24 5.4.5. 5、 SerialOld 24 5.4.6. 6、CMS 24 5.4.7. 7、 GarbageFirst(G1 ) 26 6. 常量池如何触发的垃圾回收? 28 7. 垃圾回收从哪里开始检测树进行回收?根节点是什么? 28 7.1. 目前java中可作为GC Root的对象有 29 8. Redis怎么判断对象可以清理了? 29 9. Redis怎么提高命中率? 29 10. Finalize中调用垃圾回收方法,再调用方法会回收么? 29 11. Int进行自增操作,如何保证线程安全? 30 12. Int a=1是原子方法,布尔类型进行赋值是原子方法么? 30 12.1. 多线程原子操作的安全性 31 13. Cas怎么实现unsafe? 32 13.1. Unsafe 32 13.2. CAS 32 13.3. 由CAS分析AtomicInteger原理 33 13.4. CAS的缺点 35 14. Map数据结构? 35 14.1. 一、定义 36 14.2. 二、构造函数 36 14.3. 三、数据结构 36 14.4. 四、存储实现:put(key,vlaue) 38 14.5. 五、读取实现:get(key) 41 15. 一百万数据放Arraylist数组,怎么放? 在哪个代? 42 15.1.1. 调整数组容量 42 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 43 17. 数据库组合索引,储存在一个叶子节点还是多个? 44 17.1. 索引的利弊与如何判定,是否需要索引: 44 17.1.1. 索引的好处 44 17.1.2. 索引的弊端 44 17.1.3. 如何判定是否须要创建索引 44 17.2. 复合索引优化 45 17.3. 下面是一些常见的索引限制问题 45 17.3.1. 使用不等于操作符(<>, !=) 45 17.3.2. 使用 is null 或 is not null 45 17.3.3. 使用函数 45 17.3.4. 比较不匹配的数据类型 46 17.4. 关于索引的排序 46 18. 数据库没有orderby默认如何排序。 46 19. 分布式事务如何实现。 46 19.1. 1 事务/分布式事务 47 19.1.1. 1.1 事务 47 19.1.2. 1.2 分布式事务与 XA 规范 47 19.2. 2 两阶段提交协议 47 19.2.1. 2.1 预提交阶段 48 19.2.2. 2.2 提交阶段 48 19.3. 3 分布式事务应用框架 48 19.3.1. 3.1 角色 48 19.3.2. 3.2 交互时序 49 19.3.3. 3.3 关键点 50 19.3.4. 参考 50 20. Jvm底层源码 51 21. 二叉树怎么实现的? 51 22. Executourservice 数据结构。哪种只能执行一个线程。 Cache怎么实现的 fixed线程如果中断,线程回自己销毁么? 51 23. 栅栏的原理和实现。 51 23.1. 1. CyclicBarrier简介 51 23.2. 2. CyclicBarrier数据结构 52 23.3. 3. CyclicBarrier源码分析(基于JDK1.7.0_40) 52 23.3.1. 3.1 构造函数 52 23.3.2. 3.2 等待函数 53 23.4. 4. CyclicBarrier的使用示例 57 23.4.1. 示例1 57 23.4.2. 示例2 59 24. Blockingqueue有几种形式?各自的编码方式。 72 24.1. Queue接口 72 24.2. BlockingQueue接口 73 24.2.1. ArrayBlockingQueue 74 24.2.2. LinkedBlockingQueue 78 24.2.3. LinkedBlockingDeque(双向并发阻塞队列) 84 24.2.4. PriorityBlockingQueue(优先阻塞队列) 85 24.2.5. 总结一下阻塞队列 90 25. Tomcat 如何管理servlet? 90 26. Servlet生命周期 90 27. 没有缓存,如何实现领券并发操作? 92
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值