JAVA面经复习(二十)

面试难度:<mark>☆☆☆☆☆</mark>
声明:答案均为网上搜索汇总得到的参考答案,如有不妥或意见相左之处欢迎指出!

问:线程池有几种类型

答: 1、CachedThreadPool,可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。该种线程池线程没有上限,但需要注意OOM的问题。
2、FixedThreadPool,指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
3、SingleThreadExecutor,创建一个单线程化的Executor,单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
4、ScheduleThreadPool,定长的线程池,支持定时及周期性任务执行。
5、SingleThreadScheduledExecutor,单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

问:线程的通信有几种方法

答:线程通信常见的两种方法包括:
1、采用wait()、notify()进行线程阻塞和唤醒。
2、采用Volatile变量进行线程变量共享。

问:介绍hashmap;

答:hashmap底层采用数组+链表/红黑树的结构,其允许key为null,通常用于存储键值对数据。

问:hashmap很多元素挂在一个链表上,哈希冲突比较严重,怎么去优化(数据比较集中,数组没有得到充分的利用)?

答:1、可以考虑修改哈希函数,从根本上减少哈希冲突的问题;2、可以考虑进行扩容,比较暴力。;3、修改解决冲突的方式,比如链地址法可以修改成线性探测法,从而充分利用数组空间。

问:如何触发新生代的gc?

答:当Eden区中没有足够空间进行分配时,将会触发一次Minor GC。

问:触发老年代的gc,如何触发?

答:1、老年代空间不足;(归根结底的原因。)
2、方法区空间不足
3、分配的对象太大,这种对象会直接进入老年代,老年代的剩余空间够,但是连续空间不够;
4、调用System.gc()方法
5、CMS垃圾收集器进行GC的时候会产生浮动垃圾,浮动垃圾就是进行GC过程中产生的垃圾,占用了空间,没有被GC,导致空间不足,JVM虚拟机进行Major GC。
6、java虚拟机中有分配担保机制,当新生代的复制空间存储不下存活对象时就会触发担保机制,会把剩下无法存储的对象直接存放进老年代,如果此时老年代空间也无法存储,就会担保失败,担保失败后JVM会进行Major GC。

问:怎么查看gc使用?

答:应该是考虑查看GC的使用日志:
-XX:+PrintGC   输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC   在进行GC的前后打印出堆的信息
-Xloggc:…/logs/gc.log 日志文件的输出路径

问:spring特性介绍?

答:spring比较关键的特性主要是IOC,控制反转以及AOP,面向切面编程
IOC控制反转,其主要手段是通过依赖倒转实现的,举个例子,Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。
AOP面向切面编程,则是一种新的编程思想,其通过将相同的业务代码抽象出来,集成到一起从而实现代码的复用。其底层的实现原理是动态代理

问: IOC实例化bean的顺序,是根据xml读取的顺序去实例化的吗?不考虑懒加载。如:a依赖b,b依赖c这时候先初始化谁,spring是怎么知道依赖关系的?

答:不是的,ApplicationContext内置一个BeanFactory对象,作为实际的Bean工厂,和Bean相关业务都交给BeanFactory去处理。在BeanFactory实例化所有非延迟加载的单例Bean时,遍历beanDefinitionNames 集合,按顺序实例化指定名称的Bean。
先初始化c,其采用递归解析的方式先去实现依赖类。其在解析的过程中,会去判断内部类是否可以被解析,如果可以就递归进行解析。

问:静态代理又是什么,和动态代理区别?spring为什么不用静态代理?

答:静态代理指的是针对被代理类A,其实现了某个接口C方法,紧接着代理类B通过获得对应的被代理类实例对象a,在B中调用了对象a的方法C,从而代替A类实现了新的方法。这种做法的好处是,我们可以在B中对类A的方法进行一些修改,同时还不会破坏原有的A结构,这就是AOP,面向切面编程的思想。动态代理唯一的不同就是,通过反射机制去获得实例对象a,从而进一步减少了代码的编写。

问:动态代理在什么时候进行替换被代理对象的?

答:题意不是特别明确,在JDK动态代理采用反射机制,获取被代理对象;在CGLib中底层用asm(字节码框架),可以用来动态修改class和创建class,即被代理对象。

问:http1.0,2.0区别?

答:http1.0链接无法重复使用,每次请求都需要建立一次连接。而HTTP2.0允许多路复用,即多个请求采用一个连接。同时http2.0支持服务端推送,即在用户发送信息前,推送对应的消息。同时HTTP2还具备二进制分帧的功能,在二进制分层上,HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 。HTTP2还对对消息头采用HPACK(专为http/2头部设计的压缩格式)进行压缩传输,能够节省消息头占用的网络的流量。

问:http,https区别,以及https怎么加密的?

答:http和https的区别主要在于https采用了SSL进行加密,SSL加密的方式主要是非对称加密,即一方持有公钥,一方持有私钥,数据采用公钥加密后,需要使用私钥进行解密。进一步的,为了验证信息确实没有被调包,引入了数据证书等概念。

问:springmvc的请求流程

答:

问:spring自带的视图解析器(渲染解析器)是什么?

答:SpringMVC定义了名为ViewResolver的接口,其中的resolveViewName()方法传入一个视图名和Locale对象时,它会返回一个View实例。
View是另外一个接口,主要是接受模型以及Servlet的request对象和response对象,并将输出渲染到response对象中。
我们可通过编写ViewReSolver接口和View接口的实现来自定义视图解析器,实际上Spring自带了13个视图,能够将逻辑视图名转换为物理实现,它们能够适应大多数场景。

问:拦截器在请求流程中怎么体现的?

答:在配置文件中如果只定义了一个拦截器,程序将首先执行拦截器类中的 preHandle 方法,如果该方法返回 true,程序将继续执行控制器中处理请求的方法,否则中断执行。如果 preHandle 方法返回 true,并且控制器中处理请求的方法执行后、返回视图前将执行 postHandle 方法,返回视图后才执行 afterCompletion 方法。

问:登录淘宝买东西,有天猫的商品,点开天猫时,已经帮你登录好了。但登录是在淘宝登录的,那天猫是怎么实现登录的 ?

答:单点登录,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。

参考资料:
阿里淘系、考拉Java面经
JAVA线程池有几种类型?
谈谈如何来查看GC日志
什么是依赖注入