面经汇总

阿里
https://zhuanlan.zhihu.com/p/33273041
https://www.itcodemonkey.com/article/2356.html
http://shanghai.ujiuye.com/msjq/1719.html
http://www.cnblogs.com/binyue/p/4015884.html

https://zhuanlan.zhihu.com/p/33273041

https://blog.csdn.net/zuoxiaolong8810/article/details/51482550

算法

八种排序算法

https://blog.csdn.net/kris1025/article/details/80042488

参考:Java后端开发面试汇总
https://www.jianshu.com/p/f29f52726c87

阿里面试

https://zhuanlan.zhihu.com/p/33273041
1、问题:如果A和B对象循环引用,是否可以被GC?

回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GC Roots没有任何引用链连接,则证明对象是不可用的。

2、Java中的内存溢出是如何造成的?

OutOfMemoryError:

(1)PerGern Space 程序中使用了大量jar或class,使Java虚拟机装载类空间不够。

解决方案:调参XX:PermSize 和 XX:MaxPermSize 、减少jar包,减少类的重复加载

(2)Java Heap Space Java虚拟机创建了太多的对象。

解决方案:调参Xms(初始堆大小)Xmx(最大堆大小)、检查死循环或不必要创建的重复对象

(3)unable to create new native Thread JVM占用了太多内存空间,而在JVM中创建线程还要再操作系统中也创建线程。

解决方案:调整JVM中线程大小。
3、String s = “123”;这个语句有几个对象产生?

若字符串池中没有"123",则产生一个对象,并且放入常量池中,若有"123",则产生0个对象。

若是String s = new String(“123”),若常量池中没有,则在常量池中创建一个,然后在堆内存中创建一个。
4、Error、Exception和RuntimeException的区别,作用又是什么?

Error和Exception都是Throwable的子类,RuntimeException是Exception的子类。

Error用于指示合理应用程序不应该试图捕获的错误。

Exception指出合理的应用程序需要捕获的条件。分为已检查异常和未检查异常。

RuntimeException是未检查异常,不需要try catch或在方法上声明,主要子类:NullPointer、Arithmatic、ArrayIndexOutOfBounds、ClassCast。
5、Reader和InputStream区别?

都是抽象类,Reader用于读取字符流(char或String),InputStream用于读取字节流(byte数组)。

6、hashCode的作用?

hashCode主要是用于快速查找,如HashMap结构中,用于定位键值对的位置。两个对象相同,则hashCode一定相同,而hashCode相同的对象则不一定相同,就相当于放在同一个框里。

7、HashMap和Hashtable的区别?

线程安全性、null值的key、效率、HashMap(Iterator快速失败迭代器)、Hashtable(enumerator迭代器)、时间推移HashMap元素位置会变

8、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?

可以、但是要key对象必须是不可变的对象,不然在Entry被插入Map中后,再改变key值,会导致当前key值与hash值不符合,即与数组索引不符,将无法被查找到。

9、 启动一个线程是用run()还是start()?

多线程有几种实现 同步和并发是如何解决的 什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程? 解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

(1)start

(2)继承Thread类、实现Runnable接口、使用ExectuorService、Future、Callable实现由返回值的线程。

(3)同步方法、同步代码块、锁

(4)Damon线程、为其他线程的运行提供服务,如GC,Thread。setDeamon(true)。

(5)Thread.stop()不推荐(不会正确释放资源)、使用中断来停止线程。

(6)当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。

(7)车票被重复卖出。

(8)同步关键词。修饰静态方法,则以类作为锁对象,同时只能有一个线程访问此类同步的静态方法;修饰普通方法,则以此对象作为锁对象,同时只能有一个线程访问此类同步的普通方法;也可以自定义锁对象同步代码块。

(9)synchronized方法不可以进入,非synchronized可以进入。

10、了解过哪些JDK8的新特性,举例描述下相应的特性?

(1)lambda表达式:函数式编程,方法引用

(2)Stream API

(3)接口的默认方法

(4)日期时间API的改进,新增DateTimeFormatter方法
11、对sql进行优化的原则有哪些?

详情见我数据库分类的的一篇博客

12、Servlet的生命周期,Serlvet与CGI的区别?

生命周期:类加载、实例化(构造对象),初始化(init),服务(service),销毁(destroy)。

CGI:common gateway interface,通用网关接口,Perl语言编写,每个请求创建一个CGI对象。

Servlet:只需要实例化、初始化一次,多线程。

13、StringBuffer有什么优势?为什么快?
因为StringBuffer不需要重复创建String对象,但是其实也不是这样。

比如String s = “a” + “b” + "c"操作编译器会优化,变成String s = “abc”

String s = s1 + s2 + s3编译器也会优化,变成StringBuilder的append操作,但是如果不是一次性+操作拼接完,就会反复生成String对象与StringBuilder对象,效率会很低。
14、加密解密算法了解吗?
摘要算法:MD5(128位)、SHA1(160位),是一种不可逆的过程,无论多大的数据,经过摘要算法后都生成相同长度的数据。只能通过字典进行破解。

对称加密算法:DES、AES,加密解密时使用相同的秘钥。

非对称加密算法:RSA,加密解密时使用不同的秘钥,对接支付宝使用RSA2。
15、解决高并发与高负载?

(1)静态页面消耗最小,尽可能的HTML静态化,采用信息发布系统CMS实现信息录入自动生成静态页面、在前端缓存不经常改变的动态数据。

(2)CDN,把CSS/JS等资源分布在不同的服务器上。

(3)负载均衡(Nginx)。

(4)缓存不常改变的数据(Redis、memcache)。

(5)图片服务器与应用服务器分离。

(6)集群。

16、Integer内部缓存?

Integer类内部有一个staitic 的Integer数组,存储的是一些已经完成初始化的Integer对象,一般值为(-128~127),若用==比较,则有时候会因为值不在缓存中而返回false,所以应该用equals比较。
17、ArrayList的原理?

(1)ArrayList是线程不安全的,若要线程安全,则使用CopyOnWriteList。

(2)底层是Object[]数组,内部有一个elementData引用指向数组,刚开始默认指向一个缓存空数组(transient),当要进行扩容时,会重新new一个大小为1.5倍(x + (x >>1))的新数组,然后将旧元素通过System.arraycopy这个native方法拷贝到新数组中。

(3)随机读写(get、set)方法的算法复杂度为O(1)。

(4)增加操作分为两种,add(index, value)的算法复杂度为O(n),因为要通过元素复制进行移动;而add(value)操作的算法复杂度为O(1)(若不发生扩容)。

(5)删除操作的时间复杂度为O(n),因为不管是按index进行删除还是按照object去删除,都需要通过复制去实现移动操作,删除后数组大小不会变,靠size属性来维护长度。按object进行删除时不能用new出来的对象,要通过ArrayList内对象的引用删除。

18、LinkedList的原理?

(1)底层是一个双向链表,维护着一个first指针和一个last指针。

(2)随机读写(get,set)的时间复杂度为O(n)。

(3)插入操作add(object)的时间复杂度为O(1);add(index, object)的时间复杂度为O(n)。

(4)删除操作remove(object)的时间复杂度为O(1);remove(index)的时间复杂度为O(n)。
19、线程池使用的注意事项?

(1)防止死锁。线程池中所有线程都在等待A事件发生,而没有空闲线程去执行A。

(2)防止系统资源不足。要控制线程数量。

(3)防止并发错误。

(4)防止线程泄漏,某个线程因RuntimeException或Error没有正常被捕获导致该线程异常终止,线程池失去了一个线程。

(5)避免任务过载。
20、Spring中@Autowire与@Resource的区别?

@Autowire默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可以结合@Qualifier注解一起使用;
@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象
21、线程状态转移图。
这里写图片描述

22、Object类的方法?
(1)equals:判断是否相等。

(2)hashCode:求hash值,若两个对象hash值相等,不一定equals;若equals,则两个对象hash值一定相等。

(3)toString:获得对象的字符串表达形式,一般要重写。

(4)getClass:反射方法,获得对象所属的类。

(5)wait:只能在synchronized同步的代码段中使用,若不带时间参数,则使得正在执行的线程放弃锁进入等待状态(等待池)。

(6)notify:只能在synchronized同步的代码段中使用,从等待池中取出一个线程放入锁标志池。

(7)notifyAll:只能在synchronized同步的代码段中使用,将等待池中取出所有线程放入锁标志池。
23、Java序列化的底层原理?
将对象信息转化为字节码信息。

(1)存储序列化的描述。(2)当前类描述信息。(3)当前类属性描述。(4)超类描述(5)超类属性描述(6)超类属性值描述(7)子类属性值描述

other
1谈谈你对HashMap的理解,底层原理的基本实现,HashMap怎么解决碰撞问题的?
2开发中用了那些数据库?回答mysql,储存引擎有哪些?

关系型数据库 mysql
非关系型数据库 nosql redis

那么什么是存储引擎呢?

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

MySql中有哪些存储引擎?
1 MyISAM:这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:
静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。
动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。
压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。
但是,不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。
2 MyISAM Merge引擎:这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。
3 InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
4 memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
5 archive:这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。
当然MySql支持的表类型不止上面几种。

3 然后问了我悲观锁和乐观锁问题使用场景、分布式集群实现的原理。

4 springmvc和mybatis的工作原理,有没有看过底层源码?
SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、 Controller执行完成返回ModelAndView。

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、 ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

熟悉IO么?与NIO的区别,阻塞与非阻塞的区别
微信红包怎么实现。
海量数据分析。
线程安全和非线程安全。
HTTP2.0、thrift。
java反射应用
分布式事务一致性。
nio的底层实现。
jvm基础是必问的,jvm GC原理,JVM怎么回收内存。
API接口与SDI接口的区别
dubbo如何一条链接并发多个调用。Dubbo的原理,序列化相关问题。
用过哪些中间件。
做过工作流引擎没有。
以前的工作经历,自己觉得出彩的地方
线程池的一些原理,锁的机制升降级
从系统层面考虑,分布式从哪些纬度考虑
Hadoop底层怎么实现
threadLocal,线程池,hashMap/hashTable/coccurentHashMap等
秒杀系统的设计
虚拟机,IO相关知识点
Linux的命令
一个整形数组,给定一个数,在数组中找出两个数的和等于这个数,并打印出来,我写的时间复杂度高,要求O(n)。
n个整数,找出连续的m个数加和是最大。
更重视开源技术
数据库锁隐原理
1000个线程同时运行,怎么防止不卡
并列的并发消费问题)
高并发量大的话怎么处理热点,数据等
如何获取一个本地服务器上可用的端口
流量控制相关问题
数据库TPS是多少,是否进行测试过
缓存击穿有哪些方案解决
Java怎么挖取回收器相关原理
Java的集合都有哪些,都有什么特点
分布式锁,redis缓存,spring aop,系统架构图,MySQL的特性
场景,同时给10万个人发工资,怎么样设计并发方案,能确保在1分钟内全部发完 打个比方会提出类似的场景

Jdk源码

https://blog.csdn.net/u010412719/article/category/6159934/3

调优JVM

如何调优JVM - 优化Java虚拟机(大全+实例)
http://www.cnblogs.com/jack204/archive/2012/07/02/2572934.html

Java 并发问题汇总 – concurrent 并法包

https://cloud.tencent.com/developer/article/1064496

Java 锁机制研究

https://blog.csdn.net/kris1025/article/details/80010539

Spring

Spring的理解
是一个开源框架
让java开发模块化,并且全面。贯穿逻辑层,表现层,持久层。让每一个功能模块都可以独立分开,降低耦合,提高代码复用率!
spring通过控制反转降低耦合性,一个对象的依赖通过被动注入的方式而非主动new
还包括面向切面, mvc的整合等等

spring最初诞生的时候是依赖注入,控制反转和非侵入式。这三点讲清楚就很好了。后续的发展如果讲的出来,就是你对开源社区的关注度。spring cloud,spring boot等都是1可以聊一聊的。确切的说,在没有spring的时候大家怎么写代码?spring是为了解决什么问题呢。

https://www.zhihu.com/question/48427693/answer/291959419

数据库

  • 数据库分库分表
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值