社区
Java SE
帖子详情
java == 的问题,看上去简单
sswt
2006-02-15 04:15:07
String a = "ab";
String c = "a";
String d = "b";
System.out.println(a==(c+d));
System.out.println(a==("a"+"b"));
结果是 false true
为什么?
...全文
266
18
打赏
收藏
java == 的问题,看上去简单
String a = "ab"; String c = "a"; String d = "b"; System.out.println(a==(c+d)); System.out.println(a==("a"+"b")); 结果是 false true 为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
usaspy
2006-02-16
打赏
举报
回复
Java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。
所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息
zx2002027
2006-02-16
打赏
举报
回复
c+d后的值存入了一个临时变量,该变量地址和a不同
“a”+“b”相当与“ab”,虚拟机会在常量池中查找“ab”,如果匹配则临时分配一变量指向该入口,那么地址就和a一样了
不知道这样理解对不对
水晶平衡木
2006-02-16
打赏
举报
回复
usaspy(行走的鱼) 贴的对,补充点简单说明如下:
Java中处理String常量的方式是使用的享元模式,就是每生成一个新的常量String都会先检查这个常量的String是否已经在内存中存在,如果有,则直接返回这个常量String的地址。
但是处理变量的默认方式就不同,两个String变量相加总是生成的一个新的String,相当于new了一个新的String。
所以,两个变量相加得到的是一个新建的String,而两个常量相加得到的却是已有的那个常量的地址了。
zjm66688
2006-02-15
打赏
举报
回复
== 比较的是内存地址
treeroot
2006-02-15
打赏
举报
回复
这种方式和编译器有关
"a"+"b" 被编译时处理为"ab"
但是c+d是运行时处理的(因为是变量)
vvpang
2006-02-15
打赏
举报
回复
== 比较的是类的相同。
同意 polarman(北极人) 的意见
sswt
2006-02-15
打赏
举报
回复
'=='比较的是内存地址,不是值
----------------------------------------
这个我明白。
为什么"ab" 和 "a" + "b" 的地址相同
而和 c + d 的地址不同呢?
mlyb
2006-02-15
打赏
举报
回复
'=='比较的是内存地址,不是值
sswt
2006-02-15
打赏
举报
回复
使用a.equals()
-------------------------
我是问为什么会处先这种情况,不是说不知道用a.equals()这个比较。
这里跟equals()没有关系
sswt
2006-02-15
打赏
举报
回复
感觉说的不清楚啊,加油,等待中。
问题的关键是 c + d的时候做了什么?
String a = "ab";
String c = "a";
String d = "b";
String e = "a"+"b";
System.out.println((c+d).hashCode());
System.out.println(("a"+"b").hashCode());
System.out.println("ab".hashCode());
System.out.println(a.hashCode());
hashCode是这个对象的唯一标示,==的判断是根据引用的地址,可否简单的理解成hashCode的值?
Paripatetic
2006-02-15
打赏
举报
回复
==是判断两个是否为同一个对象实例的两个副本
若要判断内容相同用a.equals(b)
yonghar
2006-02-15
打赏
举报
回复
使用a.equals()....
==是判断两个是否为同一个对象实例。
gifted1982
2006-02-15
打赏
举报
回复
'=='比较的是内存地址,不是值
String a = "ab";
String c = "a";
String d = "b";
分别在内存中创建了三个对象,占用了不同的地址,比较址可以用c.equals(c+d);
tiky_6228769
2006-02-15
打赏
举报
回复
这答案在“JAVA编程思想”里有
polarman
2006-02-15
打赏
举报
回复
"ab"这个字符串常量只会分配一次内存,"a"+"b"等同与"ab"
对于对象类型,==比较的是内存地址
chg2008
2006-02-15
打赏
举报
回复
有意思,如何解释呢?
sswt
2006-02-15
打赏
举报
回复
顶一个
renkunpong
2006-02-15
打赏
举报
回复
mark~
Java
学习指南(
Java
入门与进阶)
这是
Java
学习指南系列课程的第1篇,介绍
Java
语言的入门语法,引领希望学习
Java
语言编程的初学者进入
Java
大门。 本课程不需要其他语言作为基础,可以直接学习。 课程从
Java
开发平台的下载和安装开始,从浅到深、从...
Java
中==和equals()的区别【详解】
一、
Java
中==和equals()的区别 1、前述 2、数据到底存在哪 在方法中声明的变量: 在类中声明的变量: 3、“==”与equals() 相同点: 不同点: Object类中的equals(): 4、String类的equals() 源代码及解析...
Java
中Integer使用==时遇到的
问题
及包装类
1,
问题
说明 public class Test { public static void main(String[] args) { Integer n1 = 127; Integer n2 = 127; System.out.println(n1 == n2);//输出结果为true Integer n3 = 128; Integer n4 = 128; ...
Java
简易聊天室YYchat
虽说如此,但还是在辣鸡学校的水比老师的示例的基础上作了些更改,完成了
Java
简易聊天室的项目。项目全部文件(包括素材和源码)已上传到github上:https://github.com/Okami888/
Java
-YYchat,欢迎克隆、交流学习。 ...
Linux
JAVA
_HOME=/usr/
java
/jdk/1.8.0_40: 没有那个文件或目录
我们
看上去
配置
Java
没有
问题
,其实可能是因为我们偷懒不愿意一个个输入,所以在从外面粘贴过来是可能会出现字符紊乱,这些可能你看不出来,但是系统能检测到。解决
问题
也很
简单
,你可以把之前的删除掉,从新从别的...
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章