黑马程序员技术交流社区

标题: String中的两种形式的问题 [打印本页]

作者: fufeng    时间: 2014-4-9 14:44
标题: String中的两种形式的问题
  1. String   s1 = “abc”;//代码1
  2. String   s2 =  new String(“abc”)//代码2
复制代码

代码1表示的是类类型引用s1指向了一个String类的对象“abc”。s1在内存中有一个对象(或者是指向了一个对象)
代码2中,教材中说是s2在内存中有两个对象,一个是new创建的,一个是“abc”;怎么样理解new String(“abc”)呢?new String("abc")  和new String(s1)是一个意思呢?
作者: 闲人    时间: 2014-4-9 14:53
s1是创建了一个abc的对象
s2是创建了一个new String的对象,指向了abc对象

s1和s2的地址值是不同的,但是他们所指向的内容是相同的,
你可以是使用s1==s2和s1.equals(s2)来进行比较了解
    前一个是地址值的比较,后一个是字符串内容的比较
作者: wconho    时间: 2014-4-9 15:09
String   s1 = “abc”;//代码1
第一个:在常量区中存储“abc”字符串,将该存储地址发送给s1,s1指向“abc”所在的位置,存储在常量区中的数据可以被改变。
String   s2 =  new String(“abc”)//代码2
第二个:在常量区中分配空间存储“abc”,将该字符串所在地址引用发给String构造函数;
            使用new操作符创建String类对象,该对象在堆内存中分配空间,该空间中存储的是字符串的地址值,将该堆空间地址引用发给s2,类类型s2指向堆内存空间,间接访问到字符串“abc”。
作者: Crystal静新    时间: 2014-4-9 16:44
这就是两种使用String的方式,一种和普通的new对象一样,一种和变量一样。
数据的存放也一样,new对象的放哪,new String的也就放哪。String("abc")  和new String(s1)就是调用了构造方法,一回事。
作者: fufeng    时间: 2014-4-9 18:19
wconho 发表于 2014-4-9 15:09
String   s1 = “abc”;//代码1
第一个:在常量区中存储“abc”字符串,将该存储地址发送给s1,s1指向“ab ...

存储在常量区中的数据可以被改变。

是不是“abc”可以被改变呢?

我个人听课理解,应该是不是“abc”,可以被改变,因为它是一个对象比如
  1. s1 = “abc”

  2. s1 = “cd”
复制代码

并不是说把“abc”改变了,而是将类类型引用s1指向的对象变为“cd”了
不知道是不是这样的
作者: 赵小豪    时间: 2014-4-9 19:56
new是新建一个对象“abc”都存放在堆上,而s2是存放在栈上相当于指针,S2就指向“abc”地址。S1只在栈有一个对象,它指向堆的原有的对象“abc”。所以s1是一个对象,而s2是二个对象。
作者: 你好!默默    时间: 2014-4-10 16:50
String str1=“abc”,指向堆内存中的"abc",而String str2=new String("abc"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false。
String str1=“abc”;String str2=“abc”;String str3=“abc”;这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重新开辟空间了
作者: syusikoku    时间: 2014-4-10 22:03
String   s1 = “abc”这里abc在编译的时候就被存放到了常量池中去了。以后如果再有这样相同的就取出来复用了。
而String   s2 =  new String(“abc”)这个是在运行的时候才会去堆内存中开辟空间。然后s2才会去引用堆内存中的实体。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2