java中的数据类型,可分为两类:
1.基本数据类型,也称为原始数据类型。byte,short,char,int,float,double,boolean
它们之间的比较,应用双等号==,比较的是它们的值。
2.复合数据类型(类)
当它们用==比较时,比较的是它们在内存中的地址。
Java中所有的类都继承自Object这个基类,在Object中的基类中定义了一个equals的方法,初始行为是比较对象的内存地址,但是在一些类库中这个方法被覆盖了,如String,Integer,Date这些类中,有其自己的实现,而不再是比较堆放在内存中的地址了。
对于复合数据类型之间进行equals比较,在没有复写equals方法的情况下,还是比较它们的内存地址。
3.String的比较
1 public class TestString { 2 public static void main(String[] args) { 3 String s1 = "abc"; 4 String s2 = "abc"; 5 System.out.println(s1==s2); 6 } 7 }
运行结果为:true。说明它们引用的是同一个对象:"abc"
4.修改上述代码
1 public class TestString { 2 public static void main(String[] args) { 3 String s1 = "abc"; 4 String s2 = new String("abc"); 5 System.out.println(s1==s2); 6 } 7 }
运行结果:false。说明s1,s2分别引用了两个"abc"对象。
5.字符串缓冲池
原来程序在运行的时候,会创建一个字符串缓冲池,当使用s2="abc"这样的表达时,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1被放到了池中,所以在s2被创建的时候,程序找到了相同值的s1,并将s2引用s1所引用的对象。
在第二段程序中,使用了new操作符,他明白高速程序,“我要一个新的,不要旧的”,于是一个新的"abc"对象被创建在了内存中,它们值相同,但是在内存中的位置不同。真是资源浪费,明明是一样的非要分开做什么呢?