所有的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