String是一个非可变类(immutable)。
什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。
好了,知道String是非可变类以后,我们可以进一步了解String的构造方式了。创建一个Stirng对象,主要就有以下两种方式:
String str1 = new String("abc");
Stirng str2 = "abc";
虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。
对于第一种,jvm会马上在heap(堆)中创建一个String对象,然后将该对象的引用返回给用户。
对于第二种,jvm首先会在内部维护的strings pool(我称之为字符串对象池,以下我简称之为 对象池)中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。
看下面的例子:
public class str {
public static void main(String[] args) {
//在堆上创建一个“abc”对象,但是jvm不会主动把该对象引用放到strings pool,
//而equels比较字符串呢,是要到strings pool 里面来做比较的!
String str1 = new String("abc");
//jvm 先在对象池中查找是否有“abc”对象,如果没有则在堆中创建一个“abc”对象,并把引用放到对象池中
String str2 = "abc";
//这个时候 堆中有两个"abc"对象
if (str1 == str2)
System.out.println("str1 == str2");
else
System.out.println("str1 != str2");
}
}
这里为什么不用equels而用==呢?
其实equels是用来比较两个字符串是否相同而已,无论字符串是否是同一个对象,都会返回true,只要是相同就OK了。而"=="则是既要看是否相同,还要看是否同一个对象才能返回true,否则返回false;这就是为什么我们有时候写程序用"=="不能判断字符串而用equels。当然对于理解String比较深的人而言就不存在这个问题了。老师教我们的比较字符串都用equels不要用"==".
我想"=="就相当于数学上比较两个三角形是否全等
equels则是比较两个三角形是否相似;
打印结果是 str1 != str2,因为它们是堆上两个不同的对象
再看例子
//此时,jvm发现strings pool中已有“abc”对象了,因为"abc"equels("abc")
//因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用
public class str {
public static void main(String[] args) {
// 在堆上创建一个“abc”对象,但是jvm不会主动把该对象引用放到strings pool,
// 而equels比较字符串呢,是要到strings pool 里面来做比较的!
String str1 = new String("abc");
// jvm 先在对象池中查找是否有“abc”对象,如果没有则在堆中创建一个“abc”对象,并把引用放到对象池中
String str2 = "abc";
// 这个时候 堆中有两个"abc"对象
if (str1 == str2)
System.out.println("str1 == str2");
else
System.out.println("str1 != str2");
// jvm 又是先在对象池中查找是否有“abc”对象,一看,哦哦,有这个对象,于是就直接将“abc”的str2引用改成str3
String str3 = "abc";
if (str2 == str3)
System.out.println("str2 == str3");
else
System.out.println("str2 != str3");
//打印结果是 str2 == str3
}
}
//打印结果为 str2 == str3
再看下面的例子:
public class str {
public static void main(String[] args) {
// 在堆上创建一个“abc”对象,但是jvm不会主动把该对象引用放到strings pool,
// 而equels比较字符串呢,是要到strings pool 里面来做比较的!
String str1 = new String("abc");
//这个方法就是将引用放到对象池中
str1 = str1.intern();
// jvm 先在对象池中查找是否有“abc”对象,如果没有则在堆中创建一个“abc”对象,并把引用放到对象池中
String str2 = "abc";
// 这个时候,因为上面str1调用了intern方法,对象池中有了str1对“abc”的引用 此时堆中有只有一个"abc"对象
if (str1 == str2)
System.out.println("str1 == str2");
else
System.out.println("str1 != str2");
// jvm 又是先在对象池中查找是否有“abc”对象,一看,哦哦,有这个对象,于是就直接将“abc”的str2引用改成str3
String str3 = "abc";
if (str2 == str3)
System.out.println("str2 == str3");
else
System.out.println("str2 != str3");
//打印结果是 str2 == str3
}
}
//打印结果是 str1 == str2
附件,本文中的测试程序
分享到:
相关推荐
它被广泛用于存储文本信息,而关于字符串创建的理解,以及"equals()"方法和"=="运算符的区别,是每个Java开发者都应深入掌握的知识点。 首先,让我们来探讨字符串的创建。在Java中,有多种创建字符串的方式: 1. *...
在处理字符串时,理解这两者的差异至关重要,这可以帮助我们编写出更准确、更健壮的代码。在阅读给定的"字符串比较之“==”和“equals”"文档时,可以深入学习这些细节,以及它们在不同情况下的应用。通过了解这些...
在Java编程语言中,`equals()` 和 `==` 是两种常用的比较...在使用`String`时,要理解字符串池的作用,并根据需求合理使用`==`和`equals()`,以及`intern()`方法。理解这些概念对于编写高效、无误的Java代码至关重要。
在Java编程语言中,`equals()` ...总之,理解 `equals()` 和 `==` 的差异是Java编程中的重要概念,这有助于避免逻辑错误并写出更加高效和健壮的代码。在处理字符串时尤其需要注意,因为它们经常涉及到对象内容的比较。
总之,理解 `equals()` 和 `==` 在Java中的差异对于编写高效、无误的代码至关重要。在比较对象时,使用 `equals()` 来检查内容,而使用 `==` 来检查是否为同一个对象。对于 `String` 类型,还要注意字符串常量池的...
这是因为`String`类重写了`Object`类中的`equals`方法,使其能够比较字符串的字符序列。 ##### 实例: ```java String str1 = "java"; String str2 = "java"; System.out.println(str1.equals(str2)); // 输出 ...
在Java编程中,字符串(String)是非常...同时,了解字符串对象的内存地址和内容相等性的差异,可以帮助我们更好地理解和调试程序。在实际开发中,应始终确保对`null`进行检查,以防止未预期的`NullPointerException`。
在此例中,尽管`a`和`b`是由两次`new`操作创建的不同对象,但由于它们的内部状态(即字符序列)相同,通过调用`equals`方法,可以得到`true`的结果,表明这两个字符串对象的内容相等。 ### `equals`方法与`==`操作...
这些知识点对于Java初学者来说至关重要,并且能够帮助开发者更好地理解和运用Java中的字符串类及其方法。 #### 1. 字符串长度:`length()` 此方法返回字符串的长度。例如: ```java char chars[] = {'a', 'b', 'c'...
对于非字符串对象,如自定义类`A`的实例,`==`和`equals()`通常都比较对象的内存地址: ```java class A { A obj1 = new A(); A obj2 = new A(); } ``` - `obj1 == obj2` 返回 `false`,因为它们是不同的实例。 - ...
总结来说,这个实验旨在帮助我们理解和掌握Java中字符串的基本操作,如获取长度、查找特定字符的次数,以及理解字符串比较和可变性在性能上的差异。通过实践,我们可以更好地运用这些知识来编写高效的Java代码。
在 Java 编程语言中,`equals()` 和 `==` 是两种常见的用于比较对象的运算符,但在处理字符串时,它们的行为有所不同。本文将详细解释它们的区别,并提供示例进行说明。 1. `equals()` 方法 `equals()` 方法是 ...
例如,当我们创建两个 `String` 对象 `str1` 和 `str2` 并赋值为 "abc",由于字符串字面量在Java中是常量,它们会被存储在字符串常量池中。因此,`str1` 和 `str2` 都指向常量池中的同一实例,所以 `str1 == str2` ...
在Java编程语言中,字符串(String)是一个特殊的数据类型,它用于表示文本。当我们比较两个字符串时,有两种主要的方法:“==”运算符和“equals”方法。这篇文章将深入探讨这两个概念,帮助初学者更好地理解它们之间...
这些知识点对于理解和掌握 Java 的字符串处理功能至关重要。 #### 二、字符串的基本操作 ##### 1. `length()`: 获取字符串的长度 - **功能**: 返回字符串中的字符数量。 - **示例**: ```java char chars[] = {'a...
上述代码会遍历Java支持的所有字符集,并尝试将字符串编码和解码,如果编码和解码后的内容一致,那么这个编码就可能是字符串的原始编码。然而,这种方法并不总是准确,因为可能存在多个编码方式都能正确表示相同的...