String的两种赋值方式?

String的两种赋值是不同的,Stringstr1=“hello”,指向堆内存中的"hello",而Stringstr2=newString("hello"),因为ne... String的两种赋值是不同的,String str1=“hello”,指向堆内存中的"hello",而String str2=new String("hello"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false。
String str1=“hello”;String str2=“hello”;String str3=“hello”;这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重新开辟空间了。
可是,如果先用String str1=new String("hello"),开辟新的堆内存,内容为"hello",这时再写String str2="hello"呢,第一句中new已经新开辟了,对象池中就存在了"hello",这时第二句中应该指向已经存在的地址,也就是和第一句new开辟的时同一堆内存地址呀,但是为什么用==时,显示的还是false呢?
求解答
展开
 我来答
simonncc
高粉答主

2018-01-19 · 关注我不会让你失望
知道大有可为答主
回答量:776
采纳率:100%
帮助的人:13.6万
展开全部

这个是因为String str1=new String("hello"),这样创建的话,"hello"这个字符串只属于str1这个对象拥有,并且只有当程序运行到这句话的时候才去分配空间,而String str2="hello"则不是,它是在编译时就已经确定了,程序启动时已经在内存了,所以大家可以共用。

拓展:

1、C++、java等编程语言中的字符串。 在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。

2、String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似。//这样操作之后s1是"abc",s2是"def"。a 和 b 是不是指向同一个地址呢,这个问题在各论坛都是谈论很激烈,其实很简单,跟下这些字符串的内存地址就好了。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式