题目一:下面一段代码的运行结果:
public static void main(String[] args) {
int num = 0;
int count = 0;
for (int i = 0; i <=100; i++) {
num = num + i;
count = count++;
}
System.out.println(num * count);
}
答案解析:count = count++;的意思是先将count初始化的值0暂时缓存起来,然后执行count自加1变成1,最后将暂存的值0再赋值给count,整个循环过程中count都为0.
第二题:下面论述正确的是()?
如果两个对象的hashcode相同,那么它们作为同一个HashMap的key时,必然返回同样的值
如果a,b的hashcode相同,那么a.equals(b)必须返回true
对于一个类,其所有对象的hashcode必须不同
如果a.equals(b)返回true,那么a,b两个对象的hashcode必须相同
答案解析:本题主要考查Java中的“==”,equals()和hashcode之间的区别,详细参考:
http://blog.csdn.net/tiantiandjava/article/details/46988461
在java中:
==是运算符,用于比较两个变量的值是否相等;
equals()是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的equals方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
hashCode也是Object类的一个方法。返回一个离散的int型整数。在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等)
java中的数据类型,可分为两类:
基本数据类型:byte,short,char,int,long,float,double,boolean 它们之间使用“==”比较时,比的是两个变量的值;
复合数据类型(类):使用“==”比较时,比的是在内存中的存放地址。Java中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址。Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。如果两个对象根equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果。从而在集合操作的时候有如下规则:将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
hashcode和equals的约定关系如下:1、如果两个对象相等,那么他们一定有相同的哈希值(hash code)。2、如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等。(需要再通过equals来判断)。
第三题:执行如下程序,输出结果是( )
class Test
{
private int data;
int result = 0;
public void m()
{
result += 2;
data += 2;
System.out.print(result + " " + data);
}
}
class ThreadExample extends Thread
{
private Test mv;
public ThreadExample(Test mv)
{
this.mv = mv;
}