String是在代码中非常常见的一种数据类型.它能直接像基本类型一样直接赋值(String str = "test"),也能像引用类型一样创建一个实例(String str = new String("test")),当然毫无疑问String是引用类型.

(1)Sring str = "test";  //此种方式会在字符串常量池中创建一个"test'"常量,当有一个新的变量同样也赋值为"test"时,这个新的变量也指向了这个"test"常量.

(2)String str = new String("test");  //此种方式会在堆内存中new一个"test"对象实例,详细分析见下文.


(1)只有使用引号包含文本的方式创建的String对象之间使用"+"连接产生的新对象才会被加入到字符串池中。

String str = "hello" + "world";        //这才会在字符串池中创建一个"helloworld"字符串,而不是去堆中创建一个String对象。

(2)对于所有包含new方式创建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中。

String str1 = "hello";
String str2 = "world";
String str = str1 + str2; //此时str产生的"helloworld"并不会在字符串池中,而是在堆中创建一个String对象。

综上.

tring str1 = "hello";
String str2 = "world";
String str3 = "hello" + "world";
String str4 = str1 + str2;
//str3 == str4 ->false,原因见上。str4是在堆中创建的String对象,str3是在字符串池中创建的的"helloworld"

但是!以上的情况是一般情况!

special1.这个例子实际仔细一分析也很好理解,STR1和STR2都是final常量,它们在类编译时就已经确定。

public class Demo {
public static final String STR1 = "hello";
public static final String STR2 = "world"; public static void main(String[] args) {
String str3 = "hello" + "world";
String str4 = STR1 + STR2;
System.out.println(str3 == str4); //true
}
}

special2.这个例子和上个例子不同在于final常量被声明的时候,并没有马上给它赋值。在str4被赋值前STR1+STR2是何值都还不确定,STR1和STR2在赋值前实际上就是一个变量而不是一个常量,那么str4就不能在编译期被确定,而只能在运行时被创建。

public class Demo {
public static final String STR1 ;
public static final String STR2 ;
static {
STR1 = "hello";
STR2 = "world";
} public static void main(String[] args) {
String str3 = "hello" + "world";
String str4 = STR1 + STR2;
System.out.println(str3 == str4); //false
}
}

回到开始提到的问题:

String str = new String("test"); //创建了几个对象?

2个。在类加载时会创建一个"xyz"对象放到字符串常量池中,在运行时会从常量池中赋值一份到堆中,并且将堆中这个对象的引用交给s1持有。

最新文章

  1. IE浏览器不能自动显示PDF文件的解决办法
  2. Open Cascade DataExchange IGES
  3. tomcat一闪而过------Java EE环境部署
  4. 微信web开发者工具调试
  5. C#从SQL server数据库中读取l图片和存入图片
  6. Android Studio 首坑 Gradle sync failed: Cause: error in opening zip file 的错误
  7. poj 3177-3352边双联通
  8. asp.net -mvc框架复习(7)-基于MVC搭建用户登录项目框架
  9. maven依赖大全
  10. java类与对象(属性,方法)的使用
  11. jenkins+svn完整打包并上传到linux服务器上
  12. css把容器级别(div...)标签固定在一个位置(在页面最右边)
  13. 潭州课堂25班:Ph201805201 django框架 第一课 环境搭建 (课堂笔记)
  14. Javascript高级编程学习笔记(5)—— JS操作符
  15. Python 的黏包问题
  16. Spring系列(一):Spring的基本概念及其核心
  17. 构建更好的客户端 JavaScript 应用
  18. Delphi for iOS开发指南(1):在Mac上配置你的开发环境
  19. VM下--Linux根分区磁盘扩容
  20. python安装包提示error: option --single-version-externally-managed not recognized

热门文章

  1. 【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题
  2. 老李分享:QTP的录制原理以及实现
  3. 各位Coder看过来
  4. 线段树 poj 3468
  5. 【iOS系列】-多图片多线程异步下载
  6. jQuery animate()动画效果
  7. 【C和指针】笔记1
  8. ultraedit中文乱码解决方案
  9. NodeJs系列二:你好,世界
  10. IOS——触摸事件 视图检测和事件传递