`
banfry
  • 浏览: 7347 次
  • 性别: 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的内存地址不一样

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

相关推荐

    JS 判断undefined的实现代码

    以下是不正确的用法: 代码如下:var exp = undefined; if (exp == undefined) { alert(“undefined”)... } typeof 返回的是字符串,有六种可能:”number”、”string”、”boolean”、”object”、”func

    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 =...

    大小写金额转换-源码

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

    一些C面试题,希望能对大家有帮助

    10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间...

    UIWebView的使用代码

    脚本的代码内容还要依据具体的应用场景。此外,该方法规定执行的脚本时长限定在10s内,为的是防止过长时间的阻塞页面主线程,超过执行时间上线会自动停止脚本运行,并且脚本可分配内存限定在10MB内,超过分配上线将...

    整理后java开发全套达内学习笔记(含练习)

    public static void main(String[] args){ System.out.println("请输入一列文字,包括空格:"); BufferedReader s = new BufferedReader(new InputStreamReader(System.in)); String next; try{next = s....

    leetcode双人赛-MyLeetCode:我的LeetCode

    leetcode双人赛 LeetCode 刷题笔记 1. 数据结构 1.1 数组 使用的时候 +1 的确认比较麻烦;...string find()、substr()的使用,合理使用string...这边快慢指针是fast->next和fast->next->next做判单依据 链表反转 1.4 栈

    java常用工具类的使用

    Q 老师,时间毫秒值从1970年1月1日0:00.000开始计算,上面示例中10年后应该是1980年1月1日0:00.000,为什么输出结果是:1980年1月1日 8:00呢? A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,...

    操作系统实验银行家算法VC++源代码

    4.编制程序,依据银行家算法,决定其申请是否得到满足。 3. 实验说明 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N...

    实现一个圆类

    (6) 提供一个判断当前圆对象与参数圆对象的大小关系的方法(判断依据是半径,半径之差的绝对值小于0.0001认为相等;返回负数表示当前圆对象小,0表示相等,正数表示当前圆对象) int compareTo(Circle another) (7)...

    基于索引表的图像细化程序有详细注解

    #include <string.h> //基于索引表的细化细化算法 //功能:对图象进行细化 //参数:lpDIBBits:代表图象的一维数组 // lWidth:图象高度 // lHeight:图象宽度 // 代表图象的一维数组 图象宽度 图象高度 bool ...

    c#多线程抓取网页内容

    如果不成功,内容列仍为空,作为是否再次下载的依据之一,如果反复不成功,则进程将于达到重试次数(对应该地址被申请的次数,用户可设)后,申请下一个Url地址。主要的代码如下(以VFP为例): <建立表> CREATE ...

    自动打印机

    机械产品的设计是对产品的功能、工作原理、系统运动方案、机构的运动与动力设计、机构的结构尺寸、力和能量的传递方式、各个零件的材料和形状尺寸、润滑方法等...,并将其转化为具体的描述以作为制造依据的工作过程...

    SwipeDragTreeRecyclerView-可滑动和拖拽的树形结构RecyclerView.zip

    item 的类别,依据类别判断 holder 绑定的数据类型,然后调用 holder 的 getView 方法获取 view 实例进行数据绑定public class TestBaseSwipeDragTreeAdapter extends BaseSwipeDragTreeAdapter {  private ...

    redis-3.2.0-win64

    TYPE key 返回某个key元素的数据类型 ( none:不存在,string:字符,list,set,zset,hash) KEYS pattern 返回匹配的key列表 (KEYS foo*:查找foo开头的keys) RANDOMKEY 随机获得一个已经存在的key,如果当前数据库为空...

    JAVA上百实例源码以及开源项目

    百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景... String serverAddr=jtfServer.getText();...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    Android图片三级缓存策略(网络、本地、内存缓存)

    通常情况下,Android应用程序中图片的缓存策略采用“内存-本地-网络”三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否...

    asp.net知识库

    如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/...

Global site tag (gtag.js) - Google Analytics