说明:new关键词就是在堆栈中新建一块内存区域
1、基于JavaScript【=== 地址和值都相等】和【==仅值相等】对比
let s = "hello";
let s1 = new String(s);
let s2 = new String(s);
console.log("常量字符串s和new对象s1不完全相等,内存地址不一样,结果为false->", s === s1);
console.log("常量字符串s和new对象s1不完全相等,内存地址虽不一样【但是常量值相等】但是仅判断值是相等的,结果为true->", s == s1);
console.log("两个new对象s1和s2完全不相等【完全两个不同的对象】结果为false->", s1 === s2);
console.log("两个new对象s1和s2完全不相等【完全两个不同的对象】,手动拆箱为值对比结果为true->", s1.valueOf() === s2.valueOf());
2、基于Java的【== 地址和值都相等】和【equals仅值相等】对比【Java的8大基本类型支持自动拆箱对比】
/**
* 特殊说明:
* 0、Java【==符号 ->必须内存地址和值都相等】和【equals方法->只要值相等即可】对比
* 1、【完全支持==对比】Java语言支持的8种基本数据类型:byte,short,int,long,float,double,char 和 boolean
* 2、8种基本类型的对象封装类型,和基本类型对比时,会自动调用匹配的拆箱方法成基本类型,然后对比,结果为true!
* 3、基本数据类型的封装对象类型,部分类型有缓存【缓存范围之内的值可以使用==对比】
* Boolean:(全部缓存)
* Byte:(全部缓存)
* Character(<= 127缓存)
* Integer(-128 — 127缓存)
* Short(-128 — 127缓存)
* Long(-128 — 127缓存)
* 4、String类型没有拆箱方法,为此常量字符串和new String的地址不一样【==对比为false】
* 总结:
* 基于基本数据类型的封装对象类型,如果仅考虑值是否相等【务必使用equals方法对比】要判断内存地址是否相等才使用【==对比】
*
*/
System.out.println("Java【==符号 ->必须内存地址和值都相等】和【equals方法->只要值相等即可】对比:");
int i = 127;
Integer i1 = i;
Integer i2 = i;
Integer integer1 = new Integer(i);
Integer integer2 = new Integer(i);
System.out.println("【基于==符号对比】Integer 对比 int【Integer类型会自动调用intValue()方法拆箱为int类型再对比】为true->" + (integer1 == i));
System.out.println("【基于==符号对比】new Integer 对比 int【Integer类型会自动调用intValue()方法拆箱为int类型再对比】为true->" + (integer1 == i));
System.out.println("【基于==符号对比】两个Integer值对比【[-128-127]闭合区间自动存入缓存基于==对比为true】->" + (i1 == i2));
System.out.println("【基于==符号对比】Integer和new Integer对比【两个内存地址,对比结果为false】->" + (i1 == integer1));
System.out.println("【基于==符号对比】两个new Integer对象对比,地址肯定不一样【==】为false ->" + (integer1 == integer2));
System.out.println("【基于equals方法对比】仅对比值肯定为true ->" + (integer1.equals(integer2)));
float f = 1.1f;
Float f1 = f;
Float f2 = f;
Float f_float1 = new Float(f);
Float f_float2 = new Float(f);
System.out.println("【基于==符号对比】Float 对比 float【Float类型会自动调用floatValue()方法拆箱为int类型再对比】为true->" + (f_float1 == f));
System.out.println("【基于==符号对比】new Float 对比 float【Float类型会自动调用floatValue()方法拆箱为int类型再对比】为true->" + (f_float1 == f));
System.out.println("【基于==符号对比】两个Float值对比【没有缓存==对比为false】->" + (f1 == f2));
System.out.println("【基于==符号对比】Float和new Float对比【两个内存地址,对比结果为false】->" + (f1 == f_float1));
System.out.println("【基于==符号对比】两个new Float对象对比,地址肯定不一样【==】为false ->" + (f_float1 == f_float2));
System.out.println("【基于equals方法对比】仅对比值肯定为true ->" + (f_float1.equals(f_float2)));
String s = "hello";
String s1 = s;
String string1 = new String(s);
String string2 = new String(s);
System.out.println("【基于==符号对比】两个String值对比【常量字符串对比结果为true】->" + (s == s1));
System.out.println("【基于==符号对比】一个常量String和new String对象对比【String没有拆箱方法,对比结果为false】 ->" + (s1 == string2));
System.out.println("【基于==符号对比】两个new String对象对比,地址肯定不一样【==】为false ->" + (string1 == string2));
System.out.println("【基于equals方法对比】仅对比值肯定为true ->" + (f_float1.equals(f_float2)));
3、Python由于没有new关键词,为此,不可变则为常量类型【地址和值都是一样的】可变类型【地址一样,值在变化】【==符号可以对比一切】