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呢?
求解答 展开
String str1=“hello”;String str2=“hello”;String str3=“hello”;这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重新开辟空间了。
可是,如果先用String str1=new String("hello"),开辟新的堆内存,内容为"hello",这时再写String str2="hello"呢,第一句中new已经新开辟了,对象池中就存在了"hello",这时第二句中应该指向已经存在的地址,也就是和第一句new开辟的时同一堆内存地址呀,但是为什么用==时,显示的还是false呢?
求解答 展开
1个回答
展开全部
这个是因为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 是不是指向同一个地址呢,这个问题在各论坛都是谈论很激烈,其实很简单,跟下这些字符串的内存地址就好了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询