1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的)
2,StringBuilder sb = new StringBuilder();
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String s = a+b+c+d; 这句话创建了几个对象
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c").append("d");这句话创建了几个对象 -------------------------------------------------------------------------------------------
答案是 7 3 0 第一题:“a”“b”“c”“d” “ab”“abc”“abcd”
第二题: “ab”“abc”“abcd”
第三题:因为a”“b”“c”“d”在串池中已经存在,不会创建对象,并且StringBuilder添加字符串的时候跟String
是不一样的,StringBuilder是不会创建对象的(所以说我们在增加字符串长度的时候尽量用StringBuilder,这样会少创建对象,节省资源,提高效率)
所以是0个对象
第一题中如果无(假设之前串池是空的)这句,结果则为一个对象

在JVM中有一个字符串池,它用来保存很多可以被共享的String对象,这样如果我们在使用同样字面字符串时,它就使用字符串池中同字面的字符串。常量池是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。由于常量字符串是在编译的时候就也被确定的,因"a"、"b"、"c"和"d"都是常量,因此变量s1的值在编译时就可以确定。这行代码编译后的与String s1="abcd";是一样的。

下面说说用+连接字符串时的情况

public class TestString {
private static String str = "abc";
public static void main(String[] args) {
String str1 = "a";
String str2 = "bc";
String combo = str1 + str2;
System.out.println(str == combo);
System.out.println(str == combo.intern());
}
}

这个例子用来说明用+连接字符串时,实际上是在堆内容创建对象,那么combo指向的是堆内存存储”abc”字符串的空间首地址,显然str==combo是错误的,而str==combo.intern()是正确的,在String池中也存在”abc”,那就直接返回了,而str也是指向String池中的”abc”对象的。此例说明任何重新修改String都是重新分配内存空间,这就使得String对象之间互不干扰。也就是String中的内容一旦生成不可改变,直至生成新的对象

同时问题也来了,使用+连接字符串每次都生成新的对象,而且是在堆内存上进行,而堆内存速度比较慢(相对而言),那么再大量连接字符串时直接+是不可取的,当然需要一种效率高的方法。Java提供的StringBuffer和StringBuilder就是解决这个问题的。区别是前者是线程安全的而后者是非线程安全的,StringBuilder在JDK1.5之后才有。不保证安全的StringBuilder有比StringBuffer更高的效率

自JDK1.5之后,Java虚拟机执行字符串的+操作时,内部实现也是StringBuilder,之前采用StringBuffer实现。

总结:引用在栈而对象在堆

最新文章

  1. 让你从零开始学会写爬虫的5个教程(Python)
  2. .net的简易多线程处理
  3. DNS的查询流程
  4. EC笔记,第一部分:3.尽量使用const
  5. iOS-运行时机制
  6. javascript trigger触发事件
  7. hdu.5195.DZY Loves Topological Sorting(topo排序 && 贪心)
  8. [hadoop] WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  9. <创建和销毁对象>经验法则——考虑用静态工厂方法代替公有构造方法
  10. Spring的父子容器问题
  11. vim 折叠技巧
  12. Course(简单的字符串处理问题)
  13. jq轮播图插件
  14. [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
  15. 学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现
  16. Python内置函数(51)——hasattr
  17. C++版 - 剑指offer 面试题5:从尾到头打印链表 题解
  18. MVC AOP解决JsonResult返回json时间格式
  19. Windows上的git、github部署及基本使用方法
  20. Oracle安装完成后如何创建表空间及用户

热门文章

  1. cookie,session和token的概念以及区别
  2. JAVA数据库操作回滚小结
  3. Codeforces Round #281 (Div. 2) D(简单博弈)
  4. Java 内存模型简单剖析
  5. oracle 11g安装过程
  6. Tex_安装_在Ubuntu系统下
  7. iOS 弹幕制作
  8. GANs的回顾
  9. Dubbo的Filter实战--整合Oval校验框架
  10. vagrant package制作一个box镜像