楼主: sujievic

[SCJP] String 对象的理解

[复制链接]
论坛徽章:
7
11#
发表于 2008-3-22 22:42 | 只看该作者
银河使者和greenflute在
String s = "Fred";
  s = s + "47";
这2个地方是否创建了对象的看法是相反的

使用道具 举报

回复
论坛徽章:
7
12#
发表于 2008-3-22 22:56 | 只看该作者
原帖由 dream_zdf 于 2008-3-22 22:42 发表
银河使者和greenflute在
String s = "Fred";
  s = s + "47";
这2个地方是否创建了对象的看法是相反的

我认为是2个都创建了对象

使用道具 举报

回复
论坛徽章:
20
奥运会纪念徽章:乒乓球
日期:2008-09-26 12:58:092012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:52
13#
发表于 2008-3-24 11:05 | 只看该作者
to dream_zdf  

这两个地方是都创建了对象,但是问的是创建了String对象。

s = s + "47";创建了StringBuilder对象,而不是String对象,至于"47",不太清楚Java在内部是如何处理的,但我想不应该再创建了String对象来放"47",否则优化不是白做了

其实这道题问的有点问题

谁知道java framework的方法在内部到底创建了多少String对象呢?

使用道具 举报

回复
论坛徽章:
20
奥运会纪念徽章:乒乓球
日期:2008-09-26 12:58:092012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:52
14#
发表于 2008-3-24 11:06 | 只看该作者
我认为原则是尽量使用StringBuilder才是上策,可以尽可能节省资源

使用道具 举报

回复
论坛徽章:
0
15#
发表于 2009-5-24 00:33 | 只看该作者
s = (new StringBuilder(String.valueOf(s))).append("47").toString();
这句其实产生两个对象
一个 StringBuilder对象 是new出来的
一个 String对象  是StringBuilder对象toString()返回的
JDK里源码:

public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

[ 本帖最后由 ruijf 于 2009-5-24 00:35 编辑 ]

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
16#
发表于 2012-7-13 13:48 | 只看该作者
分析的很详尽

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2012-7-23 12:25 | 只看该作者
开始两个(Fred, 47)在编译成字节码的时候,就已经放在String对象的串池里去了。所以你调用方法之前,这两个字符串就已经有了。新建的就后面3个。

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2012-7-23 12:42 | 只看该作者
字符串本质就是字符数组。为什么很多时候都要求字符串连接的时候不要直接用+号,必须要用StringBuffer,StringBuilder呢。因为后者不会新建对象。他只是修改了原来的字符数组。有人说,既然java优化里已经默认开始将+号变为StringBuilder了,如上反编译结果所示,那是不是意味着字符串现在就可以直接相加了呢(jdk1.6)?并不是这样的。
循环相加的话,这样会new很多StringBuilder对象出来的。所以还是必须在外面new StringBuilder,循环里面用append。
字符串本身有个串池。当程序编译的时候,已知的字符串是会放在串池里面的。程序运行的时候不会新建对象,而是从串池里直接读取。
如果使用了new String,或者未知变量相加,都会同时在串池和栈里面各生成一个对象。
我也就知道这些了。

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2012-7-29 18:42 | 只看该作者
纠结这个纠结得想哭。。。

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2012-7-30 11:22 | 只看该作者
我全都不懂、大家都是高手(www.sanda3.info)啊、厉害

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表