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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Cfan_yang 中级黑马   /  2014-12-2 22:06  /  2189 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

这两段代码有什么区别。
  1. String s1 = new String("itheima");
  2. String s2 = new String("itheima");
复制代码

  1. String s1 = "itheima";
  2. String s2 = "itheima";
复制代码


8 个回复

倒序浏览
第一段创建了两个对象,s1和new String(),第二段代码就创建一个对象

评分

参与人数 1黑马币 +1 收起 理由
船长 + 1

查看全部评分

回复 使用道具 举报
第一个是在堆内存中开辟了空间赋值属于两个对象,第二个是直接在栈内存中赋值
回复 使用道具 举报
第一个在堆内存中创建了两个对象,想要输出结果,需要相应参数列表的的构造函数参与,第二个是在栈内存中的赋值操作,可以直接输出的
回复 使用道具 举报
看了楼上的大神门,感觉理解更透彻了!
回复 使用道具 举报
第一个每new一次就新建个内存,s1和s2 内容一样,地址值不同
第二个就是赋值,内容和地址值都相同
回复 使用道具 举报
Rdw 初级黑马 2014-12-6 19:57:17
7#
第一个是创建了一个对象,并且把该地址的引用给了s1 ,s2.第二个则是把对象直接赋值给s1,s2,
回复 使用道具 举报
程序在运行的时候会创建一个字符串缓冲池。当使用s1 = "itheima" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1。将s2引用s1所引用的对象"itheima"。
而使用了new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"itheima"Sting对象被创建在内存中。他们的值相同,但是位置不同。
回复 使用道具 举报
第一种方式是分别在堆内存和常量池中各创建了一个对象(先在堆内存中创建了一个对象,然后再将该对象的初始化值"abc"放到常量池中,因此又要在常量池中创建一个对象来存储该初始化数值);第二种方式只是在常量池中创建了一个对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马