一、SpringBoot的优势?html
1)建立独立的Spring应用程序。SpringBoot能够jar包的形式进行独立的运行,使用:java -jar xx.jar就能够成功运行项目,或者在项目的主程序中运行main函数。前端
2)springboot项目不须要单独下载Tomcat等传统服务器,内嵌容器,使得咱们能够执行运行项目的主程序main函数,并让项目的快速运行,另外,也下降对运行环境的基本要求,环境变量中有JDK便可。java
3)Spring Boot提供了一系列的starter pom用来简化咱们的Maven依赖,经过这些starter项目就能以Java Application的形式运行Spring Boot项目,而无需其余服务器配置。mysql
4)Spring Boot提供Spring框架的最大自动化配置,大量使用自动配置,使得开发者对Spring的配置尽可能减小。Spring Boot更多的是采用 Java Config 的方式,对 Spring 进行配置。linux
可参考:https://www.cnblogs.com/echol...web
二、ThreadLocal原理,应用场景面试
ThreadLocal主要用来存储当前线程上下文的变量信息,它能够保障存储进去的数据,只能被当前线程读取到,而且线程之间不会相互影响。ThreadLocal为变量在每一个线程中都建立了一个副本,那么每一个线程能够访问本身内部的副本变量。redis
ThreadLocal有哪些典型的应用场景:算法
1)数据库事务。经过AOP的方式,对执行数据库事务的函数进行拦截。函数开始前,获取connection开启事务并存储在ThreadLocal中,任何用到connection的地方,从ThreadLocal中获取,函数执行完毕后,提交事务释放connection。spring
2)web项目中,用户的登陆信息一般保存在session中。作一个拦截器,把用户信息放在ThreadLocal中,在任何用到用户信息的时候,只须要从TreadLocal中读取就能够了。
ThreadLocal 内部维护了一个ThreadLocalMap 的静态内部类。ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,弱引用的特色是,若是这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。
三、AtmoicInteger的原理,CAS原理
cas:将指定内存地址的内容与所给的某个值相比,若是相等,则将其内容替换为指令中提供的新值,若是不相等,则更新失败。AtomicInteger的本质:自旋锁+CAS原子操做。AtomicInteger中用的就是Unsafe的CAS操做。
四、ReentrantLock,synchronized的区别
1)Synchronize是基于jvm的,ReentrantLok是基于JDK的。
2)ReentrantLock多了几条特性。等待锁的线程可终止,可实现公平。
3)ReentrantLock可实现选择性通知。synchronized中wait notify,notifyAll时是唤醒全部wait的线程。而ReentrantLock中Condition可建立多个,siginalAll时唤醒的是那个Condition实例wait的全部线程。
五、ConcurrentHashmap的底层数据结构,put操做
ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构多是链表,也多是红黑树,红黑树是为了提升查找效率。
说明:put函数底层调用了putVal进行数据的插入,对于putVal函数的流程大致以下。
① 判断存储的key、value是否为空,若为空,则抛出异常,不然,进入步骤②
② 计算key的hash值,随后进入无限循环,该无限循环能够确保成功插入数据,若table表为空或者长度为0,则初始化table表,不然,进入步骤③
③ 根据key的hash值取出table表中的结点元素,若取出的结点为空(该桶为空),则使用CAS将key、value、hash值生成的结点放入桶中。不然,进入步骤④
④ 若该结点的的hash值为MOVED,则对该桶中的结点进行转移,不然,进入步骤⑤
⑤ 对桶中的第一个结点(即table表中的结点)进行加锁,对该桶进行遍历,桶中的结点的hash值与key值与给定的hash值和key值相等,则根据标识选择是否进行更新操做(用给定的value值替换该结点的value值),若遍历完桶仍没有找到hash值与key值和指定的hash值与key值相等的结点,则直接新生一个结点并赋值为以前最后一个结点的下一个结点。进入步骤⑥
⑥ 若binCount值达到红黑树转化的阈值,则将桶中的结构转化为红黑树存储,最后,增长binCount的值。
将ConcurrentHashMap容器的数据分段存储,每一段数据分配一个Segment(锁),当线程占用其中一个Segment时,其余线程可正常访问其余段数据。
六、final 和 finally的区别
1.当用final修饰类的时,代表该类不能被其余类所继承。
2.final修饰方法,把方法锁定,以防止继承类对其进行更改。
3.final成员变量表示常量,只能被赋值一次,赋值后其值再也不改变。当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;若是final修饰一个引用类型时,则在对其初始化以后便不能再让其指向其余对象了,但该引用所指向的对象的内容是能够发生变化的。
finally做为异常处理的一部分,它只能用在try/catch语句中,而且附带一个语句块,表示这段语句最终必定会被执行(无论有没有抛出异常),常常被用在须要释放资源的状况下。
七、JVM GC,何时执行minorGC,fullGC
Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,可是没必要然执行
(2)老年代空间不足
若是建立一个大对象,Eden区域当中放不下这个大对象,会直接保存在老年代当中,若是老年代空间也不足,就会触发Full GC。为了不这种状况,最好就是不要建立太大的对象。
(3)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。
八、CMS的过程,优缺点,使用场景
1)初始标记(CMS initial mark)只是标记一下GC Roots可以直接关联的对象,速度很快,仍然须要暂停全部的工做线程。
2)并发标记(CMS concurrent mark)和用户线程一块儿。进行GC Roots跟踪过程,和用户线程一块儿工做,不须要暂停工做线程。主要标记过程,标记所有对象
3)从新标记(CMS remark)。为了修正并发标记期间,因用户程序继续运行而致使标记产生变更的那一部分对象的标记记录,仍然须要暂停全部的工做线程。
4)并发清除(CMS concurrent sweep)和用户线程一块儿。清除GC Roots不可达对象,和用户线程一块儿工做,不须要暂停工做线程。基于标记结果,直接清理对象
因为耗时最长的并发标记和并发清除过程当中,垃圾收集线程能够和用户如今一块儿并发工做,因此整体上看来CMS收集器的内存回收和用户线程是一块儿并发的执行。
优势:并发收集停顿低。
缺点:并发执行,cpu资源压力大。
因为并发进行,CMS在收集与应用线程会同时增长对堆内存的占用,也就是说,CMS必需要在老年代堆内
存用尽以前完成垃圾回收,不然CMS回收失败时,将出发担保机制,串行老年代收集器将会以STW的方式
进行一次GC,从而形成较大停顿时间。
采用的标记清除算法致使大量的碎片。标记清除算法没法整理空间碎片,老年代空间会随着应用时长被逐步耗尽,最后将不得不经过担保机制堆
堆内存进行压缩。
九、AOP是什么,实现原理
面向切面编程。AOP技术利用一种称为“横切”的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减小系统的重复代码。经常使用在权限认证、日志、事务处理。
实现原理是动态代理。InvocationHandler。Itask taskProxy= (Itask) Proxy.newProxyInstance(Itask.class.getClassLoader(),new Class[]{Itask.class},invocationHandler);
十、索引,数据库锁
汇集索引就是以主键建立的索引。非汇集索引就是以非主键建立的索引。汇集索引在叶子节点存储的是表中的数据。非汇集索引在叶子节点存储的是主键和索引列。
使用非汇集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。
1)最左前缀匹配原则。MySQL会一直向右匹配直到遇到范围查询(>,<,BETWEEN,LIKE)就中止匹配。
2)尽可能选择区分度高的列做为索引,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。
表示字段不重复的比率,比率越大咱们扫描的记录数就越少。
3)索引列不能参与计算,尽可能保持列“干净”。好比,FROM_UNIXTIME(create_time) = '2016-06-06' 就不能使用索引,缘由很简单,B+树中存储的都是数据表中的字段值,可是进行检索时,须要把全部元素都应用函数才能比较,显然这样的代价太大。因此语句要写成 :create_time = UNIX_TIMESTAMP('2016-06-06')。
4)尽量的扩展索引,不要新创建索引。好比表中已经有了a的索引,如今要加(a,b)的索引,那么只须要修改原来的索引便可。
5)单个多列组合索引和多个单列索引的检索查询效果不一样,由于在执行SQL时,MySQL只能使用一个索引,会从多个单列索引中选择一个限制最为严格的索引。
可参考:https://www.cnblogs.com/yelon...
InnoDB只有经过索引条件检索数据才使用行级锁,不然,InnoDB将使用表锁。也就是说,InnoDB的行锁是基于索引的!
在表读锁和表写锁的环境下:读读不阻塞,读写阻塞,写写阻塞!
InnoDB实现了如下两种类型的行锁。
共享锁(S锁):容许一个事务去读一行,阻止其余事务得到相同数据集的排他锁。
也叫作读锁:读锁是共享的,多个客户能够同时读取同一个资源,但不容许其余客户修改。
排他锁(X锁):容许得到排他锁的事务更新数据,阻止其余事务取得相同数据集的共享读锁和排他写锁。
也叫作写锁:写锁是排他的,写锁会阻塞其余的写锁和读锁。
十一、Mysql隔离级别
1)脏读:A,B两事务,A事务会读取到B事务未提交的数据,而后B由于某些缘由回滚数据,因此A就读取了B没有提交的数据,也称脏数据。
2)不可重复读:在A事务中对同一数据两次查询不一致,可能缘由是在A事务提交以前B事务对该数据进行了操做
3)幻读:相似于不可重复读,都是在一个事务周期内读的数据不一致,区别在于幻读是侧重于插入操做带来的影响,而不可重复读是编辑或者删除带来的影响
在一个事务中,能够读取到其余事务未提交的数据变化,这种读取其余会话还没提交的事务,叫作脏读现象,在生产环境中切勿使用。
在一个事务中,能够读取到其余事务已经提交的数据变化,这种读取也就叫作不可重复读,由于两次一样的查询可能会获得不同的结果。
MySQL默认隔离级别,在一个事务中,直到事务结束前,均可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,可是它仍是没法解决幻读问题。
这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来讲,它会在读取的每一行数据上都加锁,因此可能会致使大量的超时和锁争用问题。
十二、了解的加密算法
常见的加密算法可分为三大类:对称加密,非对称加密和hash算法。
对称加密:使用同一个密钥来加密和解密数据。DES,AES。
非对称加密:使用RSA通常须要产生公钥和私钥,当采用公钥加密时,使用私钥解密;采用私钥加密时,使用公钥解密。RSA加密是对明文的E次方后除以N后求余数的过程。
hash算法:MD5。
1三、OOM怎么解决
1)java.lang.StackOverflowError
栈空间溢出 ,递归调用卡死
2)java.lang.OutOfMemoryError:Java heap space
堆内存溢出 , 对象过大
3)java.lang.OutOfMemoryError:GC overhead limit exceeded
GC回收时间过长
过长的定义是超过98%的时间用来作GC而且回收了而不倒2%的堆内存
连续屡次GC,都回收了不到2%的极端状况下才会抛出
若是不抛出,那就是GC清理的一点内存很快会被再次填满,迫使GC再次执行,这样就恶性循环,
cpu使用率一直是100%,二GC却没有任何成果。
4)java.lang.OutOfMemoryError:Direct buffer memory
5)java.lang.OutOfMemoryError:unable to create new native thread
1四、Java、Go、C++的优缺点
1五、判断链表是否对称
扫描链表的全部节点并一一进栈,而后再扫描链表,和栈顶元素做比较,若是都相同,返回true,不然返回false
1六、20亿个数求中位数
可参考:https://www.zhihu.com/tardis/...
1,描述二叉树,二叉树的应用
2,队列,栈。在你项目中的应用
3,除了redis的五种基本数据类型,还用到了哪些数据结构。
4,秒杀项目,怎么解决超卖问题
5,悲观锁、乐观锁的实现
6,数据库行锁的原理,mysql怎么实现的
7,悲观锁、乐观锁的优缺点
8,聚簇索引
9,数据库的垂直切分
10,为何用redis,redis数据丢失了怎么办?
11,ngnix说一下
12,负载均衡说一下?加权轮训的权值表明什么?服务器的并发能力有哪些影响因素?
13,系统怎么部署的?
14,怎么提升系统的并发能力?
15,linux的基本命令,怎么查看日志的
16,SpringBoot带来的好处
17,Spring IOC的原理,Spring怎么管理bean的?
1,怎么提高系统的并发能力(从索引优化、读写分离、分库分表说到redis主从集群、分布式锁、mq解耦异步削峰、ngnix、限流)面试官补充说还要考虑网路传输、前端优化等等。
2,分库分表是什么?为何须要分库分表?
3,什么是读扩散,写扩散?
4,说java里面3个坏的写法和三个好的写法
5,线程池有什么好处,节约的时间主要来自哪?
6,内存泄漏
7,本身遇到过最困难的事情,差点要放弃
8,投递过哪些公司?(网易、小米。)对这俩公司的见解?若是阿里加班严重你会咋办?对加班的见解。
9,毕设作的怎么样了?
10,你笔试成绩不是很好,本身有哪些优点?
一、编程题,给一个字符串“ Abcd, 0。0dc ba“判断是不是回文子串(空格、逗号、句号能够忽略不算)。
二、介绍一下https经过什么加密,https经过什么验证请求方不是假的。
三、从OSI模型考虑,说一下输入www.taobao.com 会发生什么
四、介绍一下Java怎么进行内存管理的(jvm内存区域,gc算法,minor full gc执行的时机,垃圾回收器)
五、动态代理的原理,应用场景
六、线程和进程的区别
七、编程题,给定一个字符串S1,每次只能把一个字符移动到最后一位,问最少移动多少次能变成S2。口头描述思路。
介绍项目、作的最厉害的事、最委屈的事、遇到的挫折、大学的学习和生活、研究生的学习和生活、家庭状况。
主要是看是否乐观、皮实。
原文连接:
https://www.nowcoder.com/disc...
文源网络,仅供学习之用,若有侵权,联系删除。我将优质的技术文章和经验总结都聚集在了个人公众号【Java圈子】里。
为方便你们学习,我还整理了一套学习资料,涵盖Java虚拟机、spring框架、Java线程、数据结构、设计模式等等,免费提供给热爱Java的同窗~