java面试题集(收录)

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

猜你喜欢

转载自blog.csdn.net/u011269762/article/details/84975002