Java基础(2)------常量池

常量池分类

  • 静态常量池:即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。这种常量池主要用于存放两大类常量:字面量(例如定义为final的变量,文本字符等等)符号引用量,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
  1. 类和接口的全限定名
  2. 字段名称和描述符
  3. 方法名称和描述符
  • 运行时常量池: 运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。

String 常量池举例

  1. 直接使用双引号声明出来的 String 对象会直接存储在常量池中。

  1. 使用new关键字创建String的对象不会存储在常量池中.

  1. 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。

与intern有关的比较例子:

注意点:

  • == 比较的是内存地址 , equals比较的是值
  • 字符串拼接的时候:变量+变量 和 直接用字符串+字符串拼接是不一样的,前一种会创建个新的对象。
  1. 我们在使用字符串的时候应尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。

其他常量池

  • Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte、Short、Integer、Long、Character、Boolean;这5种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。

  • 两种浮点数类型的包装类 Float、Double 并没有实现常量池技术。

使用常量池的好处

避免了频繁的创建和销毁对象影响系统的性能,实现了对象的共享,同时也可以节省存储空间,相同的对象占用同一个内存。

猜你喜欢

转载自juejin.im/post/5cfdf93e6fb9a07ee85c1e6f