JavaSE--面试专题

1.通过字面量创建字符串和new一个字符串对象有什么区别?那什么是常量池呢?

内存的分配方式不一样,通过字面量创建的字符串对象会分配到常量池中,通过new一个字符串对象会分配到堆中。常量池我的理解是,它存在于方法区(元空间中),使用字面量创建的字符串会直接缓存到常量池中,若再次使用该字面量创建新字符串时,不再创建新对象,而是从常量池中获取。 

2.做字符串拼接的时候可以用String吗?StringBuilder和StringBuffer有什么区别呢?

不建议直接用String做拼接,最好使用StringBuilder或者StringBuffer来做拼接。StringBuilder是非线程安全的,效率更高。StringBuffer是线程安全的,效率低一些,但安全。 

3.子类重写父类含有抛出异常的方法时,有哪些要求?

不再抛出任何异常;

仅抛出部分异常;

抛出子类异常;

不可以抛出额外异常;

不可以抛出父类异常;

4.final、finally、finalize有什么区别?

final用于修饰类、变量、方法,修饰类表示该类不可被继承,修饰方法表示该方法不可被重写,修饰变量表示变量不可被重新赋值。

finally一般作用在try-catch捕获异常代码块中,不论代码是否发生异常,finally中的代码一定会被执行,通常用来关闭一些资源时使用。

finalize属于Object类中的一个方法,当对象被回收的时候,会调用此方法。

5.List集合和Set集合有什么区别?

List集合是可重复集,而且有序。Set集合是不可重读集,而且无序。 

6.集合中的泛型有什么用?

集合中的泛型是用来约束元素的类型的。 

7.常用的List集合有哪些呢?有什么区别? 

常用的List集合有ArrayList、LinkedList、Vector。ArrayList底层是数组,它的查询速度快,增删速度慢;LinkedList底层是链表,它查询速度慢,增删速度快。ArrayList和LinkedList都是非线程安全的,Vector底层是数组,是线程安全的。 

8.什么是队列?什么是栈?它们遵循什么原则?

队列是用于存储一组元素的数据结构,但是存取元素必须遵循先进先出原则。

栈也是用于存储一组元素,存取必须遵循先进后出原则。

9.HashMap的底层数据结构是什么?那什么时候变为红黑树呢?

在JDK1.7的时候是数组+链表;在JDK1.8的时候是数组+链表+红黑树;当链表的长度大于8的时候,就会变为红黑树。

10.HashMap、HashTable、ConcurrentHashMap有什么区别? 

HashMap是线程不安全的;HashTable是线程安全的,其内部使用synchronized关键字进行加锁;ConcurrentHashMap结合了HashMap和HashTable,是线程安全的,在JDK1.7其内部使用了分段锁的思想来进行加锁,每一把锁只锁容器中的一部分数据,降低了锁的力度,提高了效率。在JDK1.8的时候使用了CAS+synchronized来保证并发安全

11.什么是CAS算法? 

CAS算法的全称是:compareAndSwap的意思,是能保证当操作的线程安全和原子性的算法。CAS算法将预期值和更新值传入方法中进行比较,如果内存值和预期值不同,那么此次操作失败,继续循环获取新的内存值,预期值,更新值,直到这次操作成功,我们称这种操作为线程的自旋,其中的算法我们称为CAS算法。

12.HashMap的初始长度是多少?在什么时候进行扩容?

HashMap的初始长度是16。当容量达到加载因子0.75的时候进行扩容,扩容后的大小一定是2的N次方。

13.我们能否使用任何类作为HashMap的key?

可以,但需要注意的是,如果类重写了equals方法,我们就应当连同重写hashcode方法;因为hashcode的值应当与equals的结果相对应,两个对象若equals比较为true,hashcode值应当相同。两个对象equals比较结果为false,hashcode值最好不同。若依然相同,那么作为key存入HashMap中时会产生链表情况,影响HashMap查询性能。 

14.你能说说sleep、wait、notify的作用吗? 

sleep用于线程的休眠,可以指定休眠的时长,如果在一个同步块中,sleep不会释放锁。

wait是Object提供的一个方法,可以对象来进行线程的休眠,如果在一个同步块中,wait会释放锁。

notify也是Object提供的一个方法,可以唤醒处于wait状态的线程,如果在一个同步块中,wait不会释放锁。

15.你有用过java中的线程池吗?Java中的线程池有哪些?那你最常用的线程池是哪种?

有用过,java中的线程池有4种:

动态的线程池:newCachedThreadPool

固定线程数的线程池:newFixedThreadPool

固定只有一条线程的线程池:newSingleThreadExecutorPool

以固定频率执行的线程池:newScheduledThreadPool

一般来说,这4种线程池都不使用,一般使用ThreadPoolExecutor来自定义线程池。

16.你能介绍一下ThreadPoolExcutor各参数的含义吗?你觉得核心线程数设置多大比较合理?

corePoolSize:核心线程数,指线程池不关闭就一直存活的线程数。maximumPoolSize:最大线程数,指线程池能同时存活的最大线程数。
keepAliveTime:空闲的线程保留的时间,指非核心线程空闲的最大时间,超过这个时间就会将这些空闲的非核心线程销毁掉。
unit:空闲线程的保留时间单位。
workQueue:工作的阻塞队列,存储等待执行的任务。
threadFactory:线程工厂,指定了线程池中的线程的创建方式和销毁方式。
handler:拒绝策略,指线程池在达到上限(达到最大线程数且任务队列也满了)的情况下的执行逻辑。

最大核心线程数设置为:CPU的核心数 * 2 +1 最为合适

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值