Integer i1 = new Integer(2);
Integer i2 = new Integer("2");
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
结果为:false true
Integer i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
结果为true true;
Sysout.out.println(i1 == i3);
结果为flase 请教下大家,为什么会得出这样的结果呢?能详细点说下吗。?
Integer i2 = new Integer("2");
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
结果为:false true
Integer i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
结果为true true;
Sysout.out.println(i1 == i3);
结果为flase 请教下大家,为什么会得出这样的结果呢?能详细点说下吗。?
既然new Integer(2)和new Integer("2")构造了两个对象,那它们的地址肯定不一样,所以i1==i2就是false;
但是equals是比较内容而不是地址,所以i1.equals(i2)就是true啦。Integer i3 = 2;
Integer i4 = 2;
上面这两个都是从栈里取出来的,所以无论是地址还是值都相同的。
Integer i2 = new Integer("2");
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
结果为:false true
因为:i1==i2比较的是对象的引用,
i1和i2本来就是不同的对象,引用不同的内存。只不过他们的内容相同而已Integer i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
结果为true true;
因为:i3和i4创建的是规范化字符串,也就是说他们存储在同一对象中。他们的引用的是同一内存。
i3.equals(i4)比较的是他们的值是否相等。Sysout.out.println(i1 == i3);
结果为flase
因为:不知道
结果为flase
因为:i1和i3是俩不同的对象,地址不同!
结果为flase
因为:Integer i3 = 2; //这里创建的对象与前面两个是毫无关联的。这个语句新划出了一小块内存用来保存对象i3,
Integer i4 = 2; //这里使得i4的引用指向了i3的引用,即i3和i4这时引用了同一块内存。
== 比较的是两个对象所在的“地址值”,而equals在这里比较的是两个对象“所包含的值”是否相等。然后各自返回boolean值。
所以:Integer i1 = new Integer(2);
Integer i2 = new Integer("2");
System.out.println();
System.out.println(i1.equals(i2));
结果为:false true
1、因为i1,i2是两个不同的对象,其所在的堆地址不同,所以i1==i2为false
2、但是这两个对象所包含的值为相同的int值2,所以i1.equals(i2)返回trueInteger i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
结果为true true;
3、这里Integer i3 = 2; Integer i4 = 2; 其实是生成了同一个对象,只是不同的两个句柄(i3,i4)而已,所以i3,i4指向的对象地址是一样的,则此时i3==i4为true。
4、i3.equals(i4)为true,同第二条。
Sysout.out.println(i1 == i3);
结果为flase
5、同第一条
和Integer i3 = Integer.valueOf(2);相同
jdk1.5后的用法,好像是叫自动封装,可以去看Integer.java的源代码,
Integer静态缓存了Integer对象:-1024~1024,如果超出这个范围也会new Integer
所以比较还是要用equals,或者比较intValue()
equal() 比较 2个对象的语义值关键是要比较什么 想要获取什么效果?
是要确定 2个对象的 语义值一样 还是确定2个对象是一个引用我发现 java 给 基础数据的包装类 实现了 对象池
是因为 包装类 没有改变本身语义内容的方法
当他们改变了值之后 其实是 建立了新的对象是不是 象这样的内部值不能改变的对象 比较引用是没意义的
因为 这样的对象初始化后就 一定代表了 一个语义 本身又没有什么改变内部值的方法
没必要 使用'=='
== 比较的是内存地址
equals比较的是值
Integer i2 = new Integer("2");
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
结果为:false true
因为:i1==i2比较的是对象的引用,
i1和i2本来就是不同的对象,引用不同的内存。只不过他们的内容相同而已 Integer i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
结果为true true;
因为:i3和i4创建的是规范化字符串,也就是说他们存储在同一对象中。他们的引用的是同一内存。
i3.equals(i4)比较的是他们的值是否相等。
Sysout.out.println(i1 == i3);
结果为flase
因为:i1和i3是俩不同的对象,地址不同!
编译器先new一个值为2的对象,用i3引用之;
后编译i4=2;
却发现“=2;”的操作已做过一次
用i4引用i3引用的对象了。//编译器真是知道节约啊。哈哈
Sysout.out.println(i1 == i3);
结果为flase
因为i3是引入java缓存内的integer对象(如上说),如果不是new的对象,对数据类型的引入在-1m~1m的范围内
引入的都是缓存内的同一个对象(同一片内存空间)。如果new拉,就是另外开辟拉内存空间创建拉新对象,
再就是"=="比较的是对引用的内存地址的比较
而"equals"比较的单是对象内的值,这两个语句所比较的内容是不一样的
Integer i2 = 100;
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i1==i2);
System.out.println(i3==i4);
正确答案是
true
false
如果面试者写这样的写是错误的,就算通过。
这个的原因要从java5的Boxing和unboxing谈起,boxing就是封装基本类型的对象,unboxing就是转换对象到基本类型。
Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。
Boxing
在jdk1.4.2中,
必须是// Assigning primitive type to wrapper type
Integer iWrapper = new Integer(10);
java5中
// Assigning primitive type to wrapper type
Integer iWrapper = 10;
unboxing
在jdk1.4.2中,
int iPrimitive = iWrapper.intValue();
java5中
int iPrimitive = iWrapper;
下面是基本类型作为对象存储的范围,
boolean values true and false
All byte values
short values between -128 and 127
int values between -128 and 127
char in the range \u0000 to \u007F
如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
所以这段代码,大家不要奇怪
System.out.println(0L == 0);
System.out.println(((Long)0L).equals(0));
第二行代码是0不等于0
因为大家犯这样的一个错误
static private final String LOCK = "LOCK";
void testMethod() {
synchronized(LOCK) {
...
}
}
应该用new,不要直接=,对于int,最好使用int a[0] ,因为array也是对象,不像Integer,a[0]的值可以改变。
Integer i2 = new Integer("2");
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
结果为:false true
因为:i1==i2比较的是对象的引用,
i1和i2本来就是不同的对象,引用不同的内存。只不过他们的内容相同而已 Integer i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
结果为true true;
因为:i3和i4创建的是规范化字符串,也就是说他们存储在同一对象中。他们的引用的是同一内存。
i3.equals(i4)比较的是他们的值是否相等。 Sysout.out.println(i1 == i3);
结果为flase
i1和i3是俩不同的对象,地址不同
i1和i2都是对象,在栈内存中,i2是一个表示字符串指定的整数值的 Integer 对象
所以 i1 == i2 ,返回的是falsei3和i4是数值,数值之间比较返回的肯定是truei1是对象,i3是数值, i1 == i3,返回的是false
可用用String类参考,String s1 = "a"; String s2 = "a";
s1 == s2 就是true,因为s1和s2指向的是同一个字符串
Integer i2 = new Integer("2");
//都是构造Integer的对象,但是你后面是new的对象都放在堆内存中,是两个不同的地址。
System.out.println(i1==i2); //比较的是两个参数的内存地址(不相同)
System.out.println(i1.equals(i2)); //比较的是两个参数的值。
结果为:false true
Integer i3 = 2;
Integer i4 = 2;
//在栈内存中,指向同一内存空间,所以无论是地址还是数值都是相等的/
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
但是范围只有-128~~127,超出这个范围就用new来创建新数据类型对象
equals()比较是是里边的值
如果用NEW的话地址是肯定不一样的