建议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对象.

[改善Java代码]推荐使用String直接量赋值的更多相关文章

  1. [改善Java代码]推荐覆写toString方法

    建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...

  2. [改善Java代码]推荐使用枚举定义常量

    枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...

  3. [改善Java代码]推荐在复杂字符串操作中使用正则表达式

    一.分析  字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...

  4. [改善Java代码]正确使用String,StringBuffer,StringBuilder

    CharSequence接口有三个实现类与字符串有关:String,StringBuffer,StringBuffer.虽然它们都与字符串有关,但是其处理机制是不同的. String类是不可改变的量, ...

  5. [改善Java代码] 推荐使用序列化实现对象的拷贝

    建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...

  6. [改善Java代码]动态加载不适合数组

    上一个建议解释了为什么要使用forName,本建议就说说哪些地方不适合使用动态加载. 如果forName要加载一个类,那它必须是一个类------8中基本类型就排除在外.它们不是一个具体的类. 其次它 ...

  7. [改善Java代码]不要主动进行垃圾回收

    建议51: 不要主动进行垃圾回收 很久很久以前,在Java 1.1的年代里,我们经常会看到System.gc这样的调用—主动对垃圾进行回收.不过,在Java知识深入人心后,这样的代码就逐渐销声匿迹了— ...

  8. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  9. [改善Java代码]非稳定排序推荐使用List

    我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet ...

随机推荐

  1. Apache Spark GraphX的使用简介

    类似 Spark 在 RDD 上提供了一组基本操作符(如 map, f ilter, reduce), GraphX 同样也有针对 Graph 的基本操作符,用户可以在这些操作符传入自定义函数和通过修 ...

  2. jxse2.6连接外网rdv一直连接不上,而相同的代码用jxse2.7却能连上

    一直以为2.6中的bug会少一些,所以用2.6做开发:之前测试一直是在同一台 机器上,所以没啥问题:最近在外网设置了一个rdv,却一直连不上,困扰了n久,尝试各种方式都不起作用.最后想起以前开发的代码 ...

  3. AVD设置屏幕大小

    相关资料: 1.http://jingyan.baidu.com/article/fedf0737775d2835ac897700.html

  4. 关于Aazure 使用以前保留的vhd创建虚拟机的基本步骤

    1. 删除vm保留vhd(只删除虚拟机记录,不删除磁盘)2. 拷贝vhd以及status文件到指定的存储账号3. 使用拷贝的VHD创建disk4. 从disk创建vm,指定指定vnet以及cloud ...

  5. Laravel Configuration

    Introduction All of the configuration files for the Laravel framework are stored in the app/config d ...

  6. memcached全面剖析–2. 理解memcached的内存存储

    Slab Allocation机制:整理内存以便重复使用 最近的memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存. 在该机制出现以前,内存的分配是通过对所有记录简 ...

  7. Enterprise Library 服务问题

    在使用Enterprise Library而没有注册服务的时候会出现这样的问题,"Editing Post "Failed to create instances of perfo ...

  8. PyQt入门系列(一):Hello World

    开始搞PyQt了,顺便记录一下自己的学习!资料参考某大神的PyQt4 精彩实例分析,以及<征服Python>这本书. 下面是Demo: #-*- coding:utf-8 -*- #编码声 ...

  9. Windows命令大全

    From:http://technet.microsoft.com/zh-cn/library/cc731728(v=ws.10).aspx Adprep Append Arp Assoc At At ...

  10. 通过SCVMM分配SMB 3.0 文件共享

    1.创建SMB群集共享,赋予Hyper-V主机. Hyper-V群集名称.Hyper-V管理员.Hyper-V服务账户完全控制权限 2.VMM提供程序导入 文件服务器(运行方式账户要对文件服务器群集的 ...