一:java中==、equals的不同
1.==操作符:首先,对于非基本数据类型的对象比较,相同内存中存储的变量的值是否相等,注意是相同内存地址的才可,并且数值相同(当然地址相同,值也一定相同)才会返回true. 但是,对于基本数据类型的比较(比如:int flot double等),值相同,"=="比较便会返回true.(这是编译的规则,当进行基本数据类型的比较时,会编译生成if_icmpne指令不会进行比较地址。而进行对象比较时,会生成if_icmpne指令,会比较地址。生成的指令都是不同的)。
当然,对于不同的封装类型,比较时也会有一些异同。例如:String类型的比较
1. String = "abcd"创建过程,首先在栈区创建一块区域存储str的引用,之后去查询方法区中的常量池(常量池的相关知识:http://blog.csdn.net/gcw1024/article/details/51026840)是否有有“abcd”常量,如果有则将该引用指到该常量。如果没有则在常量池中创建一个”abcd“常量,并将引用指到该常量。之后,如果还有创建的String str2 = “abcd”;则将栈中的引用直接指向该常量。但是,如果进行赋值操作str2 = "aaa";则会直接子啊常量池再创建一个“aaa”的常量,并将引用修改为该常量,不会去修改原本的“abcd”常量。
2. String str3 = new String("abcd"): 直接在堆中创建对象,不会去常量池中去查找。之后又有一个String str4 = new String("abcd"),这个身str4对象即使值与str3对象相同但是并不会指向str对象,会在堆中重新创建一个对象,并指向它。如果str3==str4的话,返回值是false,因为他们只是值相同,但是对象的地址不同。str3.equals(str4)会返回true。
另外:比如Integer类型的比较
1. Integer与Integer进行比较时: i. 如果两个Integer的值都是在-128<=x<=127的区间时并且都不是通过new出来的话,用"=="判断的话返回值为true。 ii. 如果两个Integer的值不在-128<=x<=127的区间时并且都不是通过new出来的话,用"=="判断的话返回值为false。 iii. 因为在Integer类中,会将值在-128<=x<=127区间的缓存在常量池(通过Integer的一个内部静态类IntegerCache进行判断并进行缓存)中,所以这两个对象的引用值是相同的。但是超过这个区间的话,会直接创建各自的对象(在进行自动装箱的时候,调用valueOf()方法,源代码中是判断其大小,在区间内就缓存下来,不在的话直接new一个对象),即使值相同,也是不同的对象,所以返回false。 iv. 具体解释:http://blog.csdn.net/hxpjava1/article/details/78105146 2. new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。那么Integer a = 128, 大于该范围的话才会直接通过new Integer(128)创建对象,进行装箱。 另外: Integer a = 1,使用Integer类中的valueOf(int i )进行自动装箱的.详细见:http://blog.csdn.net/wangyang1354/article/details/52623703
2.equals方法:用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。注意的是只要值相同就会返回true.
3.例如:
//创建两个String对象,这两个String对象不是同一个内存地址。
String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1.equals(s2)); //输出true
System.out.println(s1==s2); //输出false
4.注意:如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法(object为java中所有类的父类),Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
也就是说,如果一个方法没有实现自己的equals方法,那么继承的object类的equals方法也是用==操作符进行比较,那么此时==与equals就没有什么不同了。
二:js中==与===的不同
1.首先===只能在js中使用,不能在java程序中使用,会报错。
2.==操作符:如果两个操作数不是同一类型,那么==运算符会尝试一些类型转换,然后进行比较。比如,char类型的变量和int类型的变量进行比较时,==会将char转化为int在进行比较。类型不同,如果可以转化并且值相同,那么会返回true。
3.===操作符:比较这两个值,比较过程没有任何类型转换。比如,类型不同,但如果转化后值相同,那么也会返回flase
4.例如:
var p1 = '1'; //字符类型的数字
var p2 = '1' ;//字符类型的数字
var p3 = 1; //整数类型的数字
p1 === p2; //类型和数值同时相等 true
p1 === p3; //类型不相等和数值相等 false
p1 == p3; //类型不同,但是==会自动转化类型,数值相等 true