String字符串是Java中最常用的数据结构.
"+"在Java中已被String类重载.所以我们常见是用"+"来连接字符串.
如:
String test = " the first number is " + 0;
在JDK5.0以后还提供一个类StringBuilder(JDK1.4中只提供了StringBuffer),它也可以提供类似"+"的功能.
[StringBuilder和StringBuffer的区别是前者是线程不安全的,后者是线程安全的,所以从效率上来说前者要比后者高]
StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃.StringBuffer要用在全局变量中,
上面我们讨论了两者的区别.下面我们来比较StringBuilder和"+"的效率区别...
如果一个简单的字符串的拼接,应该说StringBuilder和"+"的效率是差不多的,因为在JVM编译过程中,它首先就是将"+"编译成StringBuilder的引用来append.
public static void main(String[] args){
String result = " hello" + "javaeye"+" " + 1234567890;
System.out.println(result);
}
编译完后我们用Jad反编译/.class后我们可以看到所有的"+"号全被StringBuilder代替.
String result = (new StringBuiler("hello")).append("javaeye").append(" ").append(1234567890).toString();
所以我们说在这种情况下使用"+"和使用StringBuiler效率差不多.我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。
但在for循环中我们再来测试一下二者的效率.
String result = "";
Random r = new Random();
for(int i=0; i< 10;i++){
result = result + r.nextInt(1000)+ "";
}
System.out.println(result);
此时我们会看到如下的情形:
result = (new StringBuiler(String.valueOf(result))).append(r.nextInt(1000)).append(" ").toString();
虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下:
String result = "";
Random r = new Random();
StringBuilder sb = new StringBuilder();
for(int i=0; i<10 ; i++){
sb.append(r.nextInt(1000));
sb.append("");
}
result = sb.toString();
System.out.println(result);
此外在循环中也不要和StringBuiler混用"+"号;以上代码在JDK5.0下测试通过.如果是JDK1.4,则将StringBuilder替换为StringBuffer().
总结:
如果在循环中尽量少用new对象来创建对象,这样会导致大量对象的创建,类似的地方还有:
伪代码
int length = xxxList.size();
for(int i=0;i<length;i++}{......}
//和将得到length放到循环里取的性能就不一样
for(int i=0;i<xxxList.size();i++){......}
分享到:
相关推荐
`String`、`StringBuffer`和`StringBuilder`都是用于构建和操作字符串的类,但它们之间存在重要的差异。这些差异主要体现在对象的不可变性、线程安全性和性能方面。 首先,`String`类是最基础的字符串类,它的特点...
* String、StringBuilder、StringBuffer + String:不可变字符串 + StringBuilder:可变字符串,线程不安全 + StringBuffer:可变字符串,线程安全 * 重载和重写的区别 + 重载:同名方法,参数列表不同 + 重写...
在Java中,我们可以使用StringBuilder或StringBuffer类进行字符串拼接。例如,如果你有一个SQL插入语句,你可能会这样做: ```java StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO table_name ...
- 使用StringBuilder或StringBuffer进行字符串拼接,避免大量的字符串连接操作导致的内存开销。 8. **错误处理**: - 需要对输入数据进行有效性检查,如检查金额是否为合法的数字,日期是否符合格式等,并在出现...
`StringBuffer`和`StringBuilder`可变,它们在内存中直接修改,`StringBuffer`在多线程环境下是线程安全的,`StringBuilder`则不是,但在单线程环境中性能优于`StringBuffer`。 7. **字符串反转**:可以使用`...
在处理大量字符串拼接时,建议使用StringBuilder或StringBuffer以提高效率。 3. String与StringBuilder/StringBuffer: - String是不可变的,每次修改都会创建新的对象,消耗资源。StringBuilder/StringBuffer则...
- StringBuilder与StringBuffer都是可变的,它们用于构建和修改字符串,尤其是处理大量字符串操作时,比String更高效。StringBuffer是线程安全的,StringBuilder则不是。 4. 运行时异常与一般异常: - 运行时异常...
- 在多线程环境下,`StringBuffer`是线程安全的,而`StringBuilder`不是,但在单线程环境中,`StringBuilder`的性能优于`StringBuffer`。 4. **运行时异常与一般异常**: - 运行时异常是程序运行时可能出现的常见...
4. **使用StringBuilder或StringBuffer**:在字符串拼接时,避免使用"+"运算符,因为每次连接都会创建新的字符串对象。StringBuilder和StringBuffer是线程安全的,适用于多线程环境,比直接使用"+"更快。 5. **方法...
以Java为例,我们可以使用StringBuilder或StringBuffer来构造SQL语句。在程序中,我们可以先定义一个基础的SQL模板,然后根据需要添加WHERE子句的条件。例如: ```java String sql = "SELECT * FROM table_name "; ...
两者的区别在于线程安全性:`StringBuilder`是非线程安全的,而`StringBuffer`是线程安全的,但在线程不安全的场景中,`StringBuilder`通常有更好的性能。 3. **HashSet与HashMap** 当需要快速查找某个字符串是否...
String、StringBuilder和StringBuffer是用于字符串操作的类,其中String是不可变的,而StringBuilder和StringBuffer是可变的,StringBuffer比StringBuilder更慢但线程安全。 18. Java的数据类型:Java的基本数据...
`StringBuilder`和`StringBuffer`在内存中可变,适合大量字符串操作,尤其在多线程环境中使用`StringBuilder`(单线程)或`StringBuffer`(多线程)能提高性能。 4. **运行时异常与一般异常**:运行时异常是程序...
StringBuffer sql = new StringBuffer("SELECT id, name, department, leader FROM employee WHERE 1=1"); if (name != null && name.trim().length() > 0) { sql.append(" AND name='" + name.trim() + "'"); } if...
- 详细介绍了 Java 中字符串的操作方法,包括 StringBuilder 和 StringBuffer 类。 - **第十四章:探索 java.lang 包**(Exploring java.lang) - 讲解了 java.lang 包中的核心类和接口,如 Object、String、Math ...
- **StringBuilder/StringBuffer**:可变对象,适合大量字符串操作,多线程环境下使用StringBuffer,单线程环境下StringBuilder效率更高。 4. **异常处理**: - **运行时异常**:如ArithmeticException,程序运行...
12. **StringBuilder and StringBuffer**: 都是用来处理字符串的类,区别在于线程安全。`StringBuilder` 在非多线程环境下性能更好,`StringBuffer` 在多线程环境下更安全。 13. **System**: 提供了与系统相关的...
1. **执行速度**:`StringBuilder`相比`StringBuffer`更快,因为在`StringBuilder`中未实现同步机制,因此在单线程环境中性能更优。 2. **线程安全性**:`StringBuilder`是线程非安全的,而`StringBuffer`是线程安全...
2. **StringBuilder或StringBuffer**:对于大量字符串拼接,可以使用`StringBuilder`或线程安全的`StringBuffer`,通过`append()`方法动态添加内容。例如: ```java StringBuilder sb = new StringBuilder(); sb...