String和StringBuffer类可以说是Java代码中最常见、最常用的类。例如:
String s;
s += "helloWorld";
一、使用String类
有时写得太频繁和习惯,通常会忽略性能方面的留意。有时这种性能差异是相当大的。例如:
String s = "";
for(int i = 0;i<10000;i++){
s += i;
}
我们经常可以看到这种形势的代码,不同的就是循环次数的多少了。
由于String对象是不可变对象,对于每个s+=i的执行,在jdk中都是通过新创建一个StringBuffer或StringBuilder对象来实现的,例如:s += (new StringBuilder(String.valueOf(s)).append(i).toString();
二、使用StringBuffer类
当循环次数太大的时候,很显然创建这些对象的效率是很低下的。因为一个更好的方式是:
StringBuffer sb = new StringBuffer();
for(int i =0;i<10000;i++){
sb.append(i);
}
使用StringBuffer,就可以避免每循环一次创建一个对象过程,所以相对上面那种情况,效率将大为改善。
三、使用带容量设置的StringBuffer类
使用StringBuffer有一个问题就是容量的问题,缺省情况下StringBuffer的容量是16,这个可以通过sb.cabacity()来验证。当容量超过缺省值以后,就会执行扩展容量的操作,其实就是新创建一个字符数组,然后把旧的内容拷到这个数组中。
所以当结果字符串的长度不大时,使用缺省容量的效率是很好的,但是如果结果字符串长度太大时,这种频繁的扩展、拷贝所消耗的时间也会变得越来越大。此时就推荐使用预设置的容量大小。
还是上面这个例子,我们可以计算出最终需要的容量大小大约是:29890,所以我们可以如下创建StringBuffer对象,例如:
StringBuffer sb = new StringBuffer(29890);
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
这样实现的效率将更高,节省很多扩展、拷贝的时间。
最后是三个耗时的一个比较:
long currentTimeMillis = System.nanoTime();
StringBuffer sb = new StringBuffer(29890);
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
System.out.println(System.nanoTime() - currentTimeMillis);
currentTimeMillis = System.nanoTime();
sb = new StringBuffer();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
System.out.println(System.nanoTime() - currentTimeMillis);
currentTimeMillis = System.nanoTime();
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
System.out.println(System.nanoTime() - currentTimeMillis);
下面是几次运行的结果:
4203048
6921829
2417991113
4154998
4753676
1684508227
6677105
8720662
1559196490
注意:尽量不要在循环中使用 += 或 -=,这样是最低效的
分享到:
相关推荐
在选择String、StringBuffer和StringBuilder时,需要根据实际的应用场景来决定。如果是在多线程环境下进行字符串操作,且操作比较频繁,推荐使用StringBuffer以保证线程安全。如果是在单线程环境下,或者虽然多线程...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...
在Java编程语言中,`String`与`StringBuffer`是两个重要的字符串处理类,它们各自具有独特的特性和用途,尤其在面试或笔试中常被提及作为考察应聘者对Java基础知识掌握程度的重要知识点。 ### `String`类:不可变性...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
根据给定的信息,本文将对`String`与`StringBuffer`在Java中的使用进行详细的解析...通过以上的分析与讨论,我们可以更好地理解和掌握`String`与`StringBuffer`在实际开发中的应用技巧,从而写出更高效、更可靠的代码。
1. **单线程环境**:在这种情况下,推荐使用 **StringBuilder**,因为它不提供线程安全机制,所以在性能上优于 StringBuffer 和 String。 2. **多线程环境**: - 如果需要修改字符串内容,则应选择 **...
通过上述示例可以看出,`StringBuffer`不仅能够有效地处理字符串的分割和提取,还能方便地进行字符串内容的修改和插入,适用于需要频繁操作字符串的应用场景。 #### 六、结论 综上所述,`String`和`StringBuffer`...
最后,让我们总结一下 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别和用法。String 类型是不可变的对象,性能不好,适合不需要修改的字符串对象。StringBuffer 类型是可变的对象,性能好,...
在Java编程语言中,`String`和`StringBuffer`类是处理字符串的两个核心类,它们各自具有不同的特性和用途。本篇文章将深入探讨这两个类的初步支持,以及它们在实际编程中的应用。 首先,`String`类是不可变的,意味...
### Java中的String、StringBuffer和Math类 #### String类详解 **String类**在Java中扮演着极其重要的角色,主要用于处理不可变的字符序列。它不仅功能强大而且使用广泛,几乎所有的Java应用程序都会涉及到字符串...
在Java编程语言中,`String`与`StringBuffer`是非常重要的数据类型,被广泛应用于处理文本数据。本文将深入探讨这两个类的基本特性以及它们之间的区别。 #### 一、String特性及重要概念 1. **不可变性...
String、StringBuffer 和StringBuilder 的详细介绍 一、String 篇 1、String 基本介绍 String 类代表字符串。 Java 程序中的所有字符串文字(例如”abc”)都被实现为此类的实例。String 是用来保存字符串的,...
在Java编程语言中,String和StringBuffer是两个重要的类,它们在处理文本数据时有着显著的区别。String类代表不可变的字符序列,一旦创建,其值就不能改变。这意味着每次对String对象进行修改(如拼接操作)都会创建...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。下面将详细解析这三个类的区别。 首先,`String`类是最基础的字符串处理类,它被设计为不...
"Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...
熟练运用`String`、`StringBuffer`进行字符串操作,理解数组和集合容器的数据结构及其应用场景,以及如何在多线程环境中正确处理数据库`Connection`,都将有助于你在面试中脱颖而出。通过深入学习和实践,你可以...
Java中的字符串处理是编程中常见的任务,涉及到三个主要的类:String、StringBuffer和StringBuilder。它们之间的主要区别在于线程安全、性能和可变性。 首先,`String`类是不可变的,这意味着一旦创建了一个`String...
总之,掌握`String`、`StringBuffer`和`StringBuilder`的用法,理解`Tomcat`的工作原理,以及清楚`Cookie`、`Session`和`localStorage`、`sessionStorage`的区别,对于Java后端开发和Java Web应用的构建是基础且关键...