Java 字符串教程
原文: https://javabeginnerstutorial.com/core-java-tutorial/java-string-tutorial/
字符串是 Java 中大量使用的那些对象之一。 这就是String
在 Java(字符串池)中具有唯一处理的原因。
String
类表示字符串。- Java 程序中的所有字符串字面值(例如
"abc"
)都实现为此类的实例。 - 字符串就像常量,一旦创建,其值就无法更改。
- 字符串对象是不可变的,因此可以共享。
- 如果要执行很多字符串操作,则可以使用字符串缓冲区和字符串生成器代替字符串。
字符串创建
您可以通过两种方式在 Java 中创建字符串。 两者看起来相同,但是两种方法之间存在差异。
String jbt = new String("JBT");
String jbt = "JBT";
字符串的重要方面
- 不可变
重要方法
internal()
length()
toString()
trim()
substring()
字符串存储
如您所知,java 中除原语外的所有内容都是对象。 字符串也是如此。 字符串也是对象,因此它仅驻留在堆上。 但是还有另一个术语用于字符串存储,即字符串池/字符串字面值池。 大多数时候,人们将其视为字符串对象的独立池(对我来说也是如此)。 但是这是错误的。 字符串池/字符串字面值池不过是对String
对象的引用的集合。 我们知道String
对象是不可变的,因此最好将“String
”对象与多个引用“共享”。 (反之亦然,因为字符串对象在不同的引用之间共享,这就是字符串对象不可变的原因。)
字符串字面值和对象
字符串以以下两种格式创建,它们在很多方面彼此不同。
- 字符串字面值
- 使用
new
关键字
因此,当我们说字符串字面值时,实际上是指字符串池中的引用,而当我们说字符串对象(使用new
关键字)时,我们直接是指堆中的字符串对象。 但是在两种情况下,我们仅指的是堆中的对象(直接/间接)。
如何创建
现在的问题出现了如何创建字符串字面值和字符串对象。 众所周知,我们可以通过两种方式创建字符串对象。
String str1 = "abc";
使用new关键字
String str=new String("javabeginnerstutorial");
当我们使用new
运算符创建String
时,实际上是像第一个选项那样在堆中创建String
对象。 在这里,我们在堆内存中创建一个字符串对象,其值为"abc"
。 和一个名为“str
”的引用。
还请注意,当我们使用""
(字面值)创建此String
对象时,还将创建字面值。 总共将有 1 个字符串对象 1 个字符串字面值并将创建引用。 但是引用将仅引用堆中的String
对象,而不引用字符串池中的字面值。
当我们使用""
时,我们正在创建字面值(""
中的所有内容均视为字面值)。 在这种情况下(第二种情况),JVM 将在字符串池中查找所有引用,并检查其中是否有指向值"abc"
的堆中的字符串对象,如果找到,则将返回该对象的引用。 否则,JVM 将在堆中创建一个新的字符串对象,并在字符串池中对其进行内化(使用inter()
方法)(此对象的引用将添加到字符串池中),以供以后引用。 并且将返回新创建对象的引用。 现在,如果我们再次编写相同的代码来创建String
字面值。
字符串字面值
String str2="javabeginnerstutorial";
这些类型的字符串是在堆中创建的,如果String
常量池中的对象具有相同的值,则堆中的对象将被引用为String
常量池中的该对象。 引用变量"str2"
将指向堆中的对象。
字符串常量池是一个存储唯一字符串对象的池,从而增强了不变性,即,即使您对先前创建的字符串进行连接,也将在堆和常量池中同时创建一个新对象(前提是没有相似之处) 之前存在的对象),然后将该对象相应地返回给程序。
字符串垃圾回收
您可能已经听说过String
字面值永远不适合进行垃圾回收。 注意,我们提到的是字符串字面值,而不是字符串对象。 它们是有区别的。 当不再从应用的活动部分引用对象时,该对象就有资格进行垃圾回收。 字符串字面值总是从字符串字面值池中对其进行引用。 这意味着它们始终引用它们,因此不符合垃圾回收的条件。 但是可能有些String
对象没有任何引用,那么它们就有资格进行垃圾回收。
备忘单
- 字符串对象用于保存文本字符串。
java.lang
包的一部分。- 字符串可以使用连接运算符(
+
)添加。 - 字符使用单引号(
'
)作为定界符,而字符串使用双引号("
)作为定界符。 - 字符串对象是不可变的。 字符串对象的值一经分配就无法更改。
- 字符串类是最终的方法,它不能覆盖字符串类的方法。
- 所有字符串字面值由 JVM 添加到字符串池。
- 字符串具有方法
length()
,而数组具有属性length
检查长度。 - 为了克服
String
的不可变属性,StringBuffer
和StringBuilder
出现在图片中。