`

java String的equals,intern方法

阅读更多
java String的equals,intern方法
JAVA中的equals和==的区别

==比较的是2个对象的地址,而equals比较的是2个对象的内容。

显然,当equals为true时,==不一定为true;

 

基础知识的重要性,希望引起大家的重视,包括自己在内

很多困惑和疑问而且均来自于最基础的知识

折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟

public class TestString {

    public static void main(String[] args) {

        String s1 = "Monday";

        String s2 = "Monday";

    }

}

有什么问题呢?

1. 来自 String 的忧虑

上面这段程序中,到底有几个对象呢?

可能很多人脱口而出:两个,s1 和 s2

为什么?

String 是 final 类,它的值不可变。

看起来似乎很有道理,那么来检测一下吧,稍微改动一下程序

就可以看到结果了:

public class TestString {

    public static void main(String[] args) {

        String s1 = "Monday";

        String s2 = "Monday";

        if (s1 == s2)

            System.out.println("s1 == s2");

        else

            System.out.println("s1 != s2");

    }

}

呵呵,很多人都会说已经不止两个对象了

编译并运行程序,输出:s1 == s2

啊!

为什么 s1 == s2 ?

== 分明是在说:s1 与 s2 引用同一个 String 对象 -- "Monday"!

2. 千变万化的 String

再稍微改动一下程序,会有更奇怪的发现:

public class TestString {

    public static void main(String[] args) {

        String s1 = "Monday";

        String s2 = new String("Monday");

        if (s1 == s2)

            System.out.println("s1 == s2");

        else

            System.out.println("s1 != s2");

        if (s1.equals(s2))

            System.out.println("s1 equals s2");

        else

            System.out.println("s1 not equals s2");

    }

}

我们将 s2 用 new 操作符创建

程序输出:

s1 != s2

s1 equals s2

嗯,很明显嘛

s1 s2分别引用了两个"Monday"String对象

可是为什么两段程序不一样呢?

3. 在 String 的游泳池中游泳

哈哈,翻了翻书终于找到了答案:

原来,程序在运行的时候会创建一个字符串缓冲池

当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会

在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被

放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1

将 s2 引用 s1 所引用的对象"Monday"

第二段程序中,使用了 new 操作符,他明白的告诉程序:

“我要一个新的!不要旧的!”与是一个新的"Monday"Sting对象被创

建在内存中。他们的值相同,但是位置不同,一个在池中游泳

一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?

4. 继续潜水

再次更改程序:

public class TestString {

    public static void main(String[] args) {

        String s1 = "Monday";

        String s2 = new String("Monday");

        s2 = s2.intern();

        if (s1 == s2)

            System.out.println("s1 == s2");

        else

            System.out.println("s1 != s2");

        if (s1.equals(s2))

            System.out.println("s1 equals s2");

        else

            System.out.println("s1 not equals s2");

    }

}

这次加入:s2 = s2.intern();

哇!程序输出:

s1 == s2

s1 equals s2

原来,程序新建了 s2 之后,又用intern()把他打翻在了池里

哈哈,这次 s2 和 s1 有引用了同样的对象了

我们成功的减少了内存的占用

5. == 与 equals() 的争斗

String 是个对象,要对比两个不同的String对象的值是否相同

明显的要用到 equals() 这个方法

可是如果程序里面有那么多的String对象,有那么多次的要用到 equals ,

哦,天哪,真慢啊

更好的办法:

把所有的String都intern()到缓冲池去吧

最好在用到new的时候就进行这个操作

String s2 = new String("Monday").intern();

嗯,大家都在水池里泡着了吗?哈哈

现在我可以无所顾忌的用 == 来比较 String 对象的值了

真是爽啊,又快又方便!



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ameyume/archive/2010/08/16/5815756.aspx

 

分享到:
评论

相关推荐

    Java基础复习(内附String中equals与==区别的分析)

    本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...

    java 中String.equals和==的比较

    String.equals() 是 Java 中 String 类的方法,用于比较字符串的内容是否相等。该方法会比较字符串的每个字符是否相同,包括大小写。如果两个字符串的内容相同,那么 equals() 方法将返回 true,否则返回 false。 =...

    java中equals和==的区别

    如果我们想要让 s2 也引用同一个对象,可以使用 intern() 方法: public class TestString { public static void main(String[] args) { String s1 = "Monday"; String s2 = new String("Monday"); s2 = s2....

    String类的intern、split方法

    从程序的角度上看这个方法的作用是,当我们有两个字符串 s1,s2,且 s1.equals(s2) 时,s1.intern()==s2.intern(),也就是说这两个字符串在内存中使用的是同一个实例。Java 语言规范中定义了字符串文字以及更一般的...

    java中equals和==的区别.doc

    使用 intern() 方法可以将 s2 的值加入缓冲池中,这样可以避免创建新的字符串对象。 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。我们应该根据实际情况选择合适的运算符,以避免编程中的错误。

    java中equals和==的区别.docx

    例如,在 Java 中,String 类的 equals 方法用于比较两个字符串的内容是否相同: ```java String s1 = "Monday"; String s2 = "Monday"; if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { ...

    JAVA中equals和的区别.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具。然而,它们在实现这一目标的方式上有着本质的区别。理解这些差异对于正确地进行对象比较至关重要。 #### 二、基本概念 1. **...

    Java String对象的经典问题

    2. **使用equals()方法**:`String`类重写了`Object`类中的`equals()`方法,使其能够比较两个`String`对象的内容是否相同,而不是它们的引用。这意味着即使两个`String`对象在不同的位置存储,只要它们的内容相同,`...

    java中equals和的比较.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具,但它们之间存在显著的区别。理解这些差异对于编写高效且无误的代码至关重要。 #### 二、基本概念 1. **==(双等号)**: - ...

    java String类的实现

    `String`类的`intern()`方法返回池中字符串的引用。如果字符串不在池中,它会被添加到池中并返回其引用。这个方法在优化内存使用和避免重复对象时非常有用。 ### 8. 格式化输出 `String`类还提供了`format()`方法,...

    java中equals和==的区别.pdf

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常用来比较对象的工具,但它们之间存在着显著的区别。理解这些区别对于编写健壮的Java代码至关重要。 首先,`==`运算符用于比较基本类型(如int、char等)的...

    java中equals和==的比较.pdf

    然而,很多类(如String、Integer等)都重写了`equals()`方法,使其比较对象的内容而不是引用。这意味着当调用`equals()`时,实际比较的是两个对象的内容是否相等,而非它们在内存中的位置。 3. 在String类中的特殊...

    Java 之 String 类型

    本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他数据类型的转换。 1. **字符串的创建与不可变性** - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如...

    java中equals和==的区别.

    在Java编程语言中,`equals()`方法和`==`运算符是用于比较对象的两种不同方式,它们在处理不同类型的数据时有不同的行为。了解这两者的区别对于编写正确的代码至关重要。 `==`运算符: 1. `==`用于比较基本类型的...

Global site tag (gtag.js) - Google Analytics