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.动态代理的几种方式
jdk动态代理和cglib动态代理。jdk动态代理是有java内部的反射机制实现的,前提是代理类和目标类必须实现统一的接口;cglib动态代理是借助asm来实现的。
6.HashMap的并发问题
HashMap是线程不安全的,当size超过一定大小需要扩容时,会重新计算hashcode值,在多线程的情况下可能会产生死循环。可以使用HashTable和ConcurrentHashMap。
7.HashTable和ConcurrentHashMap区别
当HashTable增加到一定数量时性能会急剧降低,因为迭代时会锁很长时间,而ConcurrentHashMap使用了分割,无论数量多大,都只需要锁map的某一个部分。
8.反射的原理,反射创建类实例的三种方式是什么
java反射机制实在运行当中,对任意一个类来说,能够知道它的所有属性和方法,都能调用它的任意一个属性和方法。
三种方式:getClass()方式,调用类的静态属性class,Class.forName()。
9.hashmap的理解
hashmap是链表+数组的存储结构,外层是一个链表,而每个链表中又是一个数组,存储时先通过key获取hashcode并计算出value存储的链表位置,如果不存在hash碰撞则value存在该链表中数组的第一个位置,如果发生hash碰撞则存在该链表的数组的最后一个位置。
10.arraylist和linkedlist区别及实现原理
arraylist是基于动态数组的数据结构,而linkedlist是基于链表的数据结构;对于查询来说arraylist优于linkedlist,而对于删除和新增则linkedlist更好些。
11.反射中,Class.forName和ClassLoader区别
java类加载的过程包括:加载->验证->准备->解析->初始化->使用->卸载,而初始化就是激活java类中静态变量初始化代码和静态代码块,并初始化程序设置的变量值。
Class.forName会执行类的初始化,而ClassLoader不会执行类的初始化。
来源:java面试题网http://www.wityx.com