建议52:推荐使用String直接量赋值

一、建议

String对象的生成方式有两种:

1.通过new关键字生成,String str3 = new String(“中国”);

2.直接声明,如:Str str = "a"。

对于String对象来说,极力推荐使用直接声明的方式。

二、分析

Java为了避免在一个系统中大量产生String对象,于是就设计了一个字符串池(也有叫做字符串常量池String Pool或String Constant Pool或String Literal Pool),在字符串池中所容纳的都是String字符串对象。

String创建规则:创建一个字符串时,首先没有检查池中是否有字面值相等的字符串。

如果有,则不再创建,直接返回池中该对象的引用。

如果没有则创建之,然后放到池中,并返回新建对象的引用。

三、场景

实例程序:

 public class Client {
public static void main(String[] args) {
String str1 = "中国";
String str2 = "中国";
String str3 = new String("中国");
String str4 = str3.intern(); // 两个直接量是否相等
boolean b1 = (str1 == str2);
// 直接量和对象是否相等
boolean b2 = (str1 == str3);
// 经过intern处理后的对象与直接量是否相等
boolean b3 = (str1 == str4); System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
}
}

运行结果:

true
false
true

创建str1时,字符串池中没有对象,则创建"中国"字符串放到池中,待再创建str2时,池中已经存在对象,则返回该对象的引用。则str1==str2为真。

创建str3时,直接声明一个String对象是不检查字符串池的,也不会把对象放到池中,所以str3==str1为假。

创建str4时,intern会检查当前对象在对象池是否有字面值相同的引用对象,如果有则返回对象,如果没有则放置到对象池中,并返回当前对象。所以str1==str4为真。

利用对象池,可以提高效率,同时也减少了内存空间.

对象放到池中会不会产生线程安全问题?

Java已经考虑到了,String类是一个不可变Immutable对象,其实有两层意思:

一是String类是final类,不可继承,不可能产生一个String的子类.

二是在String类提供的所有方法中,如果有String返回值,就会新建一个String对象,不对原对象进行修改,这也就保证了原对象是不可变的.

放到池中是不是需要考虑垃圾回收问题?

不用考虑,虽然Java的每个对象都保存在了堆内存中,但是字符串池非常特殊,它在编译期已经决定了其存在JVM的常量池Constant Pool,垃圾回收器是不会对它进行回收.

通过上面:

Java在字符串的创建方面确实提供了非常好的机制,利用对象池不进可以提高效率,同时也减少了内存空间占用,建议大家在开发中使用直接量赋值的方式,除非确有必要才新建立一个String对象.

最新文章

  1. 关系型数据之LinQ基本查询
  2. 其他(一)Visual Studio 自动排版快捷键
  3. Liferay7 BPM门户开发之29: 核心kernel.util包下面的通用帮助类ParamUtil、GetterUtil使用
  4. 更改Magento的base url
  5. Lock file left by a different patch, OPatch will not try re-using the lock file.
  6. Python3基础 assert关键字 成功啥事没有,失败了就报错
  7. 有关嵌入式linux的注意点总结
  8. 1189: [HNOI2007]紧急疏散evacuate - BZOJ
  9. iOS开发——Swift篇&Swift关键字详细介绍
  10. linux下登录出现-bash-3.2#解决办法
  11. cf D. Renting Bikes
  12. hibernate利用mysql的自增张id属性实现自增长id和手动赋值id并存
  13. [置顶] MVC输出缓存(OutputCache参数详解)
  14. C语言第十次作业
  15. 2017 清北济南考前刷题Day 4 afternoon
  16. Building gRPC Client iOS Swift Note Taking App
  17. Python从入坑到放弃!
  18. Vue基础之计算属性
  19. C Runtime Library、C  Runtime
  20. Android.FamousBlogs

热门文章

  1. 现代程序设计——homework-08
  2. 修改Oracle 10g Express Edition默认的8080端口
  3. ocp 1Z0-051 23-70题解析
  4. CodeForces 689A Mike and Cellphone (模拟+水题)
  5. jQuery基础学习4——jQuery容错性
  6. 剑指OFFER之矩形覆盖(九度OJ1390)
  7. Display:Block
  8. nginx缓存优先级(缓存问题者必看)
  9. PHP AJAXFORM提交图片上传并显示图片源代码
  10. JQuery UI Widget Factory官方Demo