论坛首页 Java企业应用论坛

这些题你做对了几道?

浏览 17687 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-12-16  
mercyblitz 写道
chenyongxin 写道
hobitton 写道
mercyblitz 写道

 

我这么问是有道理的,不是规定的问题。

 

equals实现建议中,hashCode不等的话,那么直接reutrn false.

 

你也可以想想为什么?

 

貌似object的equals方法注释写的不是这个意思?

 

 写道
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

 当equals方法被覆写了的时候,一般需要修改hashcode方法,以维持hashcode的规定:相等对象的hashcode必须相同。

 

是equals影响hashcode而不是hashcode影响equals?


正理!

 


扯到另外一个话题去了,

 

你没有明白我的意思,我说的是equals相等话,hashCode必须相等,相反,如果hashCode不等的话,equals一定不等。

 

。。。

 

因为SUN JDK中String的hashCode的实现不靠谱,hashCode可能会出现重复。

 

所以equals里面没有对比hashCode,这是有道理的。

 

至于IBM的,也没有错,因为hashCode不等的话,在逻辑上证明不是一个对象。

 

再次强调一次,equals的比较时,可以通过比较hashCode不等来判断equals的相等性,hashCode相等不能说明问题!

 

 

囧,兄弟逻辑混乱啊

 写道
你没有明白我的意思,我说的是equals相等话,hashCode必须相等,相反,如果hashCode不等的话,equals一定不等。
 

equals相等的话,hashcode必须相等,相反,如果hashcode相等的话,equals不一定相等。没有规范要求hashcode和equals保持同步。

所以之前说equals里面怎么实现没有必要看hashcode的脸色,sun jdk的hashcode没有什么不靠谱吧?

不过这确实扯远了。

0 请登录后投票
   发表时间:2010-12-16  
manming 写道
String包含几种不同的创建方式,并且不同的创建方式都会将String存到入不同的区域内,例如:String池 或者 java堆中。其中有一些原理,只要懂这些原理。以上的问题都不是问题。
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。

       原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。

       原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。

       原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。



首先谢谢分享!
有两点点不是很明白:
1.题目中的==判断,创建的字符串是因为区域(String池,堆栈)的不同判别真假的吗?
2.根据原理,某个字符串会同时出现在String池和java堆中,如第2个题中,a在String池中,c在String池和java堆都有,这样的话==操作,变量是哪个区域的呢?
0 请登录后投票
   发表时间:2010-12-16  
hobitton 写道
mercyblitz 写道
chenyongxin 写道
hobitton 写道
mercyblitz 写道

 

我这么问是有道理的,不是规定的问题。

 

equals实现建议中,hashCode不等的话,那么直接reutrn false.

 

你也可以想想为什么?

 

貌似object的equals方法注释写的不是这个意思?

 

 写道
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

 当equals方法被覆写了的时候,一般需要修改hashcode方法,以维持hashcode的规定:相等对象的hashcode必须相同。

 

是equals影响hashcode而不是hashcode影响equals?


正理!

 


扯到另外一个话题去了,

 

你没有明白我的意思,我说的是equals相等话,hashCode必须相等,相反,如果hashCode不等的话,equals一定不等。

 

。。。

 

因为SUN JDK中String的hashCode的实现不靠谱,hashCode可能会出现重复。

 

所以equals里面没有对比hashCode,这是有道理的。

 

至于IBM的,也没有错,因为hashCode不等的话,在逻辑上证明不是一个对象。

 

再次强调一次,equals的比较时,可以通过比较hashCode不等来判断equals的相等性,hashCode相等不能说明问题!

 

 

囧,兄弟逻辑混乱啊

 

 写道
你没有明白我的意思,我说的是equals相等话,hashCode必须相等,相反,如果hashCode不等的话,equals一定不等。
 

equals相等的话,hashcode必须相等,相反,如果hashcode相等的话,equals不一定相等。没有规范要求hashcode和equals保持同步。

所以之前说equals里面怎么实现没有必要看hashcode的脸色,sun jdk的hashcode没有什么不靠谱吧?

不过这确实扯远了。

 

 

再说一次,如果equals方法比较时,hashode相等没有意义,不相等才有意义,说明not equal。

 

 

hobitton 写道
所以之前说equals里面怎么实现没有必要看hashcode的脸色
 

看清楚,是建议~,不是必须~~~

 

晕了!

 

0 请登录后投票
   发表时间:2010-12-16   最后修改:2010-12-16
常量会在编译的时候处理掉
0 请登录后投票
   发表时间:2010-12-16  
manming 写道
String包含几种不同的创建方式,并且不同的创建方式都会将String存到入不同的区域内,例如:String池 或者 java堆中。其中有一些原理,只要懂这些原理。以上的问题都不是问题。
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。

       原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。

       原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。

       原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。


常量之间运算,在编译的时候就优化处理掉了
0 请登录后投票
   发表时间:2010-12-16   最后修改:2010-12-16
chenyongxin 写道
lazybird86 写道
mercyblitz 写道
chenyongxin 写道

1.true or false?

 

		String a = "ab";
		String b = "a" + "b";
		System.out.println(a==b);

 2.true or false?

 

		String a = "abc";
		String b="ab";
		String c=b+"c";
		System.out.println(a==c);

 

 3.true or false? 

 

		String a = "ab1";
		String b = "ab"+1;
		System.out.println(a==b);

 4.ture or false?

 

		String a = "ab1";
		String b = "ab"+1;
		String c = b + "";
		System.out.println(a==c);

 

 5.true or false?   false

 

		String a = new String("abc");
		String b = "abc";
		System.out.println(a==b);

 6.true or false?  true

 

		String a = "abc";
		String b = "abc";
		System.out.println(a==b);

 

 

 

 

楼主,问你个问题,

 

为什么String的equals方法,没有hashCode方法做判断?

 

 

有意思啊。。。

因为不需要嘛

因为是进行内容比较而不是地址比较

既然大家扯远了,我也扯扯。。。

之前说不需要,是因为String的equals方法里是比较两个String里的每个字符是不是相等(==),而String的hashCode里根据每个字符来计算的,这样看来,equals比较每个字符都相等就行了,就不必去使用hashCode判断了(每个字符都相等,按照里面的逻辑计算出来的hashCode肯定相等)。注意:这里指sun的jdk,当然其他jdk可能有不一样的逻辑保证两个String相等。

另外,实现equals方法需要注意两个相等的对象的hashcode要相等。这也是mercyblitz 说的要hashCode方法判断。

这跟对象地址没关系,有关系也是当对象存在hash容器里的时候。

 

0 请登录后投票
   发表时间:2010-12-16  
我觉得面试出这种题目无可厚非。如果脱离编译器就发现不了一些简单的错误,解决不了基础问题,那么实际工作中有了编译器和IDE也未必能解决复杂问题。

面试的时候,考的不仅是基础,也是分析能力。
0 请登录后投票
   发表时间:2010-12-16  
javarubypython 写道
我觉得面试出这种题目无可厚非。如果脱离编译器就发现不了一些简单的错误,解决不了基础问题,那么实际工作中有了编译器和IDE也未必能解决复杂问题。

面试的时候,考的不仅是基础,也是分析能力。


拿==比较字符串的,放我这要扣他工资
0 请登录后投票
   发表时间:2010-12-16  
令人蛋疼的测试,如果涉及到性能还要关心一下。
但是这个就是无聊了,==本就少用。string的==
0 请登录后投票
   发表时间:2010-12-16  
实际写代码遇到字符串比较都会使用equal()避免不必要的疏忽。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics