博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String直接赋值和使用new的区别
阅读量:6448 次
发布时间:2019-06-23

本文共 1135 字,大约阅读时间需要 3 分钟。

String str1 = "ABC";
String str2 = new String("ABC");

 

String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象(“ABC”),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝,Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。

String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”。

在JVM里,考虑到垃圾回收(Garbage Collection)的方便,将heap(堆)划分为三部分:young generation(新生代)、tenured generation (old generation)(旧生代)、permanent generation(永生代)。

字符串为了解决字符串重复问题,生命周期长,存于pergmen中。

JVM中,相应的类被加载运行后,常量池对应的映射到JVM运行时的常量池中。

考虑下面的问题:

String str1 = new String("ABC");String str2 = new String("ABC");

str1 == str2的值是true还是false呢?false

String str3 = "ABC";String str4 = "ABC";String str5 = "AB" + "C"; str3 == str4 //true str3 == str5 // true
String a  = "ABC";String b = "AB";String c = b + "C"; System.out.println( a == c );//false

a、b在编译时就已经被确定了,而c是引用变量,不会在编译时就被确定。

应用的情况:建议在平时的使用中,尽量使用String = “abcd”;这种方式来创建字符串,而不是String = new String(“abcd”);这种形式,因为使用new构造器创建字符串对象一定会开辟一个新的heap空间,而双引号则是采用了String interning(字符串驻留)进行了优化,效率比构造器高。

 

转载地址:http://oklwo.baihongyu.com/

你可能感兴趣的文章
SecureCRT光标丢失问题
查看>>
2016美国旧金山QCon:参会后记
查看>>
10分钟掌握数据库建模
查看>>
流媒体02:Linux交叉编译VLC-2.2.1
查看>>
log_format directive may be used only on http level
查看>>
Magento API v1 之webservice
查看>>
hibernate 模糊查询及not in子查询
查看>>
图像处理------ 二值膨胀及应用
查看>>
CentOS安装及配置TFTP服务器
查看>>
基于用户投票的排名算法(三):Stack Overflow
查看>>
值类型与引用类型(上)
查看>>
Activiti-Explorer 用户名与密码
查看>>
Winform 调用WCF客户端,所有服务端方法在运行的时候均找不到(编译没有问题)...
查看>>
Entity Framework 5.0系列之Code First数据库迁移
查看>>
数据库相关知识
查看>>
日志服务器设计
查看>>
Xshell生成密钥key(用于Linux 免密码登录)
查看>>
滑动到底部或顶部响应的ScrollView实现
查看>>
自己动手丰衣足食之征服jQuery插件编写
查看>>
基于业务单元的开发与部署模式
查看>>