Java字符串连接效率

简介: 字符串操作是编写程序中最常见的行为,本文对String、StringBuilder、StringBuffer三个类在字符串处理方面的效率进行分析。      Java中最常见也是应用最广泛的类就是String类。

     字符串操作是编写程序中最常见的行为,本文对String、StringBuilder、StringBuffer三个类在字符串处理方面的效率进行分析。

     Java中最常见也是应用最广泛的类就是String类。

     String:Strings are constant; their values cannot be changed after they are created.

     这是JDK对String的解释,意思是:String是常量,一旦创建后它的值不能被修改。

     先看String对象是如何创建的:

     String str1 = “abc”;

     String str2 = new String(“abc”);

     这是我们常见的两种形式。

     第一种方式创建的字符串会放在栈里,更确切的是常量池中,常量池就是用来保存在编译阶段确定好了大小的数据,一般我们定义的int等基本数据类型就保存在这里。其具体的一个流程就是,编译器首先检查常量池,看看有没有一个“abc”,如果没有则创建。如果有的话,则则直接把str1指向那个位置。

     第二种创建字符串的方法是通过new关键字,还是java的内存分配,java会将new的对象放在堆中,这一部分对象是在运行时创建的对象。所以我们每一次new的时候,都会创建不同的对象,即便是堆中已经有了一个一模一样的。

     下面的程序将验证上面的说法。

 1 String str1 = "abc";
 2 String str2 = new String("abc");
 3 
 4 String str3 = "abc";
 5 String str4 = new String("abc");
 6 
 7 System.out.println(str1==str2);//false
 8         
 9 System.out.println(str1 == str3);//true
10 System.out.println(str2 == str4);//false
11 // When the intern method is invoked, if the pool already contains a
12 // string equal to this String object as determined by the
13 // equals(Object) method, then the string from the pool is returned.
14 // Otherwise, this String object is added to the pool and a reference to
15 // this String object is returned.
16 str2 = str2.intern();
17 System.out.println(str1==str2);//true
18 
19 false
20 true
21 false
22 true

     以上程序中用两种方式创建的4个对象,”==”比较的是地址,从结果可以看到str1和str3相同,指向同一个对象。而str2和str4比较返回结果是false,说明str2和str4指向的不是同一个对象。

     (上面用到了一个比较少见的方法:intern。在str2调用了intern方法后对str1和str2进行比较返回true,可以从代码注释中看明白,intern方法返回常量池中内容和该对象相同的对象,如果常量池中不存在,则将该对象加入到常量池中。)

     String对象是不变的,那为什么可以进行str+=”abc”这样的操作?其实类似这样的操作是新生成了一个String对象,包含str和abc连接后的字符串。

1 package test;
2 
3 public class StringTest {
4     public static void main(String[] args) {
5         String str1 = "abc";
6         str1 += "123";
7     }
8 }

     从编译之后的class可以看出编译器自动引入了StringBuilder类,通过它的初始化方法创建了StringBuilder对象,通过append方法添加了内容,调用toString返回连接后的对象。以上内容证明了String对象是不可变的,连接操作实际是返回了新的对象。如果是循环多次进行连接,将不断的创建StringBuilder对象,append新内容,toString成String对象。这就带来了String类处理字符串更改操作的效率问题。

 1 public class StringTest {
 2     public static void main(String[] args) {
 3         long start, end;
 4 
 5         StringBuilder strBuilder = new StringBuilder(" ");
 6         start = System.currentTimeMillis();
 7         for (int i = 0; i < 100000; i++) {
 8             strBuilder.append(" ");
 9         }
10         end = System.currentTimeMillis();
11         System.out.println("StringBuilder append: " + (end - start) + "ms");
12 
13         String str = " ";
14         start = System.currentTimeMillis();
15         for (int i = 0; i < 100000; i++) {
16             str += " ";
17         }
18         end = System.currentTimeMillis();
19         System.out.println("String +: " + (end - start) + "ms");
20     }
21 }

     可以看到String和StringBuilder在效率方面的差距。

     StringBuffer:A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified.

     StringBuilder:A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization.

     StringBuffer是可变的、线程安全的字符串。StringBuilder就是StringBuffer的非线程同步的版本,二者的方法差不多,只是一个线程安全(适用于多线程)一个没有线程安全(适用于单线程)。

 

如果本文对您有帮助,点一下右下角的“推荐”
目录
相关文章
|
27天前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
44 1
|
2天前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
42 4
|
14天前
|
存储 SQL 分布式计算
Java连接阿里云MaxCompute例
要使用Java连接阿里云MaxCompute数据库,首先需在项目中添加MaxCompute JDBC驱动依赖,推荐通过Maven管理。避免在代码中直接写入AccessKey,应使用环境变量或配置文件安全存储。示例代码展示了如何注册驱动、建立连接及执行SQL查询。建议使用RAM用户提升安全性,并根据需要配置时区和公网访问权限。具体步骤和注意事项请参考阿里云官方文档。
|
12天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
17天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
21天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
17 7
|
23天前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
27天前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
|
28天前
|
存储 Java API