一般我们在比较两个值是否相等时,我们一般有两种方法,使用''==",或者使用equals,下面我们来了解一下这两种方法怎么使用,各有什么区别与特点
两者主要的的区别:
"=="是一种运算符,一般比较的是两者存储的值是否相同
equals是一种object方法,一般比较的是数据的地址值
详解'''==':
"==" 我们可以理解为是判断的意思,对于局部变量的基本类型(四型八种)这类存储在栈之中的,我们主要比较的是值,只要值相等,就返回True
public class Test01 {
public static void main(String[] args) {
int i=10;
int x=10;
System.out.println(i==x);//true
}
}
而对于引用类型来说,它比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的是否相同,即是否是指相同一个对象
public class Test01 {
public static void main(String[] args) {
Integer i=new Integer("10");
Integer z=new Integer("10");
System.out.println(i);//10
System.out.println(z);//10
System.out.println(i==z);//false
}
}
我么可以从例子中看到,虽然他们值相同,但是他们并不不是同一个对象,因为比较下来地址值不相同,所以是false
详解equals:
equals是一种object方法,它一般用来比较两个对象的内容是否相等,而当equals用来比较基本类型时,它的作用则和"=="相同,一般情况下,类会重写equals方法用来比较两个对象的内容是否相等,对于Integer、Boolean等封装类来说,就重写了equals,它比较的是对象的值。
public class Test01 {
public static void main(String[] args) {
Integer i=new Integer("10");
Integer z=new Integer("10");
System.out.println(i);//10
System.out.println(z);//10
System.out.println(i==z);//false,"=="用于比较对象的地址值,在此不是一个对象
System.out.println(i.equals(z));//true,此时equals比较的是两个对象的值,10=10
String s1="hello";
String s2="hello";
System.out.println(s1==s2);//true,他两在常量池中的地址相同
System.out.println(s1.equals(s2));//true,他两值相同
String s3=new String("hello");
String s4=new String("hello");
System.out.println(s3==s4);//false,不是同一个对象
System.out.println(s3.equals(s4));//true,他两值相同
}
}
对于String s3 = new String(“hello”);
首先在堆内存中申请内存存储String类型的对象,将地址值赋给s2;
在方法区的常量池中找,有无hello:
若没有,则在常量池中开辟空间存储hello,并将该空间的地址值赋给堆中存储对象的空间;
若有,则直接将hello所在空间的地址值给堆中存储对象的空间。
对于String s1 = “hello”;
在方法区的常量池中找,有无hello,如果没有,就在常量池中开辟空间存储hello。
然后只需要将hello所在空间的地址值赋给 s1。
字符串作为最基础的数据类型,使用非常频繁,如果每次都通过 new 关键字进行创建,会耗费高昂的时间和空间代价。Java 虚拟机为了提高性能和减少内存开销,就设计了字符串常量池. 在JDK1.7之前字符串常量池是存储在方法区的。JDK1.7之后存储在堆中了。
总结:
当我们想比较四型八种的值时,我们一般使用"==",而当我们想比较两个不同类型的值时,我们可以使用equals或者equals的重写