问题一:Java中的String为什么是不可变的?
很多面试者会简单地回答因为String类被final修饰,但这只是表象。String的不可变性主要体现在三个方面:
String类被final修饰,防止被继承
内部char数组被private final修饰,且没有提供修改方法

所有修改String的方法都返回新的String对象
这种设计带来的好处是:
线程安全
字符串常量池的实现

缓存hash值,提高性能
安全性考虑
问题二:HashMap和HashTable的区别?
很多人会回答HashTable是线程安全的,HashMap不是,这太片面了。实际上两者的区别远不止于此:
HashTable不允许null键和null值,HashMap允许
HashTable继承自Dictionary类,HashMap继承自AbstractMap
HashTable的默认初始容量是11,HashMap是16
HashTable扩容时是2n+1,HashMap是2n
HashTable直接使用对象的hashCode,HashMap会重新计算hash值
问题三:Java中的四种引用类型
很多面试者只知道强引用,对其他三种引用类型了解甚少:
强引用:最常见的引用类型,只要强引用存在,对象就不会被回收
软引用:内存不足时会被回收,适合做缓存
弱引用:只要发生GC就会被回收,适合做缓存
虚引用:最弱的引用,主要用于跟踪对象被垃圾回收的状态
问题四:Java中的异常体系
很多人对异常的理解停留在try-catch层面,实际上Java的异常体系非常完善:
Error:系统级错误,程序无法处理
Exception:程序可以处理的异常
RuntimeException:运行时异常,可以不处理
其他Exception:必须处理
问题五:Java中的集合框架
很多人对集合框架的理解停留在使用层面,实际上需要了解:
Collection接口:所有集合类的根接口
List:有序可重复
Set:无序不可重复
Queue:队列
Map接口:键值对集合
HashMap:最常用的实现
TreeMap:有序的实现
LinkedHashMap:保持插入顺序
问题六:Java中的多线程
很多人对多线程的理解停留在Thread和Runnable层面,实际上需要了解:
线程状态:新建、就绪、运行、阻塞、死亡
线程同步:synchronized、volatile、Lock
线程通信:wait/notify、Condition
线程池:ThreadPoolExecutor
问题七:Java中的IO流
很多人对IO流的理解停留在FileInputStream层面,实际上需要了解:
按流向分:输入流、输出流
按操作对象分:字节流、字符流
按功能分:节点流、处理流
NIO:非阻塞IO,提高性能
问题八:Java中的反射机制
很多人对反射的理解停留在Class.forName层面,实际上需要了解:
获取Class对象的方式
获取构造方法、字段、方法
动态创建对象、调用方法
反射的性能问题
问题九:Java中的泛型
很多人对泛型的理解停留在List层面,实际上需要了解:
泛型擦除
通配符:?、? extends T、? super T
泛型方法
泛型接口
问题十:Java中的注解
很多人对注解的理解停留在@Override层面,实际上需要了解:
元注解:@Target、@Retention等
自定义注解
注解处理器
注解的应用场景
暂无评论内容