首先讲获得字符串对象的方式有两种,一种是直接使用字符串常量,一种是使用new关键字创建,但它们之间是有一些区别,如下运行实例:

 String s1 = new String("Hello");
String s2 = new String("Hello"); String s3 = "Hello";
String s4 = "Hello"; System.out.printf("s1 == s2 : %b%n", s1 == s2);
System.out.printf("s3 == s4: %b%n", s3 == s4);
System.out.printf("s1 == s3 : %b%n", s1 == s3);
System.out.printf("s2 == s3 : %b%n", s2 == s3);
输出结果:
 s1 == s2 : false
s3 == s4: true
s1 == s3 : false
s2 == s3 : false

从以上结果可以看出,“==”运算符比较的是两个引用是否指向相同的对象,由此可见s1和s2指向的是不同的对象,s3和s4指向了相同的对象。

Java中的不可变字符串String常量,采用字符串池(String Pool)管理技术,字符串池是一种字符串驻留技术。采用字符串常量赋值时(见代码第4行),如下图所示,会字符串池中查找"Hello"字符串常量,如果已经存在把引用赋值给s3,否则创建"Hello"字符串对象,并放到池中。根据此原理,可以推定s4与s3是相同的引用,指向同一个对象。

但此原理并不适用于new所创建的字符串对象,代码运行到第1行时,会创建"Hello"字符串对象,而它并没有放到字符串池中。代码第2行又创建了一个新的"Hello"字符串对象,s1和s2是不同的引用,指向不同的对象。

其次,String、StringBuffer、StringBuilder三者中 ,就运行速度而言,StringBuilder最高,StringBuffer次之,最后是String。造成这种情况的原因是String是由final修饰的字符串常量,而StringBuffer和StringBuilder是字符串变量,即字符串常量一旦创建之后就无法改变,(但实际应用中我们是经常在改变它的值)当我们每次改变字符串常量的时候,都会生成一个新的String对象,所以如果是经常改变内容的字符串最好不要用String字符串常量,因为每次生成对象都会对系统性能产生影响。

而StringBuffer和StringBuilder就不同了,它们是字符串变量,创建后是可以改变的,我们每次操作的结果都是它对象本身,因此效率也会更高。

最后,从线程安全的角度来看,StringBuilder是非线程安全的,而StringBuffer是线程安全的。因为在StringBuffer中,有很多方法是被synchronized关键字修饰的(因此也就限制了它的性能),所以如果在多线程应用时,应尽量使用StringBuffer从而保证线程安全,避免一些不必要的错误;当对线程安全没有必要的要求时,例如单线程下,可使用StringBuilder来提高系统性能。

另外,可能有人会有疑问,既然String是final修饰类型,确可以进行重新赋值或+等操作呢? 
因为String的+操作实际是调用了StringBuffer的append方法进行,然后又通过StringBuffer的toString()操作重新赋值的。

 
 

[ Java学习基础 ] String、StringBuffer、StringBuilder比较学习的更多相关文章

  1. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  2. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  3. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  4. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  5. 在JAVA中,String,Stringbuffer,StringBuilder 的区别

    首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String ...

  6. Java学习之String StringBuffer StringBuilder区别

    1.String:对象长度是不可变的,是线程安全. 2.StringBuffer:对象长度是可变的,是线程安全. 3.StringBuilder:对象长度是可变,不是线程安全.

  7. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

  8. 探秘Java中的String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  9. 转发: 探秘Java中的String、StringBuilder以及StringBuffer

    原文地址 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家 ...

  10. 探秘Java中的String、StringBuilder以及StringBuffer(转载)

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...

随机推荐

  1. node.js应用脚手架:koa2、sequelize、mysql

    自制了一个 nodejs 应用的脚手架. 基于 koa2 的,所以需要保证 node 环境至少为 7.6.0 吸取了以前的踩坑教训,添加了守护进程,确保应用不会因为异常导致网站直接挂掉(使用了 for ...

  2. java多线程(二)-线程的生命周期及线程间通信

    一.摘要    当我们将线程创建并start时候,它不会一直占据着cpu执行,而是多个线程间会去执行着这个cpu,此时这些线程就会在多个状态之间进行着切换. 在线程的生命周期中,它会有5种状态,分别为 ...

  3. 【Spring系列】自己手写一个 SpringMVC 框架

    参考文章 一.了解SpringMVC运行流程及九大组件 1.SpringMVC的运行流程 1)用户发送请求至前端控制器DispatcherServlet 2)DispatcherServlet收到请求 ...

  4. android之SVG制作与应用

    文章解析及例子:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0825/3362.html 工具:Photoshop CC+sv ...

  5. [SDOI2014]旅行

    洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...

  6. slf4j 与 log4j2 基本用法

    简单的说 log4j2 是log4j2的升级版,解决了部分性能问题和部分死锁问题,其使用方式与使用配置与log4j相同. 建议使用maven依赖直接使用log4j2 <dependency> ...

  7. jQuery 文档操作之prepend() 和prependTo()方法.

    //prepend() $("#btnpre").click(function(){ //该方法在被选元素的开头(仍位于内部)插入指定内容. $("div"). ...

  8. JAVA_SE基础——72.自定义线程

    进程 :  正在执行的程序称作为一个进程.  进程负责了内存空间的划分.   问题: windows号称是多任务的操作系统,那么windows是同时运行多个应用程序吗?从宏观的角度: windows确 ...

  9. Mego(04) - Mego入门

    本教程演示创建一个简单的数据库访问及更新数据的示例以便于初步了解下Mego框架的使用. 文中使用Visual Studio 2017版本. 创建Visual Studio项目 创建一个名为 MegoS ...

  10. SpringBoot单元测试中的测试方法执行顺序

    一.忽略方法@ignore 二.执行顺序@FixMethodOrder(MethodSorter.JVM) 我们在执行JUnit测试用例时,有时需要按照定义顺序执行单元测试方法,比如如在测试数据库相关 ...