java中的两种数据类型基本类型和对象,那么int和Integer的区别就是这样呗,int和Integer
的引用是存储在堆栈区的,Integer的数据是放在堆区的。==运用与对象是是比较了两个对象的引用地址是不是一样,如果两个引用是指向同一个对象的话就是为true
equals()比较则要看具体类是怎样实现的,根据具体情况而不同,Object中的equals是
spublic final boolean equals(Object obj) {
return (this == obj);
}
这是不是说明如果子类不覆盖它的话就与==号的效果一样呢??那么对基本类型的包装类就出现了问题:
问题如下:
============================================================
《1》
Integer inta=new Integer(4),intb=4;
System.out.println(“”+inta==intb);//true,为什么(1)?难道它们不是对象的引用吗??
System.out.println(""+inta.equals(intb));//true
/* 当然这里是正确的因为Integer覆盖了object中的equals,判断整数的值是否相等
*/
=======================================================================
《2》
Character ch1='a',ch2='a';
System.out.println("ch1==ch2:"+(ch1==ch2));//true,(2)这里和上面一样的疑问??
System.out.println(""+ch1.equals(ch2));//true
/*为什么为true呢?Character中的equal是这样的
spublic final boolean equals(Object obj) {
return (this == obj);
}
这个和Object是一样的判断的是对象的引用是否相等(等价于判断是否引自同一个对象)
下面更怪了:
*/
Character ch3=new Character('a');
System.out.println(""+ch1.equals(ch3));//true,(3)??难道因为它们的值一样就为true;==================================================================================《3》
String str1="abc",str2="abc",str3="d";
str4=str1;
System.out.println(str1==str2);//true (4) ??
System.out.println(str1==str3);//false
System.out.println(str1.equals(str2));//true (5)??
System.out.println(str1.equals(str4));//true
/*查看jdk发现string的equals如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
这里是不是和(5)输出的矛盾呢??
*/
===================================================================
我在论坛上曾看见,有人说:string串只要它们里面的字符是一样的话它的对象引用就是
一样的,如果这样的话上面String的问题就等到了很好的解释了,我想最好事实也是这样的。
如果这种说法同样运用于Integer和character上的话,那么它们的上面的问题也一样可以解
决了,问问大家是不是这样的呢???
如果不是的话那么为什么会出现上面5个问题的?小弟初学如果上面提的问题有不正确的请大侠这指正。[/size][/size][/size]
的引用是存储在堆栈区的,Integer的数据是放在堆区的。==运用与对象是是比较了两个对象的引用地址是不是一样,如果两个引用是指向同一个对象的话就是为true
equals()比较则要看具体类是怎样实现的,根据具体情况而不同,Object中的equals是
spublic final boolean equals(Object obj) {
return (this == obj);
}
这是不是说明如果子类不覆盖它的话就与==号的效果一样呢??那么对基本类型的包装类就出现了问题:
问题如下:
============================================================
《1》
Integer inta=new Integer(4),intb=4;
System.out.println(“”+inta==intb);//true,为什么(1)?难道它们不是对象的引用吗??
System.out.println(""+inta.equals(intb));//true
/* 当然这里是正确的因为Integer覆盖了object中的equals,判断整数的值是否相等
*/
=======================================================================
《2》
Character ch1='a',ch2='a';
System.out.println("ch1==ch2:"+(ch1==ch2));//true,(2)这里和上面一样的疑问??
System.out.println(""+ch1.equals(ch2));//true
/*为什么为true呢?Character中的equal是这样的
spublic final boolean equals(Object obj) {
return (this == obj);
}
这个和Object是一样的判断的是对象的引用是否相等(等价于判断是否引自同一个对象)
下面更怪了:
*/
Character ch3=new Character('a');
System.out.println(""+ch1.equals(ch3));//true,(3)??难道因为它们的值一样就为true;==================================================================================《3》
String str1="abc",str2="abc",str3="d";
str4=str1;
System.out.println(str1==str2);//true (4) ??
System.out.println(str1==str3);//false
System.out.println(str1.equals(str2));//true (5)??
System.out.println(str1.equals(str4));//true
/*查看jdk发现string的equals如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
这里是不是和(5)输出的矛盾呢??
*/
===================================================================
我在论坛上曾看见,有人说:string串只要它们里面的字符是一样的话它的对象引用就是
一样的,如果这样的话上面String的问题就等到了很好的解释了,我想最好事实也是这样的。
如果这种说法同样运用于Integer和character上的话,那么它们的上面的问题也一样可以解
决了,问问大家是不是这样的呢???
如果不是的话那么为什么会出现上面5个问题的?小弟初学如果上面提的问题有不正确的请大侠这指正。[/size][/size][/size]
java 中对于小于128的整数进行了内存优化,他们都指向了同一个整数值4public class Test {
public static void main(String[] args) {
Integer aInteger = 59595, bInteger = 59595;
System.out.println("" + (aInteger == bInteger));
}
}上面的换了一个大的数字,结果就为false了
这个和上面的一样的解释,Character 的取值是可与整数值相互转换的public class Test {
public static void main(String[] args) {
Character ch1 = 128, ch2 = 128;
System.out.println("" + (ch1 == ch2));
}
}如果这样结果就为false了
System.out.println(“”+inta==intb);的时候是false
//只限于常量,String a ="a"会先到字符串常量池里寻找"a",没有找到,new一个;
//string b = "a" 到常量池找到一个"a",直接引用
//String c = new ("a");直接new一个,不管有没有,所以false
String a ="a";
String b = "a";
String c = new String("a");
System.out.println(a==b);//true
System.out.println(a==c);//false
Integer i = new Integer(4);
Integer m = 4;
Integer n = 4;
System.out.println(i==m);//false
System.out.println(n==m);//true
public static void main(String[] args) {
String string1 = "abc";
String string2 = "abc";
String string3 = "d"; System.out.println((string1 + string3).equals(string1 + "d"));
System.out.println((string1 + string3) == (string1 + "d")); System.out.println((string1 + "d").equals(string2 + "d"));
System.out.println((string1 + "d") == (string2 + "d")); }
}
/*查看jdk发现string的equals如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
} 这个API也不是这样的,jdk里的源码为public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
public static void main(String[]args){
String s1="JavaSE6.0";
String s2="JavaSE6.0";
String s3=new String("JavaSE6.0");
if(s1==s2)
System.out.println("字符串s1与s2通过等于测试,结果返回true");
else System.out.println("字符串s1与s2没有通过等于测试,结果返回false");
if(s1==s3)
System.out.println("字符串s1与s3通过等于测试,结果返回true");
else System.out.println("字符串s1与s3没有通过等于测试,结果返回false");
if(s1.equals(s3))
System.out.println("字符串s1与s3內容相同,结果返回true");
else System.out.println("字符串s1与s3內容不同,结果返回false");
}}