[改善Java代码]推荐使用String直接量赋值
建议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直接量赋值的更多相关文章
- [改善Java代码]推荐覆写toString方法
建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...
- [改善Java代码]推荐使用枚举定义常量
枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...
- [改善Java代码]推荐在复杂字符串操作中使用正则表达式
一.分析 字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...
- [改善Java代码]正确使用String,StringBuffer,StringBuilder
CharSequence接口有三个实现类与字符串有关:String,StringBuffer,StringBuffer.虽然它们都与字符串有关,但是其处理机制是不同的. String类是不可改变的量, ...
- [改善Java代码] 推荐使用序列化实现对象的拷贝
建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...
- [改善Java代码]动态加载不适合数组
上一个建议解释了为什么要使用forName,本建议就说说哪些地方不适合使用动态加载. 如果forName要加载一个类,那它必须是一个类------8中基本类型就排除在外.它们不是一个具体的类. 其次它 ...
- [改善Java代码]不要主动进行垃圾回收
建议51: 不要主动进行垃圾回收 很久很久以前,在Java 1.1的年代里,我们经常会看到System.gc这样的调用—主动对垃圾进行回收.不过,在Java知识深入人心后,这样的代码就逐渐销声匿迹了— ...
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- [改善Java代码]非稳定排序推荐使用List
我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet ...
随机推荐
- Android实例-调用系统APP(XE10+小米2)
相关资料:群号383675978 实例源码: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, Sys ...
- HDU 5839 Special Tetrahedron (计算几何)
Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- POJ3126 Prime Path
http://poj.org/problem?id=3126 题目大意:给两个数四位数m, n, m的位数各个位改变一位0 —— 9使得改变后的数为素数, 问经过多少次变化使其等于n 如: 10331 ...
- poj 1543 Perfect Cubes(注意剪枝)
Perfect Cubes Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14901 Accepted: 7804 De ...
- Timus OJ 1997 Those are not the droids you're looking for (二分匹配)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1997 这个星球上有两种人,一种进酒吧至少玩a小时,另一种进酒吧最多玩b小时. 下面n行是 ...
- Webstorm2016激活码[ 转]
转至:http://blog.csdn.net/tingwode2014_/article/details/51063657 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QT ...
- ACID CAP BASE介绍
ACID ACID,是指数据库管理系统(DBMS)在写入/更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性).一致性 ...
- MFC中常用的内容
在程序中更改静态文本内容. GetDlgItem(IDC_STATIC)->SetWindowText("欢迎"); 不用UpdateData(false); 如果提示con ...
- java实现抓取某公司官网新闻
这里先说一下,实习期的一个项目,当时并没有该合作公司的获取新闻的接口,但是项目又急着上线,所以总监就让我来做一个简单的抓取,现将主要的工具类NewsUtil.java贴出来供大家参考. NewsUti ...
- rxjava各种使用场景
1. 数据的三级缓存 final Observable memory = Observable.create(new Observable.OnSubscribe() { @Override publ ...