`
aaronjiu_00
  • 浏览: 67828 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

String和StringBuffer的规则和应用

阅读更多

在Java编程语言中,大家接触最多的,莫过于String和StringBuffer类了吧,这两个类简单到你不屑一顾,但是你在编码实践过程中真正用好它们了吗?下面是我在代码Review过程中总结出来的若干点,和大家分享一下:

  • 避免重复文字
    包含重复的字符串字面的代码通常可以将字符串声明为一个Constant Field得到改善,如果你使用Eclipse,请选中字符串"hello",然后选中菜单“Refactor->Extract Constant...”,OK
    例如:
    public class SomeClass {
    
    	public void someMethod() {
    		someSubMethod("hello");
    		someSubMethod2("hello");
    		someSubMethod3("hello");
    		someSubMethod4("hello");
    	}
    
    	private void someSubMethod(String string) {
    		// TODO Auto-generated method stub
    	}
    
    	private void someSubMethod2(String string) {
    		// TODO Auto-generated method stub
    	}
    
    	private void someSubMethod3(String string) {
    		// TODO Auto-generated method stub
    	}
    
    	private void someSubMethod4(String string) {
    		// TODO Auto-generated method stub
    	}
    
    }
      
  • 字符串实例化问题
    避免使用new关键字实例化字符串对象
    例如:
    public class SomeClass {
    
    	private String someField = new String("something");// 使用String someField = "something"替换
    
    }
      
  • 不必调用String的toString()方法
    避免调用字符串对象的toString()方法
    例如:
    public class SomeClass {
    
    	public String someMethod() {
    		String someStr = "hello";
    		return someStr.toString();// 去掉toString()
    	}
    
    }
     
  • 不要使用低效的字符串追加
    避免在StringBuffer的构造函数或append()方法中连接非文字字符串串。
    例如:
    public class SomeClass {
    
    	public void someMethod() {
    		// 避免这种情况
    		StringBuffer sb = new StringBuffer("tmp = " + System.getProperty("java.io.tmpdir"));
    
    		// 像这样使用
    		StringBuffer sb = new StringBuffer("tmp = ");
    		sb.append(System.getProperty("java.io.tmpdir"));
    	}
    
    }
      
  • 不必要大小写转换
    使用equalsIgnoreCase()的速度比使用toUpperCase/toLowerCase().equals()快得多
    例如:
    public class SomeClass {
    
    	public boolean someMethod(String arg) {
    		// 应该是 "hello".equalsIgnoreCase(arg)
    		return arg.toUpperCase().equals("hello");
    		// 另一个不必要的 toUpperCase()
    		return arg.toUpperCase().equalsIgnoreCase("hello");
    	}
    
    }
     
  • 使用StringBuffer的length()方法
    使用StringBuffer.length()来判断StringBuffer的长度,而不是使用StringBuffer.toString().equals("")或StringBuffer.toString().length() == 来判断
    例如:
    public class SomeClass {
    
    	void someMethod() {
    		StringBuffer sb = new StringBuffer();
    		// 这么用不好
    		if (sb.toString().equals("")) {
    		}
    		// 这么用好
    		if (sb.length() == 0) {
    		}
    	}
    
    }
      
  • 使用char参数追加单个字符
    避免在StringBuffer.append()方法中将单个字符char做为字符串String连接。
    例如:
    public class SomeClass {
    
    	void someMethod() {
    		StringBuffer sb = new StringBuffer();
    		// 避免这种情况
    		sb.append("a");
    
    		// 像这样使用
    		StringBuffer sb = new StringBuffer();
    		sb.append('a');
    	}
    
    }
     
  • 不要连续地追加字面字符串
    连续地调用StringBuffer.append追加String文字
    例如:
    public class SomeClass {
    
    	void someMethod() {
    		StringBuffer buf = new StringBuffer();
    		buf.append("Hello").append(" ").append("World"); // 不好
    		buf.append("Hello World"); // 好
    	}
    
    }
     
  • 使用indexOf(char c)
    当检查单一字符char在字符串中的位置时使用String.indexOf(char),它执行得更快。
    例如:
    public class SomeClass {
    
    	void someMethod() {
    		String s = "hello world";
    		// 避免这种情况
    		if (s.indexOf("d") != -1) {
    
    		}
    		// 这样较好
    		if (s.indexOf('d') != -1) {
    		}
    	}
    	
    }
     
  • 低效的检查空字符串
    String.trim().length()是一种低效的检查字符串为空白blank的方式,因为它创建了一个新的String对象只是为了检查其大小。考虑创建一个静态函数,循环遍历这个字符串,对每个字符检查Character.isWhitespace(),如果发现一个非空白字符,并返回false;其实你可以使用commons-lang包的StringUtils.isBlank()、StringUtils.isNotBlank()、StringUtils.isEmpty()、StringUtils.isNotEmpty()等一系列工具方法。
    例如: 
    public class SomeClass {
    
    	void someMethod(String string) {
    		if (string != null && string.trim().length() > 0) {
    			doSomething();
    		}
    	}
    
    	private void doSomething() {
    		// TODO Auto-generated method stub
    	}
    
    }
     
  • 声明StringBuffer时预设大小不正确
    声明StringBuffer对象时预设大小不正确,可能会导致它在运行时多次重新计算大小。一个无参StringBuffer构造函数以16个字符初始化对象。
    例如:
    public class SomeClass {
    
    	void someMethod() {
    		StringBuffer bad = new StringBuffer();
    		bad.append("This is a long string, will exceed the default 16 characters");// 不好
    		StringBuffer good = new StringBuffer(41);
    		good.append("This is a long string, which is pre-sized");// 好
    	}
    
    }
     
  • 无用的字符串ValueOf
    没有必要调用String.valueOf()将一个整形int等连接到一个字符串;只需直接地使用valueOf()参数。
    例如:
    public class SomeClass {
    
    	public String convert(int i) {
    		String s;
    		s = "a" + String.valueOf(i); // 不好
    		s = "a" + i; // 更好
    		return s;
    	}
    
    }
     
  • 不要使用字符参数构造StringBuffer
    StringBuffer sb = new StringBuffer('c'); 字符char将转换成整数int,以初始化StringBuffer的大小。
    例如:
    public class SomeClass {
    
    	StringBuffer sb1 = new StringBuffer('c'); // 不好
    	StringBuffer sb2 = new StringBuffer("c"); // 较好
    
    }
     
  • 使用equalsTo()比较字符串
    用' == '或'!= '是比较字符串的引用,使用equalsTo()比较字符串实际值
    例如:
    public class SomeClass {
    
    	boolean test(String s) {
    		if (s == "one")
    			return true; // 不好
    		if ("two".equals(s))
    			return true; // 比较好
    		return false;
    	}
    
    }
     
  • 避免将StringBuffer作为实例变量
    StringBuffers可能会增长很快,因此可能成为一个内存泄漏之源(如果所属的类具有较长的生命周期) 。
    例如:
    public class SomeClass {
    
    	private StringBuffer memoryLeak;
    
    }
        
               
1
0
分享到:
评论

相关推荐

    JAVA基础课程讲义

    String和StringBuffer和StringBuilder使用要点 123 时间处理相关类 124 Date时间类(java.util.Date) 124 DateFormat类和SimpleDateFormat类 125 Calendar日历类 126 可视化日历的编写 128 Math类 131 File类 132 ...

    超级有影响力霸气的Java面试题大全文档

     JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要...

    Java入门教程(微学苑)-part1

    2.18 String和StringBuffer的效率对比 38 2.19 StringBuilder类 39 2.20 总结 39 2.21 强调一下编程风格 40 3 Java类与对象 42 3.1 Java类的定义及其实例化 42 3.2 构造方法 42 3.3 创建对象 43 3.4 访问成员变量和...

    java面试题

    String和StringBuffer的区别? 答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    java编程基础,应用与实例

    3.1 代码编写规则 13 3.2 注释 13 3.3 标识符 14 3.4 变量和常量 15 3.5 数据类型 16 3.5.1 基本数据类型 16 3.5.2 对象类型 21 3.6 类型转换 21 3.6.1 自动类型转换 22 3.6.2 强制类型转换 24 ...

    Thinking in Java 中文第四版+习题答案

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Think in Java(中文版)chm格式

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架...

    JAVA_Thinking in Java

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Java初学者入门教学

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    ThinkInJava

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java 编程入门思考

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    thinkinjava

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Thinking in Java简体中文(全)

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java联想(中文)

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java初学者必看

    3.1.2 变量命名规则 3.1.3 变量命名技巧 3.2 关键字 3.3 注释 3.4 数据类型 3.4.1 整型 3.4.2 浮点型 3.4.3 字符型 3.4.4 布尔型 3.5 变量与常量 3.5.1 变量声明 3.5.2 变量赋值和初始化 3.5.3 常量 ...

    Java开发技术大全 电子版

    1.3一个简单的Java应用程序14 1.4一个简单的Java小程序16 1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 ...

Global site tag (gtag.js) - Google Analytics