Java 高质量编程建议(笔记7)


Ad-52:推荐使用String直接量赋值
    1)一般的对象生成,都是用new创建一个新对象,但是String可以通过赋值类生成对象;
    2)对于String对象,不建议是用new String("")生成对象,而是String var= "";
    3)Java为了避免系统中产生大量的String对象,内部设计一个字符串常量对象池,使用赋值创建一个String对象的时候,首先检查池中是否存在面值相等的字符串,如果有,则不再创建,直接返回池中对象的引用,如果没有则创建之,然后放到池中, 并返回新对象的引用;
    4)String var1 = var1.intern()也可以返回对象的引用,与字符串赋值的处理机制相同;
    5)String类是一个不可变对象,因此多线程不会产生问题
        5.1)String类是final类,不能被继承;
        5.2)String提供的所有方法中,如果有String返回值,就会创建一个String对象,不对原对象进行修改;
    6)Java对象都放在堆内存中,但是String字符串池中的对象特殊,编译的时候,就决定存在JVM的字符串池,垃圾回收器不会对其进行垃圾回收;
   
Ad-53:注意方法中传递的参数要求
    String的replaceAll方法的第一个参数要求是正则表达式,否则无法进行正常的替换;
  
Ad-54:正确使用String、StringBuffer、StringBuilder
    1)CharSequence接口有三个实现类与字符串相关,分别是String、StringBuffer、StringBuilder;
    2)上述三个字符串类型,其内部的实现都是通过char数组来存储字符的每个字符的,但是在操作上却有区别;
    3)String类型对象是不可改变的量,即创建了对象之后,不可修改其值,例如:String var="abcd", 不可能将var修改为"abc",除非重新创建一个对象,并赋值给var;
    4)StringBuilder是一个可变的字符系列,其值时可以修改的;
    5)StringBuffer是一个可变的字符序列,其值是可以修改的,而且StringBuffer的所有方法的线程安全的,即每个方法都加了Synchronized,因此StringBuilder性能要比StringBuffer号;
    6)三种字符串使用场景:
        6.1)String类型对象是不可改变的量,因此建议用于常量,而对于需要字符串拼接的时候,不推荐使用,性能低下;
        6.2)StringBuffer可以用于字符串运算场景(拼接、替换、删除),并且可以用于多线程环境;
        6.3)StringBuilder可以用于字符串运算场景(拼接、替换、删除),但是只能用于单线程环境;
       
Ad-55:注意字符串的位置
    1)Java的表达式中,只要遇到String字符串,则所有的数据类型都变成字符串;
    例如:String var1 = 1 + 2 + "apples";  //其值为"3apples"
          String var2 = "apples" + 1 + 2;   //其值为"apples12"
         
    2)前面讲过关于Java表达式运算的益处的问题,与此类似,原因是Java的表达式中,在遇到更宽泛的类型或者更大数值范围之前,都是按照表达式前部分的类型进行元算的;
    例如 long dist1 = 8 * 300000 * 1000 * 60 * 10L;
         long dist2 = 8L * 300000 * 1000 * 60 * 10;
         dist1的结果将溢出,但是dist2结果正确;
    3)那就是说,表达式在计算过程中,遇到什么类型就用什么类型进行计算,直到出现更宽泛的类型或者更大数值范围的类型之前,表达式计算完毕,才按照赋值要求的类型进行转换;
   
Ad-56:自由选择字符串拼接方法
    1)字符串拼接的方法包括:+,concat,以及StringBuilder和StringBuffer的append方法;
    2)"+"拼接字符串, 虽然编译器已经对"+"拼接字符串做了优化,使用StringBuilder的append方法进行优化,但是每次都需要用toString方法再转换为一个String对象,这样每次拼接都要生成一个StringBuilder对象,每次都要调用toString生成String,效率因此而降低;
    3)concat方法拼接字符串,其内部实现来说,每次要创建一个char数组,然后进行数组拷贝,然后利用数组生成String对象,生成对象的过程使其效率降低;
    4)StringBuilder的append方法,其内部也是通过扩容char数组类实现,但是没有新生成对象,因此性能最好;
   
Ad-57:推荐在复杂字符串操作中使用正则表达式
    Java字符串操作:追加(append)、替换(replace)、倒序(reverse)、分割(split)中,最好使用正则表达式进行匹配,特别是字符串中包含了特殊的字符的时候。
   
Ad-58:注意编码格式,不仅仅是代码的文本,包括代码编译后的class格式,还包括代码中使用的配置数据,推荐使用UTF格式;

Ad-59:对字符串的排序持一种宽容的态度
    1)Arrays工具类的默认排序是通过对象类的compareTo方法进行比较;
    2)对于非英文类型的字符串,排序可能出现不正确,原因是象中文等的其编码与并不是按照其汉语拼音的顺序进行编码的;
    3)Java推荐使用Collator类进行排序,编码是可以指定其语言类型,例如:Comparator c = Collator.getInstance(Local.CHINA);这样可以解决常见的中文字排序,但是还有很多象形文字,无法正常排序;
    4)Java实用的是Unicode编码,中文Unicode字符集源于GB18030,而GB18030源于GB2312发展的,GB2312收录了常见的7000多个汉字,它们是按照拼音排序的,并且是连续的,后来的GBK和GB18030进行扩充,但是无法收录所有的汉字;
   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值