1. 基本数据类型和引用数据类型的区别
- 存储位置:基本数据类型的值直接存储在变量中;引用数据类型的变量存储的是对象的引用,对象本身存储在堆内存中。
- 变量内容:基本数据类型变量包含值本身;引用数据类型变量包含对象的地址。
- 传递方式:基本数据类型传递的是值的副本;引用数据类型传递的是引用的副本。
2. Java中的异常处理机制有哪些
try-catch:
- try 块:包含可能会抛出异常的代码段。
- catch 块:用于捕获并处理 try 块中抛出的异常。
throw 和 throws:
- throw:用于手动抛出异常对象。通常在方法内部使用,将异常传递给调用者处理。
- throws:用于在方法声明中指定可能抛出的异常类型。如果一个方法可能抛出某些类型的异常,但是该方法本身不处理这些异常,可以使用throws关键字将异常传播给调用者处理。
3. String str = new String("str"); 这个语句会创建几个对象
1个或2个,如果常量池中存在"str"只会在堆中创建一个,如果常量池中不存在则会先在常量池中创建一个"str"对象,再在堆中创建一个"str"对象
4. 线程的生命周期
- New(新建状态):线程杠被创建还没有开始运行,调用start()前
- Runable(就绪状态):线程正在运行或者准备好了去运行,调用start()后
- Blocked(阻塞状态):锁竞争导致的阻塞
- Waiting(等待状态):线程等待某个条件完成,例如输入,调用不带时间参数的join(),wait()
- Time_Waiting(定时等待状态):线程等待某个条件完成,但是超过设定时间就不等了,调用带时间参数的join(),wait()
- Terminated(终止状态):线程执行完其 run() 方法或者因异常而提前结束时进入终止状态
5. Java gc过程
- 标记阶段:通过可达性分析算法标记每个能到达的对象为活动对象
- 清除阶段:GC遍历整个堆内存把未标记的对象空间标记为可用也就是释放内存
- 压缩阶段:移动活动对象减少内存碎片
6. Java中的引用分为哪几种?有什么用途
- 强引用:最常见的引用类型,如果一个对象具有强引用,即使堆内存空间不足,jvm也不会回收这个对象
- 软引用:如果一个对象只有软引用,当堆内存空间不足时,jvm会回收这个对象,可以用于存一些当前用不到但可能会用到的缓存数据,例如非本界面的图片。
- 弱引用:如果一个对象只有弱引用,那么只要GC扫描到这个对象就会回收它,用于只希望在对象有强引用时才有效的场景,例如ThreadLocal
- 虚引用:如果一个对象有虚引用,这个对象被回收时会被加入一个队列中做特殊处理,例如NIO中的DirectByteBuffer管理
7. 什么是ThreadLocal?是如何实现的?
ThreadLocal可以理解为一个容器,其中可以存放对象,一个线程只能访问到自身存入其中的对象。
在Thread类中有一个属性为ThreadLocalMap,一个线程往ThreadLocal中存对象时,实际上是存入了自己的ThreadLocalMap中,ThreadLocal对象为Key,存入的对象为Value,所以每个线程只能访问自己存入ThreadLocal中的对象。
8. 直接把ThreadLocal引用置为空会引起什么问题?为什么?正确做法是什么?
ThreadLocalMap中的Key对ThreadLocal的引用是一个弱引用,当把ThreadLocal直接置为null时,ThreadLocal 对象只剩Key的虚引用,所以Key也会被置为null,此时的Value引用的对象就无法通过get()方法访问到了,所以会引起内存泄漏,正确的做法是先调用remove方法清除存在ThreadLocal中的对象再把ThreadLocal引用置为null