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

faxc123 2009-09-17 07:23:06
String str="a"+"b"+"c"+"d"+"e";
...全文
226 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)
串联谐振双有源桥(SR-DAB)DC-DC变换器闭环仿真研究内容概要:本文围绕串联谐振双有源桥(SR-DAB)DC-DC变换器的闭环仿真展开研究,重点探讨其在电力电子系统中的动态响应特性与控制策略。通过对SR-DAB变换器建立数学模型,并结合Matlab/Simulink进行闭环仿真,分析系统在不同工作条件下的电压、电流波形及功率传输效率,验证控制算法的有效性与稳定性。研究涵盖系统建模、控制器设计(如PI控制)、软开关实现条件、抗干扰能力以及动态调节性能,旨在提升变换器在新能源、储能、数据中心供电等场景中的可靠性和能效水平。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、微电网、电力系统仿真等相关领域的科研人员与工程技术人员。; 使用场景及目标:①用于高校及科研机构开展DC-DC变换器控制策略的教学与实验;②为工业界在高效率隔离型功率变换系统的设计与优化提供仿真依据和技术支撑;③服务于数据中心、电动汽车、可再生能源并网等场景下的电源系统研发。; 阅读建议:建议读者结合Matlab代码实践仿真流程,重点关注系统建模与控制器参数整定部分,通过调整负载、输入电压等条件观察系统响应,深入理解闭环控制对变换器性能的影响机制。
内容概要:本文介绍了FastReport VCL/FMX/LCL 2026.2.4版本的更新内容,重点涵盖核心引擎、图形处理、用户界面及导出功能的优化与修复。主要更新包括修复了Developer Express兼容性问题、TfrxSVGGraphic在TImage中的显示问题、PDF/A导出合规性、EMF图像旋转异常,以及ReportTree拖拽功能等问题。同时,部分模块新增了HTMLTags对XLSX导出的支持、内置右键菜单和新图标,并改进了FastCube组件的元素调整体验。此外,还修复了CPP脚本中Result参数名的Bug以及自定义过滤器中OR操作失效的问题。; 适合人群:使用Delphi或Lazarus进行开发,且涉及报表设计与数据展示功能的中高级开发者;尤其适用于需要集成FastReport控件到企业级应用中的技术人员。; 使用场景及目标:①提升报表系统在不同平台(VCL/FMX/LCL)下的稳定性和兼容性;②满足PDF/A标准的文档归档需求;③优化用户交互体验,如拖拽操作与元素缩放;④增强脚本支持与数据集字段识别能力,确保开发效率与功能完整性。; 阅读建议:建议结合官方更新链接和实际项目中使用的FastReport模块对照查看,重点关注自身所用组件(如VCL、FMX或Lazarus版)的具体修复项,及时升级以规避已知问题并利用新特性优化报表功能。

62,621

社区成员

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

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