大家请看如下代码:
String s1 = "hello";
System.out.println(s1.hashCode());
s1+="world";
System.out.println(s1.hashCode());
String s2 = "helloworld";
System.out.println(s2.hashCode());
System.out.println(s1==s2);运行结果为:
99162322
-1524582912
-1524582912
false谁能给我解释下为什么
String s1 = "hello";
System.out.println(s1.hashCode());
s1+="world";
System.out.println(s1.hashCode());
String s2 = "helloworld";
System.out.println(s2.hashCode());
System.out.println(s1==s2);运行结果为:
99162322
-1524582912
-1524582912
false谁能给我解释下为什么
解决方案 »
- 求一正则表达式,崩溃中。。。
- 怎么把JTABLE中的更新数据 保存到数据库相应的表中,急!!
- 一个很简单的问题
- 一个窗体的问题
- 新手!!!vm问题!!!
- 我的Applet程序为何在网页上显示不出来了?求解!我电脑上是装了虚拟机的.
- java能否对并口操作?
- 在struts中,怎么给form 的 text赋值,急,在线等待!!!
- (着急啊)哪儿有BAS4.5下载??
- 不好意思:我下载个jbuilder6.bin文件,600多M,下完了。。。是不是Jbuilder6的安装程序?怎么打开呀?
- 怎么在java控制台中打印出byte数组的数据及中文怎么处理 ?
- 集合里面几个类的区别 、 受检异常和非受检异常的划分
道理楼上基本上说了
如果2个对象equals相等的话,hashcode是要求相等的
一般网上面试题大把的==和equals和hasCode等的关系,这个问题应该很多人懂。达不到变态的标准。
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count; for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
hashcode源码,应该是内容一样,hashcode就一样。public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}equals源码,比较的也是内容。可以看到,第一句就是比较引用。
结论:
if str1 == str2 then str1.equals(str2);
反之不成立。
if str1.equals(str2) then str1.hashCode() == str2.hashCode();
反之也成立。当然,你可以自己重写Object对象的hashCode方法和equals方法,强制返回false也是可以的。
如果2个对象==,则他们一定equals,hashCode一定相等吗?本版版主给的变态实现。
问:两个对象equals返回true,那么他们的hashCode相等吗?答:天晓得,遇到不守规矩的程序员鬼才有办法!!
int b=5;
a等于b:只比较他们的值//int是内置数据类型String c="你好";//类名 对象名=new 类名();
String d="你好";
c不等于d:c和d是两个对象,他们的内存地址肯定是不一样的!boolean flag=c.equals(d);//true,这里只比较值int和Integer
boolean和Boolean
是不一样的。注意内置数据类型和类的区别!
那么你的 String s3="helloworld" ;也就是相当 String s3= new String("helloworld");那么s1能和s3相等不?
String s2 = "abc";
这样s1==s2是因为这种方式string都取自string pool+=操作后,不管最后内容是否相同,相当于StringBuilder的append,保存的是新对象(堆上的),地址不同,intern后再看是不是true至于hashcode,equals为true hashCode须相等,String的equals方法是重写了的,比较的是内容
所有方法返回的字符串都是在堆内存中创建的字符串,同样,String s2 = "helloworld";
此时不负责检查维护缓冲池,所以内存地址并不一样。自然==就是false
1号: 82085373
2号: 55191814
3号: 89238748
4号: 56418364
5号: 157181129
6号: 74671714请勿重复加群......
equals是先判断两个对象是不是同一个对象,是的话返回true,否则再比较两者的hashcode
public class TestCsdn1 {
public static void main(String[] args){
String s1 = "helloworld";
System.out.println(s1.hashCode());//-1524582912 String s2 = "helloworld";
System.out.println(s2.hashCode());//-1524582912 System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
String s3 = new String("helloworld");
System.out.println(s1==s3);//false
System.out.println(s1.equals(s3));//true }
}如果两个对象的内容相同,hashcode的值也是相同的,equals的值也是相同的。
==比较的是地址。这里又分两种情况:
1.如果你没有new关键字,s2默认的是从缓冲池中寻找有没有helloword字符串,如果有,则将s1的地址赋给s2,此时s1==s2结果为true。
2.如果你用了new关键字,比如s3,系统为s3重新分配地址。而不是从缓冲池中寻找。s1==s3的结果为false。
注意是值的比较还是对象的比较,特别注意String是个意外。
还有s1+="world"生成的对象相当于new生成的,所以是一个新对象,而下面的s2是双引号生成的对象,所以两个对象不是一个,直接写==的话 当然就为false了
hello 是在常量池存放
s1+=“world”;后 helloworld是在 一个缓冲区内 是stringBuffer的对象 所以内存地址不一样。
== 自然为false