`

Java String 字符串创建理解 equels和"==" 差异

阅读更多
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

附件,本文中的测试程序
  • str.rar (630 Bytes)
  • 下载次数: 1
1
3
分享到:
评论

相关推荐

    Java String 字符串创建理解 equels和\"==\" 差异

    它被广泛用于存储文本信息,而关于字符串创建的理解,以及"equals()"方法和"=="运算符的区别,是每个Java开发者都应深入掌握的知识点。 首先,让我们来探讨字符串的创建。在Java中,有多种创建字符串的方式: 1. *...

    字符串比较之 “==”和 “equals”

    在处理字符串时,理解这两者的差异至关重要,这可以帮助我们编写出更准确、更健壮的代码。在阅读给定的"字符串比较之“==”和“equals”"文档时,可以深入学习这些细节,以及它们在不同情况下的应用。通过了解这些...

    java中equals和==的区别.pdf

    在Java编程语言中,`equals()` 和 `==` 是两种常用的比较...在使用`String`时,要理解字符串池的作用,并根据需求合理使用`==`和`equals()`,以及`intern()`方法。理解这些概念对于编写高效、无误的Java代码至关重要。

    java中equals和==的区别的剖析.pdf

    在Java编程语言中,`equals()` ...总之,理解 `equals()` 和 `==` 的差异是Java编程中的重要概念,这有助于避免逻辑错误并写出更加高效和健壮的代码。在处理字符串时尤其需要注意,因为它们经常涉及到对象内容的比较。

    java中equals和==的区别文.pdf

    总之,理解 `equals()` 和 `==` 在Java中的差异对于编写高效、无误的代码至关重要。在比较对象时,使用 `equals()` 来检查内容,而使用 `==` 来检查是否为同一个对象。对于 `String` 类型,还要注意字符串常量池的...

    Java中的==和equals区别

    这是因为`String`类重写了`Object`类中的`equals`方法,使其能够比较字符串的字符序列。 ##### 实例: ```java String str1 = "java"; String str2 = "java"; System.out.println(str1.equals(str2)); // 输出 ...

    Java中String判断值为null或空及地址是否相等的问题

    在Java编程中,字符串(String)是非常...同时,了解字符串对象的内存地址和内容相等性的差异,可以帮助我们更好地理解和调试程序。在实际开发中,应始终确保对`null`进行检查,以防止未预期的`NullPointerException`。

    equals与==之间的区别

    在此例中,尽管`a`和`b`是由两次`new`操作创建的不同对象,但由于它们的内部状态(即字符序列)相同,通过调用`equals`方法,可以得到`true`的结果,表明这两个字符串对象的内容相等。 ### `equals`方法与`==`操作...

    java字符串操作大全

    这些知识点对于Java初学者来说至关重要,并且能够帮助开发者更好地理解和运用Java中的字符串类及其方法。 #### 1. 字符串长度:`length()` 此方法返回字符串的长度。例如: ```java char chars[] = {'a', 'b', 'c'...

    java中equals和==的区别[文].pdf

    对于非字符串对象,如自定义类`A`的实例,`==`和`equals()`通常都比较对象的内存地址: ```java class A { A obj1 = new A(); A obj2 = new A(); } ``` - `obj1 == obj2` 返回 `false`,因为它们是不同的实例。 - ...

    java实验-字符串.docx

    总结来说,这个实验旨在帮助我们理解和掌握Java中字符串的基本操作,如获取长度、查找特定字符的次数,以及理解字符串比较和可变性在性能上的差异。通过实践,我们可以更好地运用这些知识来编写高效的Java代码。

    详解 Java 中 equals 和 == 的区别

    在 Java 编程语言中,`equals()` 和 `==` 是两种常见的用于比较对象的运算符,但在处理字符串时,它们的行为有所不同。本文将详细解释它们的区别,并提供示例进行说明。 1. `equals()` 方法 `equals()` 方法是 ...

    浅谈java 中equals和==的区别

    例如,当我们创建两个 `String` 对象 `str1` 和 `str2` 并赋值为 "abc",由于字符串字面量在Java中是常量,它们会被存储在字符串常量池中。因此,`str1` 和 `str2` 都指向常量池中的同一实例,所以 `str1 == str2` ...

    基于Java字符串 "==" 与 "equals" 的深入理解

    在Java编程语言中,字符串(String)是一个特殊的数据类型,它用于表示文本。当我们比较两个字符串时,有两种主要的方法:“==”运算符和“equals”方法。这篇文章将深入探讨这两个概念,帮助初学者更好地理解它们之间...

    java中字符串的所有用法

    这些知识点对于理解和掌握 Java 的字符串处理功能至关重要。 #### 二、字符串的基本操作 ##### 1. `length()`: 获取字符串的长度 - **功能**: 返回字符串中的字符数量。 - **示例**: ```java char chars[] = {'a...

    java获取字符串编码类型代码(导入直接查看结果)

    上述代码会遍历Java支持的所有字符集,并尝试将字符串编码和解码,如果编码和解码后的内容一致,那么这个编码就可能是字符串的原始编码。然而,这种方法并不总是准确,因为可能存在多个编码方式都能正确表示相同的...

Global site tag (gtag.js) - Google Analytics