[笔记]改善Java程序的151个建议---第四章 字符串

本文详细介绍Java中字符串的各种操作技巧,包括String、StringBuffer与StringBuilder的区别及应用场景,字符串拼接方法对比,正则表达式的高效使用,以及编码问题的解决方案。

建议52:推荐使用String直接量赋值
String str = ''a';    //直接量复制
String str = new String("a");  //对象复制
字符串池,容纳所有String字符串对象。
intern方法会检查当前对象在对象池中是否有字面值相同的引用对象,如果有则返回池中的对象。如果没有则放置到对象池中,并返回当前对象。

String是final类,不可继承
String提供的所有方法中,如果有String返回值,就会建立一个新的String对象,不会对原来的对象修改。

建议53:注意方法中传递参数要求
public class StringUtils{
     //删除字符串
     public static string remove(String source, String sub){
          return source.replace(sub, "");
     }
}
//replaceAll传递的第一个参数是正则表达式

建议54:正确使用String,StringBuffer,StringBuilder
CharSequence接口有3个实现类:String,StringBuffer,StringBuilder

String类是不可改变的量,创建后不能修改。
StringBuffer是一个可变字符串序列,在内存中保存的是一个有序的字符序列(char类型数组),其对象值是可变的。
StringBuffer sb = new StringBuffer("a");
sb.append("b");
//sb初始化值是a,在append后,其值变成ab

String s = "a";
s = s + "b";
//s初始化是a,加号运算后s修改为"ab"的引用,初始化的"a"对象没有改变,变量s指向了新的引用地址。

StringBuffer和StringBuilder基本相同,区别是:StringBuffer是线程安全的,StringBuilder是线程不安全的。

应用场景
字符串不经常变化用String
频繁字符串计算,并多线程用StringBuffer
频繁字符串计算,并单线程用StringBuilder,如SQL拼装,JSON封装。

建议55:注意字符串位置
String str1 = 1+2+"apples";
String str2 = "apples"+1+2;
str1的值3apples,str2的值apples12

Java对加号的处理机制,在使用加号计算的表达式中,遇到String字符串,所有数据都会转换为String类型拼接。如果是原始数据,则直接拼接,如是对象,则调用toString方法的返回值拼接。

建议56:自由选择字符串拼接方法
字符串3种拼接方法:
加号,concat方法,StringBuffer(StringBuilder)效率最高

建议57:推荐在复杂字符串操作中使用正则表达式
字符串操作,追加,合并,替换,倒序,分割。对大量文本字符的处理,正则表达式提高效率,性能和准确性。

建议58:强烈建议使用UTF编码
(1)Java文件是通过IDE工具创建,编码格式是GBK.
(2)通过javac生产.class文件是UTF-8编码的UNICODE文件。UTF是UNICODE的存储和传输格式。可以声明GBK,则OS按照GBK读取.java文件。字符变量由GBK编码转变为UNICODE格式。
(3)通过操作系统默认字符集编码格式,重新编码变量的所有字节。UNICODE和GBK没有映射关系,不能自动转换。如果,OS是GBK,则JVM按照GBK读取了UNICODE的两个字节。

解决办法2个
(1)修改代码,指定UTF-8
(2)修改OS编码方式。
同一编码方式,要么GBK,要么UTF-8

GB2312,GBK,GB18030

建议59:对字符串排序持一种宽容的心态
对经常使用的汉字排序,用Collator类。
一些开源项目pinyin4j,把汉字转换为拼音然后实现自己的排序算法。

转载于:https://my.oschina.net/jimyao/blog/611340

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值