专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Java字符串常量池的介绍

Java字符串常量池的介绍

更新时间:2022-09-22 09:23:10 来源:动力节点 浏览547次

了解Java 中的 String 类、使其不可变背后的动机以及关于String常量池的整个想法。当我们通过 String 字面量或 String 构造函数创建 String 实例时,我们将看到如何操作内存。

1. Java 中的不可变字符串

字符串是一个字符序列。在 Java 中,与其他编程语言类似,字符串是预定义类型的一部分。Java 有java.lang.String类,其实例代表字符串。

该类String是一个不可变的类。不可变意味着String一旦创建了它的实例就不能更改。

通常,许多敏感信息(用户名、密码、URL、端口、数据库、套接字连接)都以字符串的形式表示和传递。通过使这些信息不可变,代码变得安全,可以抵御各种安全威胁。

字符串不变性还允许缓存字符串文字,这允许应用程序使用大量字符串文字,而对堆内存和垃圾收集器的影响最小。

在可变上下文中,对字符串文字的修改可能会导致变量损坏。

2. Java中的字符串常量池是什么?

Java中的内存分为三个部分,即堆、栈和字符串池。字符串常量池是用于存储字符串文字的特殊区域。

请注意,在 Java 7 之前,字符串池是永久代内存区域的一部分。

从 Java 7 开始,字符串与应用程序创建的其他对象一起分配在 Java 堆区域中。

后来,在 Java 8 中,永久代已被完全删除。

因此,在最新的 JVM 中,字符串池是堆内存中分配用于存储字符串文字的特殊区域。

3. 字符串字面量和字符串对象的区别

在 Java 中,字符串字面量是使用双引号创建的字符串,而字符串对象是使用new()运算符创建的字符串。

请注意,字符串字面量是在字符串池区域中创建的,而字符串对象是在堆内存区域中创建的。

String strLiteral = "Hello World";
String strObj = new String("Hello World");

假设我们要创建两个内容相同的字符串“ howtodoinjava”。如果内容为“ howtodoinjava”的字符串已经存在,那么新的文字将指向已经存在的文字。对于 String 对象,每次都会在堆中创建一个新的 String 对象。

让我们看一个例子。

String a = "howtodoinjava";
String b = "howtodoinjava";
System.out.println(a == b);     //true

在上面的程序中,我们创建了两个具有相同内容的字符串文字。在字符串池中创建 'a' 后,下一个字符串字面量 ' b' 指向内存区域中的同一个对象,所以'a == b'是true。

String a = "howtodoinjava";
String b = "howtodoinjava";
System.out.println(a == b);
String c = new String("howtodoinjava");
System.out.println(a == b);     //true
System.out.println(b == c);     //false

4. String.intern() 方法

我们知道字符串字面量是在字符串池中创建的,而字符串对象是在堆内存区域中创建的。

我们可以使用方法String.intern()为字符串对象创建字符串字面量。当在字符串对象上调用时,方法intern()会在堆内存中创建字符串对象的精确副本,并将其存储在字符串常量池中。

String a = "howtodoinjava";
String b = "howtodoinjava";
String c = new String("howtodoinjava");
String d = c.intern();

在上面的示例中,字符串 a, b 和d将引用 SCP 中的相同字符串文字。该字符串c将继续指向堆中的对象。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>