下面这个语句创建几个对象啊?为什么

faxc123 2009-09-17 07:23:06
String str="a"+"b"+"c"+"d"+"e";
...全文
228 30 打赏 收藏 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
languo 2009-09-18
  • 打赏
  • 举报
回复
String str="a"+"b"+"c"+"d"+"e";
一个
编译等同于 String str="abcde";
applerockhool 2009-09-18
  • 打赏
  • 举报
回复
这种题无聊之极呀
louisgarcia 2009-09-18
  • 打赏
  • 举报
回复
现在JAVA的编译器把字符串拼接的优化了,只产生一个,貌似听某位大牛说过
laiahu 2009-09-18
  • 打赏
  • 举报
回复
1个, 编译期就直接编成"abcde"
小灰狼 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ckw1988 的回复:]
一个。
"a"+"b"+"c"+"d"+"e"在编译期就直接编成"abcde",所以你再运行其实就等同于
String="abcde"
[/Quote]

up
Tianjimingluo 2009-09-18
  • 打赏
  • 举报
回复
1个,这个在编译器编译时就已做了优化处理,你把生成的class文件反编译一下就清楚了
gahyyai 2009-09-18
  • 打赏
  • 举报
回复
mark
王向飞 2009-09-17
  • 打赏
  • 举报
回复
感觉这个题目好无聊啊
感觉像 回字有几种写法一样
ruisheng_412 2009-09-17
  • 打赏
  • 举报
回复
一个对象,因为 a,b,c,d,e是保存在常量池中的,只有str一个对象
dreamhunter_lan 2009-09-17
  • 打赏
  • 举报
回复
日经贴又开始风靡了~
zrf625278699 2009-09-17
  • 打赏
  • 举报
回复
我认为是一个 五个字符串字面值拼接起来后变成“abcde” 然后str直接指向它
haojia0716 2009-09-17
  • 打赏
  • 举报
回复
又看到这个垃圾问题
yubangqi 2009-09-17
  • 打赏
  • 举报
回复

最近看到许多类似的帖子,大致意思如下:

问题1: String s = "a" + "b" + "c" + "d" + "e";
问此语句共创建了几个对象,

答案是
就创建了一个
String s = "a" + "b" + "c" + "d" + "e";
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个


问题2:但是如果改成 String s = a+b+c+d+e;
呢 又是几个了。

就是说上面是一个是因为 "a"、"b"、"c"、"d"、"e"都是常量
但如果是变量呢?



我的答案是3个对象,但只有一个String对象:

由于编译器的优化,最终代码为通过StringBuilder完成:

StringBuilder builder = new StringBuilder(); builder.append(a); builder.append(b); builder.append(c); builder.append(d); builder.append(e); String s = builder.toString(); 我们先看看StringBuilder的构造器 public StringBuilder() { super(16); }看下去 AbstractStringBuilder(int capacity) { value = new char[capacity]; }可见,分配了一个16自己长度的char数组我们看看append的整个过程(注意,源代码我从各个类进行了整合,他们实际上不在一个类里面的) public StringBuilder append(String str) { super.append(str); return this; } public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); if (len == 0) return this; int newCount = count + len; if (newCount > value.length) expandCapacity(newCount); str.getChars(0, len, value, count); count = newCount; return this; } public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) { if (srcBegin < 0) { throw new StringIndexOutOfBoundsException(srcBegin); } if (srcEnd > count) { throw new StringIndexOutOfBoundsException(srcEnd); } if (srcBegin > srcEnd) { throw new StringIndexOutOfBoundsException(srcEnd - srcBegin); } System .arraycopy(value, offset + srcBegin, dst, dstBegin, srcEnd - srcBegin); }可见,我们的代码不会超过16个,所以不会出现扩展value的情况。而append里面使用了arraycopy的复制方式,也没有产生新的对象。最后,我们再看StringBuilder的 toString()方法: public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }这里通过前面的数组生成了一个新的String。大家注意那个默认的16容量,如果题目出现了总长度超过16,则会出现如下的再次分配的情况 void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}


public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System
.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
可见,expand容量时,增加为当前(长度+1)*2。
注意这里用了Arrays的方法,注意不是前面的 System.arraycopy方法哦。这里产生了一个新的
copy的char数组,长度为新的长度


总结:三个对象分别为1 StringBuilder2 new char[capacity]3 new String(value,0,count);如果说String对象,则为1个。

老紫竹总结的
yubangqi 2009-09-17
  • 打赏
  • 举报
回复
http://www.javamvp.com/read.php?77
www.java2000.net上有

感觉学语言,...这个有点那个
ZangXT 2009-09-17
  • 打赏
  • 举报
回复
面试搞这个太无聊了。
舷Kelvin 2009-09-17
  • 打赏
  • 举报
回复
一个。
"a"+"b"+"c"+"d"+"e"在编译期就直接编成"abcde",所以你再运行其实就等同于
String="abcde"
cz61919345 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jayqean 的回复:]
这样写没有创建对象吧  new 是创建对象实例的一种方法

[/Quote]
String是java中默认的类型,不用用new来创建,JVM自动创建了,并隐藏!
我觉得是一个!
faxc123 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bao110908 的回复:]
你要知道创建了几个对象做什么呢?
[/Quote]

-------------------
面试题啊,感觉真变态
shiyiwan 2009-09-17
  • 打赏
  • 举报
回复
String对象只创建了一个
加载更多回复(10)
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 DELL服务器的操作系统部署流程包含一系列细致的环节,其适用范围涵盖多种操作系统类型,例如Windows Server与Red Hat Linux等。在启动部署之前,必须确认服务器的光驱设备为DVD驱动器,并且需准备对应的系统安装媒介。下面将详细列出完整的部署步骤: 1. **启动准备**:将随服务器提供的Systems Management Tools and Documentation version 6.0光盘置入服务器光驱,随后设定服务器以光驱作为启动设备。此环节旨在确保服务器在启动阶段能够读取安装光盘内容。 2. **语言设定**:服务器启动后,选定简体中文作为部署语言,并确认接受许可协议条款。 3. **时区选择**:在部署期间,需设定时区为北京、香港、重庆或乌鲁木齐,依据实际地理位置进行适配选择。 4. **系统类型选择**:随后,需选定计划部署的操作系统,支持的版本包括Server 2003 SP2、Server 2003 SP2 64位版本、Windows 2003 SBS SP2、Server 2008、Windows 2008 SBS/EBS x64版本等,以及多种Red Hat和SUSE Linux版本。 5. **RAID设定**:若服务器出厂时已预设RAID配置,则可选择跳过此步骤。若需重新设定RAID,操作时需格外小心,因为这一过程可能引发硬盘数据遗失。 6. **引导分区规划**:设定引导分区的大小,通常C盘建议预留至少20GB的空间,具体容量需根据系统需求进行调整。 7. **网络设定**:网络设定可在系统部署完成后执行,部署期间建议暂时拔除...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧