您的位置:程序门 -> java -> j2se / 基础类



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教!关于java堆栈和数据存储的问题?
发表于:2007-09-30 18:51:47 楼主

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


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

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

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

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

请各位高手赐教!!!


发表于:2007-09-30 18:57:291楼 得分:0
==   在用于两个对象的时候才会比较引用
如果是基本数据类型     比较的就是值。   所以返回true
发表于:2007-09-30 19:03:252楼 得分:0
同意楼上的说法!==对于基本数据类型,比较的是值.
发表于:2007-09-30 19:25:183楼 得分:0
那如果是两个object对象呢?

string   s1=new   string(“jdk1.2”);
string   s2=new   string(“jdk1.2”);

sysout.out.print(s1==s2);


这个时候用==比较的是堆还是栈里的值?
发表于:2007-09-30 19:37:184楼 得分:0
我现在有一点不明白,看如下java代码:  

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

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

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

请各位高手赐教!!!  

///////////
这是因为对原始类型的数据比较的时候   比较的是他的值而不是地址


那如果是两个object对象呢?  

string   s1=new   string(“jdk1.2”);  
string   s2=new   string(“jdk1.2”);  

sysout.out.print(s1==s2);  
这个时候用==比较的是堆还是栈里的值?  
////////
而对对象使用==比较的是引用,所以这里答案是false


string   s1=(“jdk1.2”);  
string   s2=(“jdk1.2”);  

sysout.out.print(s1==s2);  
/////////
这个答案是true
而这个例子告诉我们   s1   s2是指向同1引用

这是因为jvm提供了一个空间,可称之为   字符串标准引用区
又编译器直接赋值的都指向   字符串标准引用区


string   s1=new   string(“jdk1.2”);  
string   s2=new   string(“jdk1.2”);  

sysout.out.print(s1.intern()==s2.intern());  
//////////////
这个答案是true

因为intern()返回的是字符串标准引用区

你可以参考下string.intern()方法


lz这下了解了么?
发表于:2007-09-30 20:10:075楼 得分:0
那如果是两个object对象呢?  

string   s1=new   string(“jdk1.2”);  
string   s2=new   string(“jdk1.2”);  

sysout.out.print(s1==s2);  
这个时候用==比较的是堆还是栈里的值?  
////////
而对对象使用==比较的是引用,所以这里答案是false  
-------------------------------------------------

你说的引用是指栈里的引用吗?
发表于:2007-09-30 20:19:026楼 得分:0
堆里的引用
发表于:2007-09-30 20:22:097楼 得分:0
处理器实际运算的时候自然将这个值(在堆里的引用)推入栈内

无论什么运算都一样,数据都经过栈进入寄存器的
发表于:2007-09-30 20:24:118楼 得分:0
说得都乱了
一个是jvm的堆栈
一个是实际处理器的堆栈
发表于:2007-09-30 20:34:269楼 得分:0
你都乱了!就不要说我了,干脆这样,你就说说原问题吧,“说说==与equals()方法的区别。”

给个详细的解释!         谢谢!
发表于:2007-09-30 21:53:5210楼 得分:0
只要是   用   关键字   new   出来的都是对象,对象是在堆中.
                                                      对象就是一小快内存   指向   一大快内存
比如   string   s0   =   new   string("abc");
          其实是   s0   =   对象在堆内存的的地址;
        string   s1   =   new   string("abc");
                        s1   =   对象在堆内存的的地址;

每个new出来的对象的内存的地址是不一样的...

==   :   是比较2个值,所以s0==s1比较的是  
                                        s0对象在堆内存的地址   是不是等于   s1对象在堆内存的地址
所以是false

equals():是所有类的祖先object的一个空实现方法,string类继承了他,并重写了equals()方法让equals()去比较string类对象的内容,所以,我们调用的时候是比较的是s0和s1中的内容(堆内存中存放的数据)

你可以看   api   string类   的   equals()方法.
发表于:2007-09-30 22:29:5511楼 得分:0
你的意思是:   ==   在比较对象的时候是拿它们在堆中的地址进行比较,比较基本类型就是拿它们在栈中的值来比较;          
                                  对吗?


你说的是string里的equals()方法,这个方法是重写了object的equals()方法,所以是比较的是堆中存放的数据。

但object   里的equals()方法又和"=="有什么异同呢?

                 
发表于:2007-09-30 22:36:5712楼 得分:0
object这个超类里的equals方法直接是返回a==b的结果的.即它直接用==比较两个变量.
而string类则覆盖了object里边这个方法,它是比较两个string的具体内容是否一致的..
其实==在比较基本数据类型的时候直接比较两个数值是否相等.而对于对象之间的比较,==则是
比较这2个是否指向同一个在堆中的数据
发表于:2007-09-30 22:51:5713楼 得分:0
我这样理解不知道对不对!请各位大虾们赐教!!

==   在比较时   都是拿比较双方在栈中的值。
           
            基本类型就在栈中,所以比较取的就是它在栈中的值。

          new   出来的的对象类型的值存放在堆中,在栈中存有一个此对象在堆中的引用,在程序操作的时候都是在
          使用栈中的引用。所以比较时会取得它在栈中的引用的值。所以会将堆中的值压进栈中进行比较。

发表于:2007-09-30 22:57:2414楼 得分:0
引用类型里面存放的是什么?
是他所指向的对象的地址。
那地址是什么?
不也是值吗?

==这东西哪有那么智能
他就是看左右这两个东西一不一样。

局部变量
int   i=10;  
int   j=10;
这个i,j两个名字是给程序员编程用的,
虚拟机用不着,也根本看不到。
i==j在虚拟机看到不过是位置1放个10,位置2放个10,把两个10拿出来看看一不一样

string   s1=new   string(“jdk1.2”);    
string   s2=new   string(“jdk1.2”);    
和上面是一样的,s1==s2在虚拟机看来不过是s1放个地址,s2放个地址,把两个地址拿出来看看一不一样
发表于:2007-09-30 23:00:5715楼 得分:0
打错了:
“和上面是一样的,s1==s2在虚拟机看来不过是s1放个地址,s2放个地址,把两个地址拿出来看看一不一样”
和上面是一样的,s1==s2在虚拟机看来不过是位置1放个地址,位置2放个地址,把两个地址拿出来看看一不一样
发表于:2007-09-30 23:10:4616楼 得分:0
那也就是只操作栈中的值,       没有把堆拉进来了?
发表于:2007-09-30 23:15:3417楼 得分:0
int   i=10;  
int   j=10;
这两个10都是放在栈里面的
发表于:2007-09-30 23:20:1618楼 得分:0
基本类型是在栈里面的。

现在是对象类型,它在比较的时候是直接拿栈中的信息进行比较的!
还是通过栈拿到堆里的地址或信息进行比较的?
发表于:2007-09-30 23:29:3319楼 得分:0
string   s1=new   string(“jdk1.2”);      
string   s2=new   string(“jdk1.2”);

s1和s2是引用类型,它们是局部变量,是存在栈里面的。
就像i里面放的是10一样
s1里面就是放了一个值,这个值就是那个string对象的地址
所以s1==s2也就是比较了这两个值和i,j没区别。
看看下面这段程序:
java code
public class test75 { public static void main(string[] args) { string s1 = "123"; string s2 = "123"; system.out.println(s1 == s2); object o = (object)s2; system.out.println(s1 == o); } }
发表于:2007-09-30 23:52:0420楼 得分:0
equal()什么意思?

指示其他某个对象是否与此对象“相等”。  
equals   方法在非空对象引用上实现相等关系:  

自反性:对于任何非空引用值   x,x.equals(x)   都应返回   true。  
对称性:对于任何非空引用值   x   和   y,当且仅当   y.equals(x)   返回   true   时,x.equals(y)   才应返回   true。  
传递性:对于任何非空引用值   x、y   和   z,如果   x.equals(y)   返回   true,并且   y.equals(z)   返回   true,那么   x.equals(z)   应返回   true。  
一致性:对于任何非空引用值   x   和   y,多次调用   x.equals(y)   始终返回   true   或始终返回   false,前提是对象上   equals   比较中所用的信息没有被修改。  
对于任何非空引用值   x,x.equals(null)   都应返回   false。  
object   类的   equals   方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值   x   和   y,当且仅当   x   和   y   引用同一个对象时,此方法才返回   true(x   ==   y   具有值   true)。  


==什么意思?
对于原始类型(int,short,char,long,float,double,boolean..)而言表示他们的值是否相同
对于object而言,表示他们所指向到引用是否相同
发表于:2007-10-01 08:43:1321楼 得分:0
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

==   用在基本数据类型之间的时候   比的是值   。   基本数据类型并不是对象。
发表于:2007-10-05 02:44:0222楼 得分:0
越看越糊涂了..~~但是,,还是抓住一点就ok了..~~~


快速检索

最新资讯
热门点击