问题链接::http://www.jsondream.com/2016/12/04/java-interview-question.html
1.Arrays.sort实现原理和Collection实现原理
Collection.sort()底层会调用Arrays.sort(),Arrays.sort()底层实现是TimeSort,TimeSort的算法就是先找到已经排好序数据的子序列,然后对剩余部分数据进行排序,然后在合并起来。
2.foreach和while的区别(编译之后)
while会读一行输入,把它存入某个变量并执行循环体,然后再找其他行的输入,适用于不确定循环次数的情况;foreach是增强for循环,它是逐条读取,在循环开始前会将所有输入全部读入,适用于数组、集合等确定长度的情况;当输入内容非常大的时候foreach会非常占内存。
3.线程池的种类,区别和使用场景
a.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
b.newFixedThreadPool创建一个定长线程池,可控制线程的最大并发数,超出的线程会进入阻塞队列中等待。
c.newScheduledTreadPool创建一个定长线程池,支持定时或者周期性任务执行。
d.newSingleThreadPool创建一个单线程化的线程池,它只会用唯一的线程来执行任务,保证所有任务按照指定顺序执行。
4.线程的调度过程
a.当线程池小于corePoolSize时,新提交的任务会创建一个新的线程执行,技术此线程池中有空闲线程;
b.当线程池达到corePoolSize时,新提交的任务将被放入workQueue,等待线程池中任务调度执行;
c.当workQueue已满,并且maximunPoolSize > corePoolSize时,新提交的任务会创建新的线程执行;
d.当提交的任务数超过maximunPoolSize时,新提交的任务将被拒绝;
e.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程;
f.当线程池中设置allowCoreThreadTimeOut=true时,线程池中corePoolSize线程超过keepAliveTime时也将被关闭;
5.线程池如何调优
个人觉得比较ok:https://www.cnblogs.com/jianzh5/p/6437315.html
6.线程池的最大线程数目根据什么确定
int maxthread = Runtime.getRuntime().availableProcessors() * 25;//最大线程数=cpu个数*25,超过这个值系统运行会不稳定(仅限于服务器,自己的电脑不能达到这个数)。
Runtime.getRuntime().totalMemory();// Java 虚拟机中的内存总量
Runtime.getRuntime().freeMemory()//Java 虚拟机预留内存
Runtime.getRuntime().maxMemory()//Java 虚拟机试图使用的最大内存量
计算线程可有使用的内存 理论上:最大内存量- 虚拟机预留内存,实际上:虚拟机中的内存总量-虚拟机预留内存。
7.动态代理的几种方式
jdk动态代理和cglib动态代理。jdk动态代理是有java内部的反射机制实现的,前提是代理类和目标类必须实现统一的接口;cglib动态代理是借助asm来实现的。
8.HashMap的并发问题
HashMap是线程不安全的,当size超过一定大小需要扩容时,会重新计算hashcode值,在多线程的情况下可能会产生死循环。可以使用HashTable和ConcurrentHashMap。
9.了解LinkedHashMap的应用吗
10.反射的原理,反射创建类实例的三种方式是什么?
java反射机制实在运行当中,对任意一个类来说,能够知道它的所有属性和方法,都能调用它的任意一个属性和方法。
三种方式:getClass()方式,调用类的静态属性class,Class.forName()。
11.cloneable接口实现原理,浅拷贝or深拷贝
https://www.cnblogs.com/tonyluis/p/5778266.html
12.Java NIO使用
https://blog.csdn.net/qq_18860653/article/details/53406723
13.hashtable和hashmap的区别及实现原理,hashmap会问到数组索引,hash碰撞怎么解决
1.
https://blog.csdn.net/double2hao/article/details/53411594
2.hashmap会问到数组索引,hash碰撞怎么解决
1.开放地址法
开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。
如果di取值可能为伪随机数列。称伪随机探测再散列。
2.再哈希法
当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止
3.链地址法(拉链法)
将所有关键字为同义词的记录存储在同一线性链表中。
4.建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。
14.arraylist和linkedlist区别及实现原理
arraylist是基于动态数组的数据结构,而linkedlist是基于链表的数据结构;对于查询来说arraylist优于linkedlist,而对于删除和新增则linkedlist更好些。
15.反射中,Class.forName和ClassLoader区别
java类加载的过程包括:加载->验证->准备->解析->初始化->使用->卸载,而初始化就是激活java类中静态变量初始化代码和静态代码块,并初始化程序设置的变量值。