Java的部分八股
1.Hashmap和Hashtable的区别
1.安全性
hashtable是线程安全的,hashmap是非线程安全的
但是hashmap的性能高于hashtable
多线程下使用hashmap需要使用一个线程安全的集合
2.容量部分
Hashmap的初始容量为16,hashtable的初始容量为11,填充因子默认都是0.75
Hashmap扩容是当前容量翻倍,hashtable是容量翻倍+1
hashmap允许用null做key,hashtable不允许
hashmap在链表长度大于阈值时,默认为8,hashmap会将链表转化为红黑树
2.重载和重写的区别
重载是指在同一个类中可以定义多个同名方法,比如函数重载之类的
重写(override)是指在子类中重新定义父类已经存在的方法,保持方法名、参数列表和返回值类型相同。目的是实现多态性
重写的访问修饰符可以扩大,子类中的方法不能缩小父类中方法的可见性
重写方法不能抛出比重写方法更宽泛的异常
3.Stringbuffer,Stringbuilder和String的区别
String是不可变的类,一旦创建就不能被修改,每次对String的操作都会生成一个新的String对象
StringBuffer是可变的类,修改字符串的内容时不会生成新的对象,适用于多线程环境,它可以保证线程安全,但是因为同步机制,所以性能相对较低
StringBuilder是可变的类,与StringBuffer相似,不是线程安全的,更适用于单线程环境
4.Exception和Error有什么区别
Exception是程序本身可以处理的异常,可以通过catch来进行捕获,Exception又可以分为Checked Exception(受检查异常,必须处理)和Unchecked Exception(不受检查异常,可以不处理)
Error是属于程序无法处理的错误,不建议用catch进行捕获
例如java虚拟机运行错误等
5.Synchronized和Lock的区别
1.synchonized是关键字,Lock是接口,synchonized是在JVM层实现,Lock是JDK中JUC包下的实现
2.synchonized是隐式加锁,lock是显式加锁
3.synchonized可以作用于方法上,lock只能作用于方法块
4.synchonized是阻塞式加锁,lock是非阻塞式加锁以及支持可中断式加锁,支持超时时间的加锁
5.synchonized在发生异常时,会自动释放锁,确保不会造成死锁。Lock需要在finally中手动释放锁,确保在异常情况下锁一定会被释放
6.什么是阻塞式加锁以及非阻塞式加锁
1.阻塞式加锁
当一个线程尝试获取锁但锁已经被其他线程占用,该线程会被阻塞,直到它成功获取锁为止
2.非阻塞式加锁
如果锁已经被其他线程占用,它不会被阻塞,而是立即返回,通常会返回一个表示获取锁失败的状态。这种方式下,线程会继续执行其他操作,而不会等待锁变为可用。并且需要编写一些重试逻辑。
7.Java中的一些线程安全的类
线程安全的类大部分都在java.util.concurrent包中,比如
- ConcurrentHashmap等concurrent开头的类
- AtomicInteger等原子性类