转自
https://blog.csdn.net/seu_calvin/article/details/52089040
1. Java中数据类型分类
1.1 基本数据类型
又称为原始数据类型,byte,short,char,int,long,float,double,boolean
,他们之间的比较应该使用(==
),比较的是他们的值
。
1.2 复合数据类型
当复合数据类型用(==)进行比较,比较的是他们在内存中的存放地址
,也就是比较是不是同一个对象
。
当复合数据类型之间进行equals
比较时,这个方法的初始行为是比较对象在堆内存中的地址
,但在一些诸如String,Integer,Date
类中把Object中的这个方法覆盖
了,作用被覆盖为比较内容是否相同
。
2. String类的讨论
String s1 = "Hello";
String s2 = "Hello";
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}
输出:s1 == s2
说明:双等号在进行复合数据类型比较时,比较的是内存中的存放地址。因此s1与s2引用同一个String对象。
String s1 = "Hello";
String s2 = new String("Hello");
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2");
}else{
System.out.println("s1 not equals s2");
}
输出:
s1 != s2
s1 equals s2
说明:s1 s2分别引用了两个对象。显然,两者内容是相同的,因此equal返回true。第一个例子也一样。
3. 解释
我们接下来将详细讨论,为什么在上面两个例子中,s1和s2出现了两种不同的指向对象的情况。
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象
的,那么这种情况的内存是怎么分配的呢,答案是在堆空间
和字符串常量池
中。每调用一次就会在堆中创建一个新的对象
,如果常量池中已经存在"abc"
,那么就不会额外在常量池中生成引用
。因此这句话会产生一个或者两个对象。
而第二种是先在常量池中创建一个对String类的对象引用变量str,然后查找常量池中有没有存放"abc"
,如果没有
,则将"abc"存放
,并令str指向”abc”
,如果已经有”abc”
,则直接令str指向“abc”
。
4. String类的intern方法
String s1 = "Hello";
String s2 = new String("Hello");
s2 = s2.intern();
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2");
}else{
System.out.println("s1 not equals s2");
}
程序输出:
s1 == s2
s1 equals s2
这次加入:s2 = s2.intern(),java.lang.String的intern()方法,“abc”.intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。但是这也仅仅是JDK1.6以及以前的过时的处理方法,如果想了解更全更清晰的intern()方法,请务必参考我的这篇博文Java技术——你真的了解String类的intern()方法吗。
5. 为什么Java中10001000为false而100100为true?
Integer i1 = 100,i2 = 100;
System.out.println(i1==i2);
Integer i3 = 1000,i4 = 1000;
System.out.println(i3==i4);
查看Integer.java类,会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127
之间的所有的整数对象。
所以例子中i1和i2指向了一个对象。因此100==100为true。