本文链接:https://blog.csdn.net/qq_43275765/article/details/89006005
1.’=='运算符
我们通常用’=='来比较两个变量是否相等
- 当比较的变量是基本类型,且都是数值类型,且’=='比较的是其数值。
- 当比较的是引用变量,只有当他们都指向同一个对象的时候才会返回true。
- 其不可以用去在类型上比较没有继承关系的的两个变量,编译器会报错。
int it 65 ;
float f = 65.0f
//输出true
System.out.println(it == f);
char ch = 'A';
//输出true
System.out.println(ch == it);
String str1 = new String("hello");
String str2 = new String("hello");
//返回false
System.out.prinln(str1 == str2);
上面例子中由于“it”,“f”,“ch”都是基本类型且都为数值类型,因此其比较的是数值大小。
而对于“str1”,“str2”,因为它们都是引用型变量,它们分别指向两个通过new关键字创建的String对象,因此“str1”,“str2”不相等。
- “hello”和new
String(“hello)的区别:当Java程序直接使用了字符串直接量(形如”hello“,包括可以在编译时就计算出来的的字符串值)时,JVM将会使用常量池来管理这些字符串;当使用new
String(“hello”)来创建时,JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的的String对象会存放到堆内存中去,也就是说new
String(“hello”)产生了两个字符串对象。 - 常量池是专门用来管理在编译时被确定并保存在已编译的的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,还包括字符串常量。
- JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本。String对象所引用的字符串直接量可以在编译期就确定下来。使用new
String()创建的字符串对象是运行时创建出来的,它被保存在运行时内存区(即堆内存中);
2.equal方法
JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被复写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。
- 该方法属于object类,因此所有引用变量都可以调用这个方法来判断是否与其他引用变量相等,但是如果这样的话该方法和"=="来判断两个对象相等的标准和使用没有区别。
- 很多时候,程序判断两个引用变量是否相等,也希望有一种类似于”值相等“的判断规则,并不严格要求两个引用变量指向同一个对象。这时候可以通过重写equal方法。
- String类就重新了equal方法,该方法可以判断两个字符串对象所引用的字符串直接量是否相等。
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.println(a.equals(b));
System.out.println(a == b);
}
}
结果如下:
true
false
针对复合类型的interger,string,Date使用equel比较的是引用的对象的地址,而非对象的内存地址。