String类的equals(),==,内存图

"本文详细探讨了Java中String对象的创建方式,包括`new String()`与直接赋值的区别,以及它们在内存中的表现。同时,解释了`equals()`与`==`在比较String对象时的不同,并通过代码示例进行说明。此外,还分析了变量与常量拼接产生新字符串的原理,展示了`1+"abc"`与`s2+="1"`在内存管理上的差异。"
摘要由CSDN通过智能技术生成

一、new String(“abc”); 和 String s = “abc”;的区别:

  • new String()方法是在堆内存中,new一个String对象,指向方法区的"abc"常量池
  • s = "abc"是直接引用在方法区的"abc"常量
  • 内存图如下:
    在这里插入图片描述

二、String的equals和 == 的区别

  • equals:内容值相等就返回true
  • == :所引用的地址值一样,即是同一个对象就返回true
  • 代码:
public class Test5{
	public static void main(String[] args){
		String s1 = new String("abc");
		String s2 = "abc";
		System.out.println(s1.equals(s2));//true
		System.out.println(s1 == s2);//false
	}
}
  • 因为s1引用的是堆内存中的对象,而s2引用的是方法区常量池的"abc",它们地址值不同,所以 == 为false。而equals()比较,返回true,因为它们的内容都是常量池的"abc",所以一样。

三、变量+"abc"和1+"abc"的区别

  • 变量+“abc”:是在堆中,重新new一个字符串对象,连接"abc",再赋值给引用变量
  • 1 + “abc”:由于有常量优化机制,可以直接在常量池重新创一个"1abc"的常量
  • 代码
public class Test5{
	public static void main(String[] args){
		String s1 = new String("abc");
		String s2 = "abc";
		String s3 = s2;
		s2 = 1+s1;
		String s4 = "abc";
		s4 = 1 + "abc";
		String s5 = "1abc";
		System.out.println(s3 == s2);//false
		System.out.println(s4== s5);//true
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值