Rainoo Talking

Would someone shut him up please?

所有的JAVA程序员,对==和equals都很熟悉,即便是刚踏入JAVA程序员的如我等菜鸟,看了一遍JAVA入门教材,也了解了个大概。

这里要说的是什么呢?先看一段小程序:

---------------------------------------------------------------

1.public class MyClass
2.{
3.      static String s1 = "I am unique!";
4.      public static void main(String args[])
5.      {
6.            String s2 = "I am unique!";
7.            String s3 = new String(s1);
8.            System.out.println(s1 == s2);
9.            System.out.println(s1.equals(s2));
10.          System.out.println(s3 == s1);
11.          System.out.println(s3.equals(s1));
12.          System.out.println(TestClass.s4 == s1);
13.     }
14.}

---------------------------------------------------------------

这段程序是非常简单的。但是为什么new出来的对象用==判断为false,而基本类型的直接赋值用==判断就是true呢?

这是因为在JAVA的对象存储机制里,new出来的一定是对象,而对象在内存中的存贮位置在Heap(堆)中,而基本类型在程序中出现的比较频繁(注:JAVA中的基本类型为8中,分别是:boolean,char,byte,short,int,long,float,double),所以通过new产生这些对象而将其放入在heap中效率反而不高,所以JAVA直接采取C/C++的方式,也就是不以new来分配其空间,而是产生一种所谓的“automatic”变量(不在是reference的形式),来解决效率的问题,此类变量直接放数据值,并且置于stack(栈)中,因为stack在空间的分配和释放上,效率要好的多。而恰恰是这种在内存中位置的不同,在stack中为基本类型变量分配空间时,如果stack中有一样的数据时,将不在创建新的数据,所以导致这个时候比较的两个基本类型值时,即使用==也是true。

因为JAVA保存了基本类型,而基本类型(入int、char等)并不具备面向对象的特点,比如拥有类的对象和方法。所以在JAVA中引入了new出来的基本类型,比如character c = new character( )的形式。基于此,严格的讲,JAVA并不是像人们所宣称的是彻底的纯粹的面向对象语言。



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=680825


[点击此处收藏本文]  发表于2006年01月02日 9:30 PM




正在读取评论……

发表评论

大名:
网址:
验证码
评论 
   

news

search

who is rainoo

click to enlarge
rainoo.blogspot.com
订阅我的网志:
通过bloglines订阅
给我留言
my del.icio.us(rss)
my flickr (rss)
msn space (rss)
my Google Group (atom)


除非特别声明,本站采用Creative Commons License许可
建议使用1024x768 pixels浏览

导航

blog stats

文章

收藏

相册

01 My favorite blogs

02 My favorite websites

03 Exchange blogs

Others

存档


正在读取评论……