云原生 + 边缘计算 +KubeEdge,打造智能边缘治理平台
超清原画 残缺无密 获取 ZY: 网盘链接
== 介绍
它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(根本数据类型 == 比拟的是值,援用数据类型 == 比拟的是内存地址)。
根本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比拟,利用双等号(==), 比拟的是他们的值。
援用数据类型:当他们用(==)进行比拟的时候,比拟的是他们在内存中的寄存地址(确切的说,是堆内存地址)。
举个例子:
public static void main(String[] args) {
int i = 100;// 根本数据类型
int ii = 100;// 根本数据类型
Integer j = 100;// 援用类型
Integer jj = 100;// 援用类型
Integer k = new Integer(100);// 援用类型
Integer kk = new Integer(100);// 援用类型
System.out.println("i 的地址:" + System.identityHashCode(i));
System.out.println("ii 的地址:" + System.identityHashCode(ii));
System.out.println("j 的地址:" + System.identityHashCode(j));
System.out.println("jj 的地址:" + System.identityHashCode(jj));
System.out.println("k 的地址:" + System.identityHashCode(k));
System.out.println("kk 的地址:" + System.identityHashCode(kk));
// 根本类型互相比拟其中的值,所以得出 true
System.out.println("i == ii 后果:" + (i == ii));
// 当 int 的援用类型 Integer 与根本类型进行比拟的时候,包装类会先进行主动拆箱
// 而后与根本类型进行值比拟,所有得出 true
System.out.println("i == j 后果:" + (i == j));
// 同上,包装类先拆箱成根本类型,而后比拟,得出 true
System.out.println("i == k 后果:" + (i == k));
// 都是援用类型,所有比拟的是地址,因为 j 与 jj 的地址雷同,得出 true
System.out.println("j == jj 后果:" + (j == jj));
// 都是援用类型,所有比拟的是地址,因为 k 与 kk 的地址不雷同,得出 false
System.out.println("k == kk 后果:" + (k == kk));
}
复制代码
输入后果:
i 的地址:713338599
ii 的地址:713338599
j 的地址:713338599
jj 的地址:713338599
k 的地址:168423058
kk 的地址:821270929
i == ii 后果:true
i == j 后果:true
i == k 后果:true
j == jj 后果:true
k == kk 后果:false
复制代码
疑难点:为什么 j 和 jj 的地址是一样的,k 与 kk 的地址却不一样呢?答案:在 -128~127 的 Integer 值并且以 Integer x = value; 的形式赋值的参数,x 会从包装类型主动拆箱成根本数据类型,以供重用!所以,j、jj 的内存地址都是一样的!上面咱们把 100 变成 1000 试试!
public static void main(String[] args) {
int i = 1000;// 根本数据类型
int ii = 1000;// 根本数据类型
Integer j = 1000;// 援用类型
Integer jj = 1000;// 援用类型
Integer k = new Integer(1000);// 援用类型
Integer kk = new Integer(1000);// 援用类型
System.out.println("i 的地址:" + System.identityHashCode(i));
System.out.println("ii 的地址:" + System.identityHashCode(ii));
System.out.println("j 的地址:" + System.identityHashCode(j));
System.out.println("jj 的地址:" + System.identityHashCode(jj));
System.out.println("k 的地址:" + System.identityHashCode(k));
System.out.println("kk 的地址:" + System.identityHashCode(kk));
// 根本类型互相比拟其中的值,所以得出 true
System.out.println("i == ii 后果:" + (i == ii));
// 当 int 的援用类型 Integer 与根本类型进行比拟的时候,包装类会先进行主动拆箱
// 而后与根本类型进行值比拟,所有得出 true
System.out.println("i == j 后果:" + (i == j));
// 同上,包装类先拆箱成根本类型,而后比拟,得出 true
System.out.println("i == k 后果:" + (i == k));
// 都是援用类型,所有比拟的是地址,因为 j 与 jj 的地址不雷同,得出 false
System.out.println("j == jj 后果:" + (j == jj));
// 都是援用类型,所有比拟的是地址,因为 k 与 kk 的地址不雷同,得出 false
System.out.println("k == kk 后果:" + (k == kk));
}
复制代码
输入后果:
i 的地址:713338599
ii 的地址:168423058
j 的地址:821270929
jj 的地址:1160460865
k 的地址:1247233941
kk 的地址:258952499
i == ii 后果:true
i == j 后果:true
i == k 后果:true
j == jj 后果:false
k == kk 后果:false
复制代码
当 j、jj 超出 -128~127 区间的时候,地址就变了,所以比拟的后果就是 false。再看其它的包装器主动拆箱状况:
| 类型 | 形容 | |:–:|:–:| |Boolean | 全副主动拆箱 | |Byte | 全副主动拆箱 | |Short|-128127 区间主动拆箱 | |Integer|-128127 区间主动拆箱 | |Long |-128127 区间主动拆箱 | |Float | 没有拆箱 | |Doulbe | 没有拆箱 | |Character |0127 区间主动拆箱 |
equals()办法介绍
它的作用也是判断两个对象是否相等。但它个别有两种应用状况:
状况 1:类没有笼罩 equals() 办法。则通过 equals() 比拟该类的两个对象时,等价于通过“==”比拟这两个对象。
状况 2:类笼罩了 equals() 办法。个别,咱们都笼罩 equals() 办法来比拟两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
Boolean、Byte、Short、Integer、Long、Float、Doulbe、Character 8 种根本类型的包装类都重写了 equals() 办法,所以比拟的时候,如果内容雷同,则返回 true,例如:
// 因为内容雷同,返回的都是 true
System.out.println(“j.equals(jj) 后果:” + (j.equals(jj)));
System.out.println(“(k.equals(kk) 后果:” + (k.equals(kk)));
复制代码
String 类型的比拟介绍
string 是一个十分非凡的数据类型,它能够通过 String x = value; 的形式进行赋值,也能够通过 String x = new String(value)形式进行赋值。
String x = value; 形式赋予的参数,会放入常量池内存块区域中;String x = new String(value)形式赋予的参数,会放入堆内存区域中,当成对象解决。
举个例子:
public static void main(String[] args) {String a = new String("ab"); // a 为一个援用
String b = new String("ab"); // b 为另一个援用, 对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
System.out.println("a 地址:" + System.identityHashCode(a));
System.out.println("b 地址:" + System.identityHashCode(b));
System.out.println("aa 地址:" + System.identityHashCode(aa));
System.out.println("bb 地址:" + System.identityHashCode(bb));
// 地址雷同,所以返回 true
if (aa == bb) {System.out.println("aa==bb");
}
// 地址不同,非同一个对象,所以返回 false
if (a == b) {System.out.println("a==b");
}
// 地址不同,然而内容雷同,所以返回 true
if (a.equals(b)) {System.out.println("aEQb");
}
}
复制代码
输入后果:
a 地址:713338599
b 地址:168423058
aa 地址:821270929
bb 地址:821270929
aa==bb
aEQb
复制代码
为什么 string 的 equals()办法比拟返回 true,因为 string 重写了 equals()办法,源码如下:
public boolean equals(Object anObject) {if (this == anObject) {return true;}
if (anObject instanceof String) {String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
复制代码
如果内容雷同,则返回 true!
总结:如果须要比拟某个对象是否雷同,肯定要重写 equals(),比拟其中的内容是否雷同,如果雷同,返回 true;否则,返回 false!