Java 字符串教程

原文: https://javabeginnerstutorial.com/core-java-tutorial/java-string-tutorial/

字符串是 Java 中大量使用的那些对象之一。 这就是String在 Java(字符串池)中具有唯一处理的原因。

  • String类表示字符串。
  • Java 程序中的所有字符串字面值(例如"abc")都实现为此类的实例。
  • 字符串就像常量,一旦创建,其值就无法更改。
  • 字符串对象是不可变的,因此可以共享。
  • 如果要执行很多字符串操作,则可以使用字符串缓冲区和字符串生成器代替字符串。

字符串创建

您可以通过两种方式在 Java 中创建字符串。 两者看起来相同,但是两种方法之间存在差异。

  1. String jbt = new String("JBT");
  2. String jbt = "JBT";

字符串的重要方面

  1. 不可变

重要方法

  • internal()
  • length()
  • toString()
  • trim()
  • substring()

字符串存储

如您所知,java 中除原语外的所有内容都是对象。 字符串也是如此。 字符串也是对象,因此它仅驻留在堆上。 但是还有另一个术语用于字符串存储,即字符串池/字符串字面值池。 大多数时候,人们将其视为字符串对象的独立池(对我来说也是如此)。 但是这是错误的。 字符串池/字符串字面值池不过是对String对象的引用的集合。 我们知道String对象是不可变的,因此最好将“String”对象与多个引用“共享”。 (反之亦然,因为字符串对象在不同的​​引用之间共享,这就是字符串对象不可变的原因。)

字符串字面值和对象

字符串以以下两种格式创建,它们在很多方面彼此不同。

  1. 字符串字面值
  2. 使用new关键字

因此,当我们说字符串字面值时,实际上是指字符串池中的引用,而当我们说字符串对象(使用new关键字)时,我们直接是指堆中的字符串对象。 但是在两种情况下,我们仅指的是堆中的对象(直接/间接)。

如何创建

现在的问题出现了如何创建字符串字面值和字符串对象。 众所周知,我们可以通过两种方式创建字符串对象。

String str1 = "abc";

使用new关键字

  1. String str=new String("javabeginnerstutorial");

当我们使用new运算符创建String时,实际上是像第一个选项那样在堆中创建String对象。 在这里,我们在堆内存中创建一个字符串对象,其值为"abc"。 和一个名为“str”的引用。

还请注意,当我们使用""(字面值)创建此String对象时,还将创建字面值。 总共将有 1 个字符串对象 1 个字符串字面值并将创建引用。 但是引用将仅引用堆中的String对象,而不引用字符串池中的字面值。

当我们使用""时,我们正在创建字面值(""中的所有内容均视为字面值)。 在这种情况下(第二种情况),JVM 将在字符串池中查找所有引用,并检查其中是否有指向值"abc"的堆中的字符串对象,如果找到,则将返回该对象的引用。 否则,JVM 将在堆中创建一个新的字符串对象,并在字符串池中对其进行内化(使用inter()方法)(此对象的引用将添加到字符串池中),以供以后引用。 并且将返回新创建对象的引用。 现在,如果我们再次编写相同的代码来创建String字面值。

字符串字面值

  1. String str2="javabeginnerstutorial";

这些类型的字符串是在堆中创建的,如果String常量池中的对象具有相同的值,则堆中的对象将被引用为String常量池中的该对象。 引用变量"str2"将指向堆中的对象。

字符串常量池是一个存储唯一字符串对象的池,从而增强了不变性,即,即使您对先前创建的字符串进行连接,也将在堆和常量池中同时创建一个新对象(前提是没有相似之处) 之前存在的对象),然后将该对象相应地返回给程序。

字符串垃圾回收

您可能已经听说过String字面值永远不适合进行垃圾回收。 注意,我们提到的是字符串字面值,而不是字符串对象。 它们是有区别的。 当不再从应用的活动部分引用对象时,该对象就有资格进行垃圾回收。 字符串字面值总是从字符串字面值池中对其进行引用。 这意味着它们始终引用它们,因此不符合垃圾回收的条件。 但是可能有些String对象没有任何引用,那么它们就有资格进行垃圾回收。

备忘单

  • 字符串对象用于保存文本字符串。
  • java.lang包的一部分。
  • 字符串可以使用连接运算符(+)添加。
  • 字符使用单引号(')作为定界符,而字符串使用双引号(")作为定界符。
  • 字符串对象是不可变的。 字符串对象的值一经分配就无法更改。
  • 字符串类是最终的方法,它不能覆盖字符串类的方法。
  • 所有字符串字面值由 JVM 添加到字符串池。
  • 字符串具有方法length(),而数组具有属性length检查长度。
  • 为了克服String的不可变属性,StringBufferStringBuilder出现在图片中。