【Java】String类的一些理解

写在前面

前段时间准备面试,发现java中String类是重头戏,网上众说纷纭,结合自己的理解总结一下。

到底创建了几个对象

//1
String s1 = "hello";
//2
String s2 = "hello":
//3
String s3 = new String("hello");

System.out.println(s1==s2);//true
System.out.println(s1==s3);//false

我的理解(暂且先不关注不同JDK版本字符串常量池的位置):

对于1,因为字符串常量池中没有与“hello”字符串相等(即equals方法判定)的String对象,所以在字符串常量池中创建一个值为“hello”的String对象,并将其地址返回给s1,因此栈上的s1中保存的是常量池中该“hello”String对象的地址;

对于2,因为字符串常量池中已有与“hello”字符串相等(即equals方法判定)的String对象,因此返回该对象的地址;

对于3,首先判断字符串常量池中是否存在与“hello”字符串相等(即equals方法判定)的String对象,如果有,则使用该对象在堆中创建一个新的String对象(即使用该构造函数public String(String original),更直接的理解就是使用s1引用的对象拷贝出了一个新的对象,而且是浅拷贝,因此才能解释为什么保存s1的char数组的地址和保存s3的char数组指向同一个地址),然后返回该对象的地址。

最后

本文会持续不断补充关于String的疑惑,纯个人总结和理解,若有更理论的理解,欢迎交流和指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值