文档章节

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

jimyao
 jimyao
发布于 2016/01/29 14:48
字数 870
阅读 9
收藏 0

建议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,把汉字转换为拼音然后实现自己的排序算法。

© 著作权归作者所有

共有 人打赏支持
jimyao
粉丝 17
博文 66
码字总数 27856
作品 0
朝阳
私信 提问
《编写高质量代码 改善Java程序的151个建议》读书笔记

第7章 泛型和反射 建议94 不能初始化泛型参数的数组 Java的泛型在编译期有效,在运行期被删除,所有的泛型参数类型在编译后都会被擦出掉 Java泛型类和普通类在编译后都指向同一字节码 第8...

OSC_fly
08/23
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
07/25
0
0
《编写高质量代码:改善java程序的151个建议》笔记

前言: 很喜欢作者的前言: 对于java,我非常感激,从物质上来说,它给了我工作,帮我养家糊口;从精神上来说,它带给我无数的喜悦、困惑、痛苦、无奈------一如我们的生活。 第10章:性能和...

城固如春
2017/11/01
0
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部