java ==和equals

#JAVA中==和equals区别(尤其对于String类型)
##demo1
public class StringDemo2 {
public static void main(String[] args) {
String s1 = new String(“hello”);
String s2 = “hello”;
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
}
}
运行结果:

false
true
##代码详解
1,首先,通过main()方法进栈。
2,然后再栈中定义一个对象s1,去堆中开辟一个内存空间,将内存空间的引用赋值给s1,“hello”是常量,然后去字符串常量池 查看是否有hello字符串对象,没有的话分配一个空间存放hello,并且将其空间地址存入堆中new出来的空间中。
3,在栈中定义一个对象s2,然后去字符串常量池中查看是否有”hello”字符串对象,有,直接把”hello”的地址赋值给s2.
4,即s1中存的是堆中分配的空间,堆中分配的空间中存的是字符串常量池中分配空间存放”hello”的空间的地址值。而s2中之间存的是字符串常量池中分配空间存放”hello”的空间的地址值。
5,由于s1与s2中存放的地址不同,所以输出false。因为,类String重写了equals()方法,它比较的是引用类型的 的值是否相等,所以输出true。即结果为false、true。
在这里插入图片描述
##demo2
public class StringDemo4 {
public static void main(String[] args) {
String s1 = “hello”;
String s2 = “world”;
String s3 = “helloworld”;
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals((s1 + s2)));// true
System.out.println(s3 == “hello” + “world”);//true
System.out.println(s3.equals(“hello” + “world”));// true
}
}
##代码详解
1,s1+s2是已经在常量池中分配了内存空间,然后将两个值拼接,会产生一个新的字符串,故会重新分配一个内存空间,所以第一个 == 为false
2,“hello”+"world"是先将字符串拼接后再去常量池中看是否有这个字符串,如果有就直接引用这个内存地址,所以第二个 == 为true

#总结
1,String s1 = new String(“hello”)会先去堆内开辟空间,然后再去常量池中;String s2 = "hello"则是直接去常量池中
2,==对于基本数据类型来说是比较值是否相等,对于引用变量类型来说是比较引用是否相等;equals默认情况下是比较引用,但是String和Integer重写了该方法,使其比较值,所以大多数情况下它比较的是值是否相等
3,字符串如果是变量相加则先开辟空间再拼接
4,字符串如果是常量相加则先相加,再去常量池中查看是否已存在该字符串,若存在则直接返回对应的内存地址,否则就创建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值