`

(转)java string的==操作

    博客分类:
  • Java
阅读更多
初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉
但是发现很多困惑和疑问而且均来自于最基础的知识
折腾了一阵子又查了查书,终于对 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 对象的值了
真是爽啊,又快又方便!
分享到:
评论

相关推荐

    java中String类型转换方法.pdf

    Java 中 String 类型转换方法是一种常见的编程操作,涉及到各种数据类型之间的转换,包括整型、浮点型、长整型、浮点型等。本文将详细介绍 Java 中 String 类型转换方法的各种形式。 整型到字符串 在 Java 中,将...

    java String 使用详解

    本文将详细介绍 Java String 的使用方法,包括 String 对象的初始化、字符串的常见操作等。 一、String 对象的初始化 String 对象的初始化是一种特殊的语法,Java 提供了简化的初始化方法,例如: String s = ...

    java中string和int型的相互转换.doc

    Java 中 String 和 int 类型的相互转换是一个基本的数据类型转换操作。下面我们来详细介绍这两种类型的相互转换。 String 转换为 int 在 Java 中,将 String 类型转换为 int 类型可以使用两种方法: 1. 使用 `...

    JavaBean与JsonString的相互转换

    总结,JavaBean和JsonString的转换是Java开发中的常见操作,通过各种JSON库可以轻松实现。了解这些转换方法对于进行前后端数据交互、序列化和反序列化等任务至关重要。在实际开发中,应根据项目需求选择合适的库,并...

    String a="hello" String b="hello" a==b 返回true的问题分析

    java里面没有指针的概念,但是实际上引用变量里面放的确实是地址值,只是java为了安全不允许我们对想c语言中的那样对指针进行操作(如++ 、--)等。这样就有效的防止了指针在内存中的游离。 而对于 String c=new ...

    java中String_十六进制String_byte[]之间相互转换

    ### Java中String、十六进制String与byte[]之间的相互转换 在Java开发中,字符串(String)、十六进制表示的字符串以及字节数组(byte[])之间的转换是非常常见的需求,尤其是在处理网络通信、文件读写等场景下。...

    java中将string类型转换成timestamp类型

    "Java中将String类型转换成Timestamp类型" ...将String类型转换成Timestamp类型是Java编程语言中的一种常见操作,该操作需要了解Timestamp类型的特点和限制,并使用正确的方法和技术来实现转换操作。

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

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

    list转换成string数组

    在Java编程语言中,经常需要将`List<String>`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...

    java中equals和==的区别

    在 Java 中,String 是一个特殊的引用类型。String 中的 equals 和 == 还有更多的细节。下面是一个简单的示例程序: public class TestString { public static void main(String[] args) { String s1 = "Monday";...

    java中String类型和int类型比较及相互转换

    在Java编程语言中,数据类型的比较与转换是基础但又至关重要的操作,尤其在处理文本与数字信息时。本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序...

    java基础String类选择题练习题

    综上所述,这份Java基础String类选择题练习题主要覆盖了String和StringBuffer类的基础概念、基本操作方法以及它们之间的区别等内容。通过这些练习题,学习者可以更好地理解和掌握这两个类的使用方法,为实际编程工作...

    Java_String_的方法

    ### Java字符串方法详解 #### 一、创建并初始化字符串 ...通过以上方法,我们可以有效地处理和操作Java中的字符串。这些方法不仅在日常编程中频繁使用,也是理解和掌握Java语言基础的关键部分之一。

    JavaString常见操作[参照].pdf

    Java String API 中提供了许多有用的方法来操作字符串,這些方法可以帮助开发者轻松地处理字符串操作。下面是 Java String API 中常用的方法: 一、获取 Java String API 中提供了多种获取字符串信息的方法,包括...

    Java 之 String 类型

    在Java编程语言中,String类型扮演着至关重要的角色。它被广泛用于表示和操作文本,因为它是不可变的,这确保了字符串的安全性和效率。本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他...

    JAVA JSON;String 转换为 java类

    这里以Jackson为例,因为它是目前广泛使用的JSON处理库,提供了强大的JSON操作功能。 1. **添加Jackson依赖** 在你的项目中,确保已经包含了Jackson的核心库`jackson-databind`。如果是Maven项目,在`pom.xml`文件...

    java中jython操作把python数据类型转成java类型

    Map<String, String> javaMap = (Map<String, String>) pythonDict.__tojava__(Map.class); ``` 这个过程将Python字典的键值对映射到Java的Map对象。 3. Python Set到Java Set: Python的set可以转换为Java的Set...

    String1.java

    ### Java字符串操作详解:String1.java程序分析 在Java编程语言中,字符串处理是一项非常重要的技能,无论是进行数据处理还是用户交互,字符串都是一个不可或缺的数据类型。本篇将基于提供的`String1.java`代码示例...

    JAVA_String

    在本文中,我们将深入探讨`JAVA_String`相关的知识点,包括其创建、操作、比较以及内存管理等方面。 首先,`String`类位于`java.lang`包中,这意味着在编写Java程序时,我们无需显式导入它。`String`对象一旦创建,...

    android GBK转换为String

    在Android系统中,大部分内部操作都是基于Unicode的,但有时候我们需要与GBK编码的数据进行交互,比如读取GBK格式的文本文件或网络数据。本文将深入探讨如何在Android中进行GBK与Unicode之间的转换。 首先,我们...

Global site tag (gtag.js) - Google Analytics