A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fufeng 中级黑马   /  2014-4-9 14:44  /  1327 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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)是一个意思呢?

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
s1是创建了一个abc的对象
s2是创建了一个new String的对象,指向了abc对象

s1和s2的地址值是不同的,但是他们所指向的内容是相同的,
你可以是使用s1==s2和s1.equals(s2)来进行比较了解
    前一个是地址值的比较,后一个是字符串内容的比较
回复 使用道具 举报 1 0
String   s1 = “abc”;//代码1
第一个:在常量区中存储“abc”字符串,将该存储地址发送给s1,s1指向“abc”所在的位置,存储在常量区中的数据可以被改变。
String   s2 =  new String(“abc”)//代码2
第二个:在常量区中分配空间存储“abc”,将该字符串所在地址引用发给String构造函数;
            使用new操作符创建String类对象,该对象在堆内存中分配空间,该空间中存储的是字符串的地址值,将该堆空间地址引用发给s2,类类型s2指向堆内存空间,间接访问到字符串“abc”。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
这就是两种使用String的方式,一种和普通的new对象一样,一种和变量一样。
数据的存放也一样,new对象的放哪,new String的也就放哪。String("abc")  和new String(s1)就是调用了构造方法,一回事。
回复 使用道具 举报
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”了
不知道是不是这样的

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
new是新建一个对象“abc”都存放在堆上,而s2是存放在栈上相当于指针,S2就指向“abc”地址。S1只在栈有一个对象,它指向堆的原有的对象“abc”。所以s1是一个对象,而s2是二个对象。
回复 使用道具 举报
String str1=“abc”,指向堆内存中的"abc",而String str2=new String("abc"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false。
String str1=“abc”;String str2=“abc”;String str3=“abc”;这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重新开辟空间了

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String   s1 = “abc”这里abc在编译的时候就被存放到了常量池中去了。以后如果再有这样相同的就取出来复用了。
而String   s2 =  new String(“abc”)这个是在运行的时候才会去堆内存中开辟空间。然后s2才会去引用堆内存中的实体。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马