日期:2014-05-20  浏览次数:20775 次

请教!关于java堆栈和数据存储的问题?

我知道JAVA中基本数据类型直接放在栈中,而用new关键字产生的对象的值放在堆中,栈中放一份此对象堆中地址的引用。


我现在有一点不明白,看如下java代码:

int i=10;
int j=10;
System.out.print(i==j);

不用说,上面的输入出是:true;

问题是:上面声明了两个变量,都给了初始值,栈应该为它们分配两个地址才对啊?
  i==j 只有在引用同一个栈地址时,才会返回true;这是为什么?还是栈有其它的处理方式?

请各位高手赐教!!!




------解决方案--------------------
equals 方法是object类的方法 默认也是比较引用的
只不过大多数类都重写了object类的equals方法 和hashcode 所以成了比较具体的值了
比如String a=new String("aaa"); String b=new String("aaa");
a.equals(b);///true

如果是你自己写的类没有重写equals方法 那它也是比较引用的! 
比如:

public class Untitled1 {
public static void main(String[] args) {
A a=new A();
A b=new A();

System.out.println(a.equals(b));
}
}

class A{
String str="aaaa";

}

类A继承自object 并用它声明了两个对象。 用a 和 b指向这两个对象 然后调用equals方法比较 
虽然两个对象的str值是相等的 。 不过结果还是false; 因为object类equals方法默认是比较引用 显然a和b指向的两个不同的对象。所以false;
这时 如果改一下代码

public class Untitled1 {
public static void main(String[] args) {
A a=new A();
A b=new A();

System.out.println(a.equals(b));
}
}

class A{
String str="aaaa";

public boolean equals(A a)
{
if (a.str.equals(this.str))
{
return true;
}

return false;
}
}

重写了equals方法 这时返回的就是true 当然 我这里是为了省事。。 更标准的应该再重写hashcode方法


== 用于对象之间的比较时 比较的是引用。 就是比较操作符两边是不是同一个对象
比如:Date date=new Date();
Date date2=new Date();
date==date2; ///false

== 用在基本数据类型之间的时候 比的是值 。 基本数据类型并不是对象。