Greedy的工作室

posts - 23,comments - 7,trackbacks - 0
先看一段小程序:

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

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并不是像人们所宣称的是彻底的纯粹的面向对象语言。

简单点就是
==:
1、比较的是操作符两端的操作数是否是同一个对象
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为TRUE,如:
      int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆
equals:
1、比较的是两个对象的内容是否一样

posted on 2008-09-03 21:02 greedy 阅读(152) 评论(0)  编辑  收藏 所属分类: Java技术

只有注册用户登录后才能发表评论。


网站导航: