关于StringBuilder创建对象的问题

学习至死qaq 2021-05-20 04:49:53
String s1=“a”; s1=new StringBuilder("a").appent("b").toString();
以上内容在执行过程中创建了几个对象
...全文
23372 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
得一以生 2021-05-27
  • 打赏
  • 举报
回复 1
引用 10 楼 学习至死qaq 的回复:
引用 1 楼 得一以生 的回复:
四个,1: "a" , 2: new StringBuilder , 3:"b" , 4: "ab"
Stringbuilder不应该是对原字符串本身进行操作的嘛,为什么append("b")后创建了一个新的对象"ab"?不应该是"ab"替换之前的"a"吗
String s1=“a”; s1=new StringBuilder("a").append("b").toString(); String s1=“a”-------由于"a"不存在,所以在常量池中创建了"a"-----+1 new StringBuilder("a")--------创建了一个StringBuilder对象,由于"a"上一步已创建,所以不再重复创建------+1 .append("b")---------由于"b"不存在,所以在常量池中创建了"b",而append方法返回的是this,返回原来的StringBuilder对象-------+1 .toString()--------由于"ab"不存在,所以在常量池中创建了"ab"--------+1 所以,创建了4个对象
学习至死qaq 2021-05-27
  • 打赏
  • 举报
回复
引用 1 楼 得一以生 的回复:
四个,1: "a" , 2: new StringBuilder , 3:"b" , 4: "ab"
Stringbuilder不应该是对原字符串本身进行操作的嘛,为什么append("b")后创建了一个新的对象"ab"?不应该是"ab"替换之前的"a"吗
滚动的小薯条 2021-05-21
  • 打赏
  • 举报
回复
引用 3 楼 学习至死qaq 的回复:
[quote=引用 2 楼 滚动的薯条 的回复:]四或者五个 。 String s1=“a”创建两个,常量池一个(有则不创建),堆一个 new StringBuilder("a")产生“a” 一个 new StringBuilder("a").appent("b") 产生“ab”一个 toString()产生 “新ab”
String s1="a";不应该是1个对象吗,s1不应该是对象吧[/quote] String s1=“a”的创建逻辑是 先生成一个String对象,然后去找字符串常量池是不是有a这个值, 如果有,则直接拿;如果没有则去创建一个char[]对象,将1这个值存进去,并将1存到常量池中。 也就是说会生成一个char[]对象和一个string对应的instanceOOP
学习至死qaq 2021-05-21
  • 打赏
  • 举报
回复
引用 2 楼 滚动的薯条 的回复:
四或者五个 。 String s1=“a”创建两个,常量池一个(有则不创建),堆一个 new StringBuilder("a")产生“a” 一个 new StringBuilder("a").appent("b") 产生“ab”一个 toString()产生 “新ab”
String s1="a";不应该是1个对象吗,s1不应该是对象吧
滚动的小薯条 2021-05-21
  • 打赏
  • 举报
回复
四或者五个 。 String s1=“a”创建两个,常量池一个(有则不创建),堆一个 new StringBuilder("a")产生“a” 一个 new StringBuilder("a").appent("b") 产生“ab”一个 toString()产生 “新ab”
得一以生 2021-05-21
  • 打赏
  • 举报
回复
四个,1: "a" , 2: new StringBuilder , 3:"b" , 4: "ab"
Little BigUs 2021-05-21
  • 打赏
  • 举报
回复 1
引用 2 楼 滚动的薯条 的回复:
四或者五个 。 String s1=“a”创建两个,常量池一个(有则不创建),堆一个 new StringBuilder("a")产生“a” 一个 new StringBuilder("a").appent("b") 产生“ab”一个 toString()产生 “新ab”
String s1 = "a";应该只创建一个在常量池,new String ("a");才是在常量池没有"a"对象的时候创建两个,有的话创建一个
爱喝青梅酒 2023-04-30
  • 举报
回复
@Little BigUs String s1=a ,没有在堆空间创建吧,只有new的时候才放到堆空间
冰思雨 2021-05-21
  • 打赏
  • 举报
回复
引用 1 楼 得一以生 的回复:
四个,1: "a" , 2: new StringBuilder , 3:"b" , 4: "ab"
这个是正解
滚动的小薯条 2021-05-21
  • 打赏
  • 举报
回复
引用 5 楼 学习至死qaq 的回复:
[quote=引用 4 楼 滚动的薯条 的回复:][quote=引用 3 楼 学习至死qaq 的回复:][quote=引用 2 楼 滚动的薯条 的回复:]四或者五个 。 String s1=“a”创建两个,常量池一个(有则不创建),堆一个 new StringBuilder("a")产生“a” 一个 new StringBuilder("a").appent("b") 产生“ab”一个 toString()产生 “新ab”
String s1="a";不应该是1个对象吗,s1不应该是对象吧[/quote] String s1=“a”的创建逻辑是 先生成一个String对象,然后去找字符串常量池是不是有a这个值, 如果有,则直接拿;如果没有则去创建一个char[]对象,将1这个值存进去,并将1存到常量池中。 也就是说会生成一个char[]对象和一个string对应的instanceOOP[/quote] StringBuilder不应该是对原字符串本身进行操作的嘛,为什么append("b")后创建了一个新的对象"ab"?不应该是"ab"替换之前的"a"吗[/quote] append("b")确实不会产生新的对象,同toString才会,new StringBuilder("a")会产生两个对象一个String a和StringBuilder,
学习至死qaq 2021-05-21
  • 打赏
  • 举报
回复
引用 4 楼 滚动的薯条 的回复:
[quote=引用 3 楼 学习至死qaq 的回复:][quote=引用 2 楼 滚动的薯条 的回复:]四或者五个 。 String s1=“a”创建两个,常量池一个(有则不创建),堆一个 new StringBuilder("a")产生“a” 一个 new StringBuilder("a").appent("b") 产生“ab”一个 toString()产生 “新ab”
String s1="a";不应该是1个对象吗,s1不应该是对象吧[/quote] String s1=“a”的创建逻辑是 先生成一个String对象,然后去找字符串常量池是不是有a这个值, 如果有,则直接拿;如果没有则去创建一个char[]对象,将1这个值存进去,并将1存到常量池中。 也就是说会生成一个char[]对象和一个string对应的instanceOOP[/quote] StringBuilder不应该是对原字符串本身进行操作的嘛,为什么append("b")后创建了一个新的对象"ab"?不应该是"ab"替换之前的"a"吗

62,636

社区成员

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

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