以前关于String的理解仅限于三点:
1、String 是final类,不可继承
2、String 类比较字符串相等时时不能用“ == ”,只能用 "equals"
3、String 类不可更改
String 使用非常方便,因此一般涉及字符串时都用该类进行字符串处理
至于String类的类在机制,则极少去探究。
直到读到下面这个例子。
class X
{
public static String strX="hello";
}
class Y
{
public static String strY="hello";
}
class Z
{
public static String strZ="hell"+"o";
}
class Test
{
public static void main(String[] args)
{
System.out.println( X.strX==Y.strY);
System.out.println( X.strX==Z.strZ);
String s1="hel";
String s2="lo";
System.out.println( X.strX==(s1+s2));
System.out.println( X.strX==(s1+s2).intern());
}
}
按照我的理解,类X,类Y,类Z中的三个常量字符串属于不同的对象,用 == 操作符比较,那么结果必然是 false,输出应该为:
false
false
false
false
但实际上输出确是:
true
true
false
true
使我大惑不解。并因此找了许多资料来看(尤其是C++和Java比较编程,里面解释比较详细),终于逐渐明白了原因。
== 只有在两个比较对象指向同一对象时,其值才为true。
X.strX==Y.strY 与 X.strX==Z.strZ 测试结果都为true,说明这三个常量指向的都是同一个对象。
在JAVA中,String 是字符串常量。由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。每个字符串常量只有一个 String 对象来表示。即使这个字符串常量出现在一个程序的不同位置甚至一个程序的不同程序包中。也就是说,X.strX 与
Y.strY 由于都是同一字符序列,因此 指向的肯定是同一对象。
Z.strZ 也是如此。"hell"+"o",两个常量字符串相加后,创建了一个新的字符串常量(这个工作是编译期间完成的),它与 X.strX ,
Y.strY有相同的字符序列,因此指向同一对象 。
虽然一个常量表达式将两个字符串常量链接在一起的结果在编译器已完成,但是
String s1="hel";
String s2="lo";
String s3=s1+s2;
这段代码中,s3只能在运行期间创建。这三条语句所创建的"hello"字符串作为String对象存储在内存中的一个独立位置。
Java提供一个机制,通过String类定义的intern()方法把
一个运行时创建的字符串加到字符串常量池(如果它还没有入池)。如果上面的三条代码改为:
String s1="hel";
String s2="lo";
String s3=(s1+s2).intern();
java将把 s1+s2 所返回的字符串对象中的字符序列与已经存储在字符串常量池中的字符串进行比较。如果找到一个匹配,intern()就返回这个字符串的引用。如果没有找到匹配,
s1+s2 所返回的字符串将被加入到字符串常量池中,并返回这个字符串常量的引用。
这就解释了为社么X.strX==(s1+s2)返回false,而X.strX==(s1+s2).intern()返回true。(s1+s2).intern()指向strX,strY,StrX指向的字符串常量"hello"。
分享到:
相关推荐
Java提供了两种主要的方式来创建字符串:通过`String`类的构造方法和使用`StringBuilder`或`StringBuffer`类。以下是对这些知识点的详细解释: 1. **String类**: - **不可变性**:Java中的`String`对象是不可变的...
在Java编程语言中,字符串(String)是一个非常基础且重要的数据类型。它被广泛用于存储文本信息,而关于字符串创建的理解,以及"equals()"方法和"=="运算符的区别,是每个Java开发者都应深入掌握的知识点。 首先,让...
- 声明字符串常量时,Java会自动创建一个`String`对象。例如,`String str1 = "This is a String"`,这里的字符串常量是隐式创建的。 - 对于字符串变量,需要先声明再初始化。声明一个`String`变量可以写作`String...
当使用字符串字面量(即双引号包围的文本)创建字符串时,Java虚拟机(JVM)会首先查看字符串常量池,如果字符串已经存在,就直接返回引用;如果不存在,JVM则会在池中创建新的字符串实例。 创建字符串对象主要有两...
字面量方式会创建一个常量字符串,存储在字符串池中;而构造器则会在堆上创建对象。 2. **字符串不可变性**: Java中的字符串是不可变的,意味着一旦创建,就不能更改其内容。每次对字符串进行修改操作(如`append...
在本压缩包“字符串string.zip”中,主要包含的是与Java编程语言中字符串相关的教学资料,特别是针对S1课程的学员。这个课程旨在帮助学生深入理解程序逻辑,并且重点聚焦在Java中的字符串处理。文件“Chapter15”...
在Java编程语言中,字符串(String)是一个非常基础且重要的数据类型。它被广泛用于处理文本信息,例如用户输入、文件内容、网络数据等。本文将深入探讨Java中的字符串操作,包括创建、比较、拼接、查找与替换、分割...
在Java编程语言中,字符串是极其重要且常用的数据类型...以上就是Java中字符串处理的一些核心知识点,理解并掌握这些将有助于编写更高效、更安全的Java代码。在实际编程中,灵活运用字符串操作可以解决很多复杂的问题。
#### 变量字符串与常量字符串的区别 考虑以下代码: ```java String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; System.out.println(s3 == s1 + s2); // 输出 false System.out.println(s3 ==...
Java的字符串字面量会被放入字符串常量池中,如果两个字符串字面量内容相同,它们会指向同一个对象。例如,`str2`与`"World"`在内存中是共享的。 3. **字符串比较** `equals()`方法用于比较字符串内容是否相等,...
总的来说,理解和熟练掌握Java中的字符串操作是成为Java程序员的基础,包括创建、比较、拼接以及字符串的内存管理,这些都是编写高效且无错误的Java代码的关键。在实际开发中,根据具体需求选择合适的字符串处理方法...
然而,每次使用`+`操作符时,如果涉及到字符串常量,Java会创建一个新的字符串对象,这在循环中会引发大量的对象创建,导致性能急剧下降。 2. **String.concat(String str)**: 这是`String`类提供的一个方法,它...
Java String 字符串常量池解析 Java 中的字符串常量池是一种为了提高性能和减少内存开销的机制。它是 JVM 实例化字符串常量时进行的一些优化,主要是为了减少字符串对象的创建和存储。 字符串常量池的设计思想是...
总结来说,这个实验旨在帮助我们理解和掌握Java中字符串的基本操作,如获取长度、查找特定字符的次数,以及理解字符串比较和可变性在性能上的差异。通过实践,我们可以更好地运用这些知识来编写高效的Java代码。
在Java中,如果我们使用字面值方式创建的String对象,它们是常量池中的字符串常量,如果我们使用new关键字创建的String对象,它们是运行时创建的新对象。例如,String s0="kvill";,String s1=new String("kvill");...
这个特性源自于Java中的字符串常量池,它提升了性能,但也限制了字符串的动态修改。 首先,让我们深入了解String类的基本构造和特性。String类位于java.lang包中,因此在编写Java程序时,我们无需显式导入。String...
Java虚拟机(JVM)维护了一个特殊的区域称为字符串常量池。当创建一个字符串并将其存储在池中时,如果已有相同内容的字符串存在,那么将返回池中已存在的字符串的引用,这就是所谓的字符串 intern() 方法的原理。 ...
同样,`d.equals(a)`为`true`,但`d == a`为`false`,因为`d`是通过`new String()`创建的新对象,而`a`是常量池中的字符串。`e`的情况也是如此,它是一个通过`StringBuilder`构建的新对象。 总结来说,理解Java中`...
编译器会优化上述代码,将其视为一个常量字符串,即: ```java String s1 = "Thisisonlyasimpletest"; ``` 因此在这种情况下,`String`的操作效率可能会高于`StringBuilder`或`StringBuffer`。 然而,当字符串来源...
在Java编程语言中,字符串常量池(String Constant Pool)是一个重要的概念,它与程序的内存管理和性能优化密切相关。理解这个概念对于任何Java开发者来说都至关重要。字符串常量池是Java虚拟机(JVM)在运行时为...