⭐包装类型常量池技术了解吗?

常量池也叫缓存池,主要存储一些常用的数据。基本类型除开double和float浮点数太大了,没有常量池,其他都实现了。当发生自动装箱的时候,如果基本类型的值在缓存的范围内,则不会重新创建对象,而是复用缓存池中已经创建好的对象。

不同的包装类缓存的范围不同,也可以通过jvm参数上调。

原理:

  • 装箱:调用的是XXX.valueOf()方法;在这个方法里面有缓存区间的代码。
  • 拆箱:调用的是XXX.intValue()方法。

⭐String、StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?

  • 可变性:String内部的value值是final修饰的,所以它是一个不可变的类。因此每次修改String的值的时候都会new一个新的对象。而StringBuffer和StringBuilder是可变的。
  • 线程安全性:
    • String由于它的不可变性,导致了它是一个线程安全的
    • StringBuffer也是线程安全的,因为它每个方法里面都使用了synchronized关键字
    • StringBuilder不是线程安全的。
  • 性能:StringBuilder>StringBuffer>String
  • 存储:
    • String存储在字符串常量池里面
    • StringBuffer和StringBuilder是存储在堆内存空间的。其次这两个类都有一个共同的父类。

字符串常量池,是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
具体要看JVM了。

java反射

  • 本质:是运行时动态操作类的能力
  • 实现:是直接读取操作编译之后的类.class文件,更多就是JVM了。
  • 隐患:对性能和安全是有影响的。

BIO、NIO、AIO有什么区别?

  • BIO:同步阻塞,传统的socket
  • NIO:异步阻塞,selector+channel
  • AIO:异步非阻塞,缓冲区+CompletionHandler,实用性不如NIO普及。