`
jiangxiabeijing
  • 浏览: 27055 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过一个小例子引发的string对象对于“==”的问题

 
阅读更多



这个例子是我郁闷了一会,首先我们知道==是用来判断对象的内存地址的,那么我们根据以上的图,来看一下有什么问题

1.str1和str3,他们是两个对象,也就是说他们的内存地址是不同的,那为什么用==的时候结果会是true?

2.我们来对照str1,str2和str4,str5,new String("welcome")和"welcome"是同一个意思,都是new了一个新的string对象,然后将这个对象赋予给声明的对象,那么为什么str1 ==str2是false,而str4==str5是true?

结合以上问题,再加上和大神们的激烈探讨,我终于明白了。

1.string的赋值如果是直接“welcome”这种形式的话,那么,java会想去内存中查看有无类似的值,如果已存在,那么就将该值的引用赋予string对象,这也就是强大的享元模式,我只知道java中对于基本类型有享元模式,没想到对于引用类型也会有。

2.new String 和 “” 本来都是创建新的对象,但是为什么只有“”使用了享元模式呢,我们可以这么来想一下,new String其实可以看成是一个强硬的手段,他强迫你必须给我创建新的对象,而“”就比较温柔,他想帮你去找是否有相同的值,然后在进行下面的操作。

3.通过以上的认识,我明白了一个事情,那就是==其实是判断引用类型的内存地址,在以往的教学资料中,撑说==是来判断对象的内存地址,但是到底是谁的内存地址,是声明的对象,还是引用对象,没有给出答案,通过这次的探讨。我终于明白了,==是来判断引用对象的内存地址。


以上是我对于这个问题的想法思路和探讨结果,希望对各位有帮助,如果又补充欢迎留言。

分享到:
评论

相关推荐

    在一小时内学会 C#(txt版本)

    默认情况下存在一个全局命名空间,所以在命名空间外定义的类直接进到此全局命名空间中,因而你可以不用定界符访问此类。 你同样可以定义嵌套命名空间。 Using #include 指示符被后跟命名空间名的 using 关键字代替...

    freemarker总结

    上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: item_index:...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最熟悉的陌生人:main()方法 229 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最熟悉的陌生人:main()方法 229 ...

    C++MFC教程

    4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会...

    c#学习笔记.txt

    委托是一个数据结构,该数据结构引用一个静态方法,或引用一个对象实例和该对象的实例方法。在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种...

    orange-dragonfly-validator:输入参数验证库

    一个简单的例子,解释了这个想法 const validate = require ( "orange-dragonfly-validator" )const rules = { "name" : { "type" : "string" , "pattern" : / ^ [ A-Z ] ( [ a-z ] + ) $ / } , "position" : { ...

    Visual.Basic.6大学教程.pdf

    6.12 另一个递归例子:Fibonacci序列 160 6.13 递归与迭代 162 6.14 可选参数 163 6.15 命名参数 164 6.16 Visual Baisc 数学函数 166 6.17 代码模块 167 小结 169 自测练习 171 自测练习答案 173 练习 174 第7章 ...

    亮剑.NET深入体验与实战精要2

    读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例...

    亮剑.NET深入体验与实战精要3

    读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例...

    javaSE代码实例

    1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    5.7.5 构造器链:使用this调用另一个构造器 168 5.8 静态成员 172 5.8.1 静态字段 172 5.8.2 静态方法 174 5.8.3 静态构造器 175 5.8.4 静态属性 176 5.8.5 静态类 177 5.9 扩展方法 ...

Global site tag (gtag.js) - Google Analytics