`
banfry
  • 浏览: 7654 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

String“==”的判断究竟是依据什么

阅读更多

测试代码如下:
public class TestString {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         String str1="ab";
         String str2="a"+"b";
        //比较一
        System.out.println(str1==str2);//结果true
        //比较二
        System.out.println(new String("ab")==new String("ab"));//结果false;

        // 且发现"ab".hashcode,new String("ab").hashcode都相等
        System.out.println(str1.hashCode());//结果3015
        System.out.println(str2.hashCode());//结果3015
        System.out.println(new String("ab").hashCode());//结果3015
       
       
     }

}
疑问:
如果==比较的是内存地址,很明显str1和str2的内存地址不一样
如果==比较的是内容,很明显比较二中的内容一致,
如果==比较的是hashcode,以上的hashcode都相等。

==到底判断的是什么?
分享到:
评论
4 楼 banfry 2010-05-28  
jxlanxin 写道
String在JAVA中是一个特殊的类,不知楼主当年学习JAVA基础的时候可知道“String池”一说?
简单的说,“==”比较的是内存地址应该是没有问题的。声明的String变量如果用等号“=”赋一个“字面量”(如 String str_1="abc"),则"abc"被放进JVM的字符串池中了,同样的,如果再声明一个String str_2="a"+"bc",依然是赋了一个字面量给str_2,对于字面量来说,"abc"与"a"+"bc"是完全相等的。
但是如果字符串是用new操作符实例化的,那就另当别论了,每个用new操作符实例化的对象,用“==”操作符来比较,应该都不相等的,不过我忘了JAVA是否有和C一样的操作符重载功能。

哦,明白了,谢谢
http://dev.firnow.com/course/3_program/java/javajs/20090909/174452.html
举例说明:
String string1 = "Too many";
String string2 = "cooks";
String string3="Too many cooks";

string1 +=string2;
string1 = string1.intern();

intern()方法将针对当前所存在的所有String对象测试String1所引用的字符串。如果该字符串已经存在,当前的
对象将被丢弃,而string1将包含封装着同样字符串的已有对象的引用。因此,表达式string1==string3的求
值结果是true;而不调用intern()的求值结果是false.
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20090909/174452.html
3 楼 jxlanxin 2010-05-28  
String在JAVA中是一个特殊的类,不知楼主当年学习JAVA基础的时候可知道“String池”一说?
简单的说,“==”比较的是内存地址应该是没有问题的。声明的String变量如果用等号“=”赋一个“字面量”(如 String str_1="abc"),则"abc"被放进JVM的字符串池中了,同样的,如果再声明一个String str_2="a"+"bc",依然是赋了一个字面量给str_2,对于字面量来说,"abc"与"a"+"bc"是完全相等的。
但是如果字符串是用new操作符实例化的,那就另当别论了,每个用new操作符实例化的对象,用“==”操作符来比较,应该都不相等的,不过我忘了JAVA是否有和C一样的操作符重载功能。
2 楼 banfry 2010-05-27  
coldfox 写道
疑问:
如果==比较的是内存地址,很明显str1和str2的内存地址不一样

怎么会不一样呢?都是字符串而且字符串的内容都一样的话在内存的地址是一样的。变量只是保存一个指向真实地址的指针而已

如果   String str2="ab";那我可以理解.
1 楼 coldfox 2010-05-27  
疑问:
如果==比较的是内存地址,很明显str1和str2的内存地址不一样

怎么会不一样呢?都是字符串而且字符串的内容都一样的话在内存的地址是一样的。变量只是保存一个指向真实地址的指针而已

相关推荐

    java的String用法类型总结

    ### Java的String用法类型总结 #### 一、概述 在Java编程语言中,`String` 类是最常用的数据类型之一,用于表示不可变的字符序列。由于字符串在实际开发中的重要性和高频使用特性,深入理解并掌握其用法至关重要。...

    C#获取U盘盘符、序列号的Windows服务并依据数库判断U盘合法性

    本文将深入探讨如何使用C#语言编写一个Windows服务,该服务能够获取U盘的盘符、序列号以及其他相关硬件信息,并基于数据库进行合法性判断。这在数据安全和设备管理方面具有重要意义。 首先,我们要了解C#如何获取...

    Java String对象使用方法详解

    String类重写了equals()方法,改变了这些类型对象相等的原则,即判断对象是否相等依据的原则为判断二者的内容是否相等。 现在,我们来了解String类的本质。String类的本质是字符数组char[],其次String类是final的...

    JS 判断undefined的实现代码

    在JavaScript编程语言中,正确地判断一个变量是否为`undefined`是至关重要的,尤其是在处理可能存在未定义值的场景。在给定的标题和描述中,我们关注的核心知识点是如何避免在检查`undefined`时误判,特别是区分`...

    判断一个字符串或字符串中的一个字符是否为数字类型

    在编程领域,判断一个字符串或字符串中的一个字符是否为数字类型是常见的...综上所述,判断字符串或字符是否为数字类型,可以依据具体编程语言选择合适的方法,同时要注意处理潜在的安全风险,确保程序的稳定性和效率。

    VC实现常见文件类型的判断

    在VC++(Visual C++)开发环境中,实现对常见文件类型的判断是一项常见的需求,这有助于程序根据文件扩展名或文件内容来执行特定的操作。本文将深入探讨如何在VC++中进行此类判断,主要关注文件扩展名的识别以及可能...

    用户状态判断

    用户状态判断是指在网站或应用中,系统依据用户的登录状态、权限等级、活动历史等数据来决定用户可以访问哪些功能或页面的过程。这不仅涉及到安全性和用户体验,还关系到资源分配和个性化服务的提供。 ### 实现方式...

    String类下compareTo()与compare()方法比较

    compareTo()方法的返回值是int类型,判断字符串大小的依据是根据它们在字典中的顺序决定的。如果参数字符串等于此字符串,则返回 0 值;如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值;如果按字典...

    服务器端判断Ajax请求

    这为服务器端提供了判断依据。 2. **`X-Requested-With`标头**:这是最常用的方法之一来识别一个请求是否由Ajax发起。 3. **其他HTTP请求头分析**:除了`X-Requested-With`外,还有其他请求头可以辅助判断。 4. **...

    java集合知识-map、set等

    建立对象判断是否相同的依据。 import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; public class HashSetTest { public static void main(String[] args) { HashSet hs =...

    java 字符串间的比较

    Java提供了多种方式来比较字符串,确保我们能精确地判断两个字符串是否相等或按某种顺序排列。下面将详细介绍Java中字符串的比较方法。 1. **`==` 操作符** 在Java中,基础数据类型如int、char可以直接使用`==`来...

    大小写金额转换-源码

    正确填写票据和结算凭证的基本规定 银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载账务的会计...

    Java判断IP地址为内网IP还是公网IP的方法

    总结来说,Java中判断IP地址为内网还是公网的方法主要是通过对IP地址的字节表示进行比较,依据TCP/IP协议中的私有IP地址范围来进行判断。这种方法适用于大部分情况,但在某些特定网络环境中,如使用特殊的私有网络...

    判断请求头中是否含有某属性来判断是否是ajax请求

    然而,因为这不是一个强制性的标准,所以它不应该作为唯一的判断依据。在实际开发中,可能需要结合其他逻辑来更准确地进行判断。同时,在前端代码中操作和检测HTTP请求头时,我们需要留意浏览器兼容性和安全性问题,...

    js用typeof方法判断undefined类型

    在JavaScript中,类型判断是一个基础且重要的...在实际应用中,开发者可以依据具体需求来决定使用`typeof`进行类型判断还是直接使用严格比较。不过,当涉及到未声明的变量时,应优先考虑使用`typeof`来避免运行时错误。

    Java的内存管理机制分析

    - 如:`String s1 = new String("abc");`,其中`"abc"`是字符串字面量,存储在常量池中;`new String("abc")`则是新创建的对象,存储在堆中,并且该对象引用指向常量池中的`"abc"`。 - 对于数组等复合类型,也通过...

    js chrome浏览器判断代码

    Chrome浏览器独有的特征可以提供更可靠的判断依据。例如,Chrome特有的全局对象window.google和window.chrome。通过检查这些对象是否存在以及它们的属性,可以进行更精确的判断。 ```javascript var isChrome = ...

    带农历的js日期显示(包含农历闰月)

    对于闰月的判断,库可能会依据特定的农历规则,比如润月通常是农历的正月、二月、五月、七月、八月、十月和腊月,但具体是否闰月还需要看阳历的年份。 为了实现这样的功能,开发者需要对农历和公历之间的关系有深入...

    用 Jsp 的 Session 机制编写的购物车程序.txt

    - **商品类实现**:该类实现了`Comparable`接口,通过重写`compareTo`方法实现了商品对象之间的比较,主要依据商品ID进行排序。 - **成员变量**:定义了商品的基本属性如ID、名称、价格和数量。 - **构造函数**:...

    源代码类型判断标准.docx

    该标准主要依据是源代码文件的后缀名以及源代码中的关键词出现次数。 判断源代码文件的类型条件主要有两个方面: 1. 文件后缀名:不同的源代码类型对应不同的文件后缀名,例如C语言的源代码文件通常以`.c`或`.h`...

Global site tag (gtag.js) - Google Analytics