开发者社区> 蘑菇街隐修> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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的非线程同步的版本,二者的方法差不多,只是一个线程安全(适用于多线程)一个没有线程安全(适用于单线程)。

 

如果本文对您有帮助,点一下右下角的“推荐”

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
提高 Java 效率的 35 个小技巧,用了的都说好。。
代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。
230 0
Java交互界面实现计算器开发设计【附函数源码】
使用Java开发的简易计算器,包括加、减、乘、除、平方、立方、小数等运算,适合学习GUI编程实践,
37 0
如何用Java实现位图转矢量图?
通过前面几篇图片转字符、灰度图的文章介绍之后,接下来我们再来看一个有意思的东西,基于前文的基础,实现位图转矢量图的功能
456 0
Java实现GIF图转字符动图实例demo
上一篇文章介绍了静态图转字符的实现demo;接下来也该是动态图转字符的demo了 从前面几篇文章的学习过程中,要想实现这个功能就属于信手拈来了 单张图转字符完成之后,动图无非是每一张静态图都转一遍,保存最后的结果即可 这里我们就不介绍基础的JDK写法了(感兴趣的可以到前面几篇文章中获取),我们直接进入进阶的玩法 接下来我们借助开源项目 github.com/liuyueyi/qu… 来迅速的实现输出Gif字符图
77 0
Java实现图片转字符输出示例demo
前面几篇博文介绍了使用jdk来对图片做一些有意思的转换,接下来我们再介绍一个有意思的玩法,直接根据图片,输出一个二维字符数组,实现用字符来实现绘画的场景 各位小伙伴可能都有看到过一些有趣的注释,比如大佛,美女之类的,通关本文,相信你也很可以很简单的实现类似的场景 作者:一灰灰 链接:https://juejin.cn/post/7033040253673799711 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
43 0
Java实现Gif图转字符动图
前面介绍了两篇基于jdk实现图片灰度处理、转字符图片的操作,接下来我们在将之前的能力扩展一下,支持将一个gif图灰度化或者转gif字符图 本文的实现主要在前面两篇文章的基础上来实现,推荐没有看过的小伙伴也可以瞅一眼
50 0
SpringBoot整合Java Mail实现Outlook / Office365发送邮件
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。
3012 0
java后端实现token自动续期,这方案有点优雅
在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个token。前端(如vue)在接收到 token后会将token存储到LocalStorage中。
1372 0
在Java中实现完整的单例模式
个人认为单例模式是设计模式中最简单也是最常用的一种,是对有限资源合理利用的一种方式。这个模式看似简单,但是其中蕴含了关于并发、类加载、序列化等一系列深层次的知识,如果理解不够深,就有可能在高并发时遇到难以预期的异常,或者会造成资源浪费。
46 0
Java NIO三件套之Buffer实现原理解析
目前很多高性能的Java RPC框架都是基于Netty实现的,而Netty的设计原理又离不开Java NIO。本篇笔记是对NIO核心三件套:缓冲区(Buffer)、选择器 (Selector)和通道(Channel),其中之一的缓冲区Buffer实现原理的学习总结
70 0
+关注
蘑菇街隐修
专注分布式消息中间件和存储系统
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA反射原理以及一些常见的应用
立即下载
Java开发手册1.3.0
立即下载
Java开发手册1.0.0版
立即下载