关闭

【优雅编程之道】之字符串的5点建议

标签: java字符串优雅编程
1380人阅读 评论(7) 收藏 举报
分类:

开心一笑

【一个本科男找了一个女博士。新春佳节,本科男绐女博士发了一个520元的红包,附言:我爱你。稍后,女博士给本科男发了一个5.20元的红包,并附言:我爱你多一点!本科男感叹道:有文化,太可怕,少花钱,会说话!】

视频教程

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

视频地址:http://edu.csdn.net/lecturer/994

提出问题

项目中如何优雅使用字符串 ???

唯美图片

解决问题

初始化字符串的两种选择比较

例:

//第一种初始化字符串方式
String str = "ay";
String str2 = "ay";
System.out.println(str == str2);
//第二种初始化字符串方式
String newStr = new String("ay");
System.out.println(str == newStr);

//打印结果
true
false

通过上面实例,我们可以看到:第一种初始化字符串的方法,事实上是把字符串放到常量池里面。当创建 str2 字符串的时候,它会到常量池寻找,找不到,就创建之。找到了,就把对象引用传给 str2 。因为 String 类是 final 的且 String 的所有方法有返回的 String 字符串的,都会重新新建一个新的 String 对象。所有不会有线程安全问题。综上所述,建议大家在以后开发过程中,使用第一种方式,优雅的创建字符串。

字符串常量equals时候将字符串常量写在前面

判断字符相等是最常见的情景,例如:

@Test
public void test(){

    String str = "ay";
    if(str.equals("ay")){
        System.out.println("不推荐写法");
    }
    String str2 = null;
    if("ay".equals(str2)){
        System.out.println("推荐写法");
    }
    if(str2.equals("ay")){
        System.out.println("出现 NullPointerException 异常");
    }
}

如果我们把字符常量 ay 写在 equals 前面,即使两个字符串不相等,也不会产生空指针异常。可以达到优雅的判断是否相等。

for循环中不写字符串拼接

我们知道,for循环中,除了不要做数据库连接,查询数据库和处理异常外。在循环次数比较多的for循环中,我们也不要利用 + 号去拼接字符串。具体例子如下:

程序清单 1-1

@Test
public void test(){
    String str = "ay";
    for(int i=0;i<Integer.MAX_VALUE;i++){
         str = str + i;
    }
}

这个问题也是老生常谈的了。具体解决方法如下:

  • 根据具体的业务场景,使用 StringBuffer(线程安全)或者 StringBuilder(非线程安全)
  • 使用数组

    程序清单 1-1

    @Test
    public void test(){
    //第一种解决方法
    StringBuilder stringBuilder = new StringBuilder(Integer.MAX_VALUE);
    //第二种解决方法
    String[] strArray = new String[Integer.MAX_VALUE + 1];
    stringBuilder.append(“ay”);
    strArray[0] = “ay”;
    for(int i=0;i

设置容量参数提高系统性能

对于 StringBuffer(线程安全)或者 StringBuilder(非线程安全),都有相应的构造方法:

程序清单 1-1

public StringBuilder(int capacity) {
    super(capacity);
}

如果我们可以事先知道需要拼接的字符串长度,设置容量参数,防止 StringBuffer 在源码内部进行一系列复杂的内存复制操作,影响性能。

如上面的

StringBuilder stringBuilder = new StringBuilder(Integer.MAX_VALUE);

实现高性能的字符串分割

实现字符串的分割的方法有很多种,常用的是 split ,StringTokenizer ,indexOf 和 substring 的配合,以及一些开源工具类,如:StringUtils。它们各有优缺。

@Test
public void test(){
    //数据初始化
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<10000;i++){
        sb.append(i).append(";");
    }
    String originStr = sb.toString();
    //第一种分隔字符方法
    long startTime = System.nanoTime();

    String[] splitArray =  originStr.split(";");
    for(int i=0,len = splitArray.length;i<len;i++){
        String temp = splitArray[i];
    }
    long endTime = System.nanoTime();
    System.out.println("the cost of split is :" + (endTime - startTime));
    //第二种分隔字符方法
    System.out.println("--------------------------------------------");
    originStr = sb.toString();
    startTime = System.nanoTime();
    StringTokenizer st = new StringTokenizer(originStr,";");
    while(st.hasMoreTokens()){
        st.nextToken();
    }
    endTime = System.nanoTime();
    System.out.println("the cost of stringTokenizer is :" + (endTime - startTime));
    //第三种分隔字符的方法
    System.out.println("--------------------------------------------");
    originStr = sb.toString();
    startTime = System.nanoTime();
    while (true){
        int index = originStr.indexOf(";");
        if(index < 0) break;
        String origin = originStr.substring(0,index);
        originStr = originStr.substring(index + 1);
    }
    endTime = System.nanoTime();
    System.out.println("the cost of indexOf is :" + (endTime - startTime));

    //第四种分隔字符的方法
    System.out.println("--------------------------------------------");
    originStr = sb.toString();
    startTime = System.nanoTime();
    String[] utilSplit = StringUtils.split(originStr,';');
    for(int i=0,len = utilSplit.length;i<len;i++){
        String temp = utilSplit[i];
    }
    endTime = System.nanoTime();
    System.out.println("the cost of StringUtils.split is :" + (endTime - startTime));

}

运行结果:

the cost of split is :35710479
--------------------------------------------
the cost of stringTokenizer is :11992643
--------------------------------------------
the cost of indexOf is :323050471
--------------------------------------------
the cost of StringUtils.split is :59026333

从上面例子可以看出,字符分割的性能,由高到低的排序为:StringTokenizer > split ,StringUtils.split > indexOf 。有些书籍写着 indexOf 的性能是最高的,但是按照我的测试,index的性能是最差的。但是事物都有两面性,从上面的例子也可以看出,虽然 StringTokenizer 的性能高,但是代码量多,可读性差,而 split 代码相对就整洁多了。

读书感悟

来自《我脑袋里的怪东西》

  • 让一千万人聚集在伊斯坦布尔的东西是生计、利益、帐单,但支撑这茫茫人海的只有一样东西,那就是爱!
  • 身处城市熙熙攘攘的人群中,也可能感到孤独,但是让城市成为城市的东西,也恰恰是这种能够在人群中隐藏自己头脑里的怪念头的可能。
  • 有时觉得,自己正在经历人生中最幸福的岁月,但只把这种感觉存放在脑海的一个角落里。因为担心,如果总想着自己幸福,就可能失去它。

经典故事

【一只乌鸦坐在树上,整天无所事事。一只小兔子看见乌鸦,就问:“我能象你一样整天坐在那里,什么事也不干吗?”乌鸦答道:“当然啦,为什么不呢?”于是,兔子便坐在树下,开始休息。突然,一只狐狸出现了。狐狸跳向兔子……并把它给吃了。这个故事的寓意是……要想坐在那里什么也不干,你必须坐(做)得非常非常高】

大神文章

【1】《Agile Java》
【2】《Java程序性能优化 让你的Java程序更快、更稳定》
【3】《Thinking in Java (Java编程思想)》
【4】《编写高质量代码:改善Java程序的151个建议》

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

11
4
查看评论

优雅编程之这样使用CollectionUtils,你就“正常”了(三十五)

开心一笑【公路上发生了一起车祸——乌龟踩伤了窝牛。 警察正在调查事故原因说窝牛:乌龟是怎么撞 到你的? 正吊着石膏的窝牛惊惶未定地回忆道:我不记得了,当时他的速度太快了!】提出问题CollectionUtils在真实项目中常用的方法有哪些???解决问题CollectionUtils在真实项目中,...
  • huangwenyi1010
  • huangwenyi1010
  • 2016-12-17 12:36
  • 2069

我录制的《Java优雅编程之道》视频教程,已经发布了

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……视频地址:http://edu.csdn.net/lecturer/994课程介绍《Java之优雅编程之道》主要是针对有一定基础的Java学员。本课程主...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-06-13 23:19
  • 1004

【优雅编程之道】之异常的6点建议

开心一笑【想来想去,还是努力挣钱更靠谱,不然心情不好时,只能买两瓶啤酒医一袋鸡爪在路边嗷嗷的哭,努力挣钱的话,就能躺在幽美的山中温泉里敷面膜止住眼泪。努力挣钱我还可以去纽约哭,去伦敦哭,去巴黎哭,去罗马哭,边潇洒边哭,想怎么哭就怎么哭】提出问题如何优雅的写异常???解决问题禁止捕获非受检异常至于什么...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-02-22 07:03
  • 785

【优雅编程之道】之集合的8点建议

集合 前言 大家好,我是Ay,今天我们学习的内容是集合。 集合作为java开发工作中一个非常重要的组成部分,基本和java字符串使用频率一样高。 我看过很多的代码,但对于集合来说,大部分都没有使用的很好。因此,我根据我们公司的项目,总结了以下几点建议,希望可以帮助各位学员彻底掌握如何使用...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-06-22 20:33
  • 720

【优雅编程之道】之方法的9点建议

开心一笑【一个去看演出的朋友回来了。 我问他:“怎么样演出好看吗?” 朋友:“人太多了,我去晚了,在后面什么也看不见,只能跳起来看几眼, 后来跳累了就不看了,也没有什么好看的。” 这时我另外一个朋友也回来了。 我:“你也看戏去了?” 另外一个朋友:“恩!” 我:“好不好看?” 另外一...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-03-08 23:27
  • 1878

【优雅编程之道】之数组的7点建议

开心一笑【小明喜欢上一个刚来的女同事,她是医院里的检验师,为了套近乎就经常跑到她科室去倒开水喝,熟了后就发现她随身的小包包里总放着一把小水果刀,于是我问她:你总放把小刀包里干嘛?她答道:下夜班防身啊!虽然刀小,但是我清楚的知道人的大动脉在哪里!我去!这特么以后还敢撩吗?】提出问题如何优雅的使用数组?...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-02-20 19:03
  • 564

【优雅编程之道】之注释的9点建议

开心一笑【今天朋友当着我们的面甩一张卡给他媳妇,说随便刷,我们心想他何时变得这么man,只见他媳妇甩起卡就往他脸上扔,说:“有脾气给信用卡,给我什么公交卡”。我们在一旁笑爆了!神回复:他的意思应该是让媳妇有多远滚多远吧?】提出问题如何写出优雅的注释???解决问题优雅的注释温习Java的三种类型注释J...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-02-19 22:51
  • 583

【优雅编程之道】之枚举的6点建议

开心一笑【“请放过我吧!我太太是不会相信我遇到强盗的。”“放过你,我太太会相信我今天没有收获吗?”哎,我想说一群苦逼的孩啊,同时怕妻男,相煎何太急!】提出问题在真实项目中如何使用枚举???解决问题前言大家好,我是 Ay,今天我们的讲课内容是枚举。枚举在真实的工作中,用的并不是很多,而且也不会很复杂。...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-06-23 07:09
  • 720

编程之道之优雅变量命名

编程之道之优雅变量命名     在编写程序过程中,尤其是程序代码量很大时,一个优美而恰当的变量命名方式以及变量定义的作用域,无论是对提高变量的作用范围,提升程序的简洁性,还是简洁你的程序思路方面的作用都非常大。变量名的命名规则一般遵守表意强,表作用域强的原则。我自...
  • fly2004jun
  • fly2004jun
  • 2012-07-13 15:09
  • 747

【优雅编程之道】之IO流,序列化的4点建议

开心一笑 提出问题 解决问题 序列化与反序列化 前言 大家好,我是 Ay,今天我们的讲课内容是 IO流,序列化与反序列化。 在工作中,写IO流的代码比较少,一般是在文件上传,下载,excel文件导入导出等等才会使用到。但是一旦系统在IO流出现问题,后果是不堪设...
  • huangwenyi1010
  • huangwenyi1010
  • 2017-06-23 07:59
  • 820
    个人资料
    • 访问:419126次
    • 积分:5616
    • 等级:
    • 排名:第5582名
    • 原创:201篇
    • 转载:0篇
    • 译文:0篇
    • 评论:313条
    个人教程

    CSDN视频教程

    个人信息
    博客专栏