今日总结10.16

发布于:2024-10-17 ⋅ 阅读:(9) ⋅ 点赞:(0)

字符串常量池的作用

字符串常量池(String Constant Pool)在Java中是一个特殊的内存区域,主要用于存储字符串字面量(即直接在代码中出现的字符串),其作用主要体现在以下几个方面:

1. 优化内存使用

减少内存占用:由于字符串是不可变的(immutable),因此相同的字符串字面量在内存中可以有多个副本。字符串常量池的设计允许在内存中只存储一份相同的字符串字面量,而所有引用该字符串字面量的变量都指向这份单一的内存地址。这样可以有效地节省内存空间。

全局共享:字符串常量池是全局共享的,这意味着在一个Java虚拟机(JVM)中,所有类共享同一个字符串常量池。因此,不同的对象或方法都可以引用同一个字符串对象,而不需要各自创建自己的副本,进一步减少了内存占用。

2. 提高程序性能

快速字符串比较:当比较两个字符串是否相等时,如果这两个字符串都是字符串常量池中的字面量,那么比较它们的引用(即内存地址)会比比较它们的内容更加高效。因为引用比较是O(1)的时间复杂度,而内容比较(如使用equals()方法)可能需要遍历整个字符串,其时间复杂度与字符串的长度成正比。因此,字符串常量池可以显著提高字符串比较的效率。

编译器优化:字符串常量池的内容在编译期间就已经确定,这允许编译器对字符串进行一些优化处理,如合并相同的字符串字面量。这种优化可以减少代码中的冗余,并提高程序的执行效率。

3. 显式控制字符串共享

intern()方法:String类提供了一个intern()方法,该方法可以将一个字符串添加到字符串常量池中(如果该字符串尚未存在于池中)。如果池中已经存在相同的字符串,则intern()方法会返回对该字符串的引用;否则,它会在池中创建一个新的字符串对象并返回其引用。这使得程序员可以显式地控制字符串的共享和存储。

字符串String  s1=new String(“abc”) 这句话创建了几个字符串对象

String s1 = new String("abc");
  1. 字符串字面量 "abc"
    • 在Java中,字符串字面量(例如 "abc")通常会被放入字符串常量池(String Constant Pool)中。这个常量池是Java堆内存的一部分,专门用于存储字符串字面量。
    • 如果字符串常量池中已经存在 "abc" 这个字符串字面量,那么它不会被再次创建。如果不存在,那么它会被添加到常量池中。
  2. new String(...) 构造函数
    • new String("abc") 这个表达式不仅使用了字符串字面量 "abc",而且还通过调用String类的构造函数创建了一个新的String对象。
    • 这个新创建的String对象在Java堆的常规部分(非字符串常量池)中分配内存。
    • 这个新对象的内容与字符串常量池中的 "abc" 相同,但它们是两个不同的对象,因为它们有不同的内存地址。
String s1 = new String("abc");

至少会创建两个字符串对象:

一个在字符串常量池中(如果之前不存在的话),用于存储字符串字面量 "abc"。

一个在Java堆的常规部分,是通过new String(...)构造函数创建的,其内容与常量池中的 "abc" 相同,但它们是独立的对象。