在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;
}
分享到:
相关推荐
此外,还会涉及方法的定义和调用,以及数组和字符串的操作,包括一维数组的声明、初始化和引用,以及String和StringBuffer类的应用。 面向对象编程是Java的重要特征,学生需要理解类、对象、构造函数的概念,学习...
- Java中String类的不可变性以及String、StringBuffer和StringBuilder的区别和使用场景。 3. Java IO流 - Java IO流的分类,包括字节流(如InputStream和OutputStream)和字符流(如Reader和Writer)。 - Java中...
还要熟练使用String、StringBuffer以及Math和Random类,掌握基本类型包装类的使用,例如Integer、Double等,同时了解Object和Class类在Java中的作用。 数组是Java中的一个重要概念,考生应掌握一维和二维数组的声明...
比如在Java中如何跳出多重嵌套循环,String和StringBuffer的区别,以及final关键字的用法等。 3. 异常处理:这部分知识涉及Java中的异常类层次结构、运行时异常与编译时异常的区别、异常的捕获和处理机制等。例如,...
- **String的语法特性**:String对象是不可变的,拼接操作会创建新的对象,可以使用StringBuilder或StringBuffer进行高效拼接。 - **枚举类Enum**:Java枚举允许定义一组预定义的常量,提供了安全和类型安全的枚举...
9. **深入理解字符串**:String是不可变对象,了解String池,以及何时使用StringBuilder或StringBuffer。 10. **掌握集合框架**:学习ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用。 11. **文件I/O...
与`String`类中的“+”操作符不同,`StringBuffer`使用`append()`方法来添加内容,这不仅简化了代码,还提高了性能,尤其是在循环操作中。 例如: ```java StringBuffer sb = new StringBuffer("Hello"); sb....
- **StringBuilder和StringBuffer**:用于字符串拼接,线程安全的StringBuffer适用于多线程环境。 10. **集合框架** - **List, Set, Queue, Map**:四大接口,分别代表列表、集合、队列和映射。 - **ArrayList, ...
数组是存储一组相同类型数据的容器,而字符串在Java中是常用的数据类型,包括String和StringBuffer。学习者需要掌握它们的定义、操作方法以及相关的函数应用。 第五章枚举和for语句的简化写法引入了枚举类型,这是...
4. 字符串处理:Java提供了String、StringBuffer和StringBuilder三个类来处理字符串。String类是不可变的,每次修改都会产生新的String对象;StringBuffer和StringBuilder类都是可变的,它们之间的区别在于...
- **字符串**:Java中有String和StringBuffer两种类型。String是不可变的,而StringBuffer支持动态修改。了解它们的特性和使用场景很重要。 5. **第五章 枚举与for语句的简化写法**: - **枚举**:Java中用于表示...
Enterprise JavaBeans(EJB)是Java EE平台上的一个组件模型,用于开发和部署可移植的企业级应用。EJB基于JNDI(Java Naming and Directory Interface)、RMI(Remote Method Invocation)和JTA(Java Transaction ...
1. **J2SE基础知识:** 笔试中,华为会重点测试应聘者对J2SE的熟悉程度,包括String和StringBuffer类的使用。例如,了解`indexOf()`, `replace()`, `toString()`, `append()`等方法的含义和应用场景。在解答这类问题...
- Java提供了`String`和`StringBuffer`(或`StringBuilder`)类来处理字符串,`String`适用于不可变的字符串,`StringBuffer`用于频繁修改的字符串操作,以提高性能。 11. **AWT与Swing**: - AWT(Abstract ...
8. **数组与字符串**:数组是存储固定数量同类型数据的集合,字符串是字符序列,Java提供了String和StringBuffer两种主要的字符串类,各有其特点和使用场景。理解数组和字符串的常用方法,如获取长度、连接字符串等...
第八章介绍了字符串处理,Java中字符串是不可变的,通常使用String和StringBuffer类进行操作。 第九至第十章涉及异常处理。异常是程序运行时的错误,Java提供了try-catch-finally结构来捕获和处理异常,也可以通过...
- 异常是程序违反语义规则时抛出的,分为内置异常和自定义异常。 - try-catch-finally结构用于捕获和处理异常。 - throw关键字用于引发异常。 5. 线程同步: - wait():使线程等待,释放锁。 - sleep():使...