Java的部分八股(随便记着玩)

发布时间 2023-08-29 09:57:09作者: ANewPro

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等原子性类