为了账号安全,请及时绑定邮箱和手机立即绑定

equals()方法的问题

之前做过比较两个String类型的值时

比如:

String str1="你好";

String str2="你"+"好";

String str3="你";

String str4="好";

String str5=str3+str4;

System.out.println(str1.equals(str2));

System.out.println(str1.equals(str5));

为什么这两个句子返回的都是true啊,不是说好的比较地址的吗?有疑惑啊

正在回答

2 回答

子木李 说得对,楼主还可以尝试去建立一个类的两个实例,内部变量完全一样,但是你用equals去比较时,返回的是false,这就会验证你理解中的两个对象使用 equals 是进行地址比较;但是你会发现两个String,哪怕是通过new String()得到的(理论上是两个对象),你会发现执行 equals 操作会获得 true, 这是因为java字符池机制的作用,关于这个可以推荐楼主看下 “JAVA 字符池”,这个应该可以帮到楼主;

另外补充一些我知道的相关的一知半解:String对象是不可改变的,比如说String str1 = new String("hello"); 然后你让 str1 = "java"; 你会发现str1只是改变了自身引用,对其之前的内容 “hello” 串并不会有改变;


0 回复 有任何疑惑可以回复我~

string类型的equals方法的规则是这样的:如果两个对象的类型一致,并且内容一致,则返回true,楼主理解的比较地址也是正确的,不过java的String类的机制是:对于String实例,运行时状态会尽可能地确保任意两个具有相同字符信息的String字面值指向同一个内部对象,即是如果字面值一样,那么它们其实是同一个地址,所以,返回的是true,str1、str2、str5都是“你好”

0 回复 有任何疑惑可以回复我~
#1

子木李

补充一点,因为楼主是使用""来创造一个字符串变量的,所以当字面量一样,虽然是不同的变量,但指向的是同一个地址,如果是使用new String来创建字符串变量,则即使字面量一样,地址也是不一样的,这个时候equals方法,返回的依然是true,原理之前说过了,而 == 则返回是false,因为地址不一样
2015-10-22 回复 有任何疑惑可以回复我~
#2

羽丶 回复 子木李

Dog dog1=new Dog(); dog1.age="15"; Dog dog2=new Dog(); dog2.age="15"; 然后使用 dog1.equals(dog2) ,返回值是 false ,这两个对象类型一致,内容也一致,为什么返回false ? 想不明白,想请教一下。
2015-11-10 回复 有任何疑惑可以回复我~
#3

子木李 回复 羽丶

dog1和dog2是两个不同的对象,他们的内容是不一致的,内容是指针,指向存储这两个对象的内存区域。详细一点说,就是,equals是适合string用的方法,而不是其他的对象,如果是其他对象类型的话,那么它会首先调用对象的toString方法,将对象转为字符串,而你的dog对象转为字符串的话,是Dog@后面跟内存地址,所以,是不一样的,如果楼主想使用equals的话,那么,就在dog类中重写equals方法,然后判断age是否相等。大概就是这个意思
2015-11-10 回复 有任何疑惑可以回复我~
#4

羽丶 回复 子木李

恩,谢了!
2015-11-10 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消
Java入门第二季 升级版
  • 参与学习       529997    人
  • 解答问题       6086    个

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

进入课程

equals()方法的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信