一、简介

String:不可变字符序列

StringBuffer:线程安全的可变字符序列

StringBuilder:非线程安全的可变字符序列

二、示例分析

【示例1】

String A = "123";
String B = "123";
String C = "456";
String D = new String("123");

String B = "123";先检查“123”在字符串常量池中是否存在,如果存在将B指向已有的“123”,如果不存在(如C),则在常量池中新加入“456”;

String D = new String("123");其中“123”也指向常量池中的“123”;

String A = "123";
String B = "123";
System.out.println(A==B); String C = new String("123");
System.out.println(A==C); String D = new String("123");
System.out.println(C==D);

输出结果:(“==”比较的是地址是否相同)

true
false
false

【示例2】

String A = "123";
String B = "456";
String AB = A+B;
String C = "123456";
System.out.println(AB==C); String D = "123"+"456";
String F = "123456";
System.out.println(D==F);

输出结果:

false
true

String AB = A+B;首先会在堆中创建一个StringBuilder对象,并将A作为初始化的值;再通过append()方法合并B的值,最后再通过toString()方法在堆中创建一个String对象,将堆地址存放在AB中。

“123”+“456”;在编译期就会自动合并为“123456”,所以D与F指向的是同一个地址。

【示例3】

//代码1
String A = "";
for(int i=0;i<100000;i++){
A=A+i;
}
//代码2
StringBuilder B =new StringBuilder("");
for(int i=0;i<100000;i++){
B.append(i);
}

代码1耗时:28067ms

代码2耗时:15ms

A=A+i,进行累加时,会出现和示例二中同样的情况,不停的生成对象,导致性能很差。

B.append(i),不会生成新的对象,只是同一个对象的不停累加。

三、总结

1、能够确定的字符串常量,完全没有必要创建StringBuilder或StringBuffer对象。直接使用字符串常量的"+"连接操作效率最高。

2、StringBuilder和StringBuffer对象的append效率要高于String对象的“+”操作。

3、StringBuilder比StringBuffer的性能稍高,但是StringBuffer线程安全。当有多线程的情况出现时,StringBuffer更安全。

   解释一下,此处所说的线程安全是指StringBuffer调用append、insert等方法时线程安全。线程安全的原因,是因为这些方法都被关键字synchronized修饰。

关键字“synchronized”是为线程同步机制设定的。

每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。

JAVA基础知识|String、StringBuilder、StringBuffer比较的更多相关文章

  1. Java基础之String,StringBuilder,StringBuffer

    在创建字符串的时候总是习惯性的使用String str = "...";,str = str+"abcd";也有听说过StringBuffer,StringBu ...

  2. Java基础之String、StringBuffer、StringBuilder浅析

    Java基础之String.StringBuffer.StringBuilder浅析 一.前言: 位于java.lang包下的String.StringBuilder.StringBuffer一般都是 ...

  3. Java基础知识 String StringBuffer StringBuilder三者的区别(面试题)

    相同点:String.StringBuffer.StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractString ...

  4. 黑马程序员——JAVA基础之String和StringBuffer

    ------- android培训.java培训.期待与您交流! ---------- String类: 字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String str = &quo ...

  5. 黑马程序员----java基础:String与StringBuffer及基本数据类型包装类

    ------- android培训.java培训.期待与您交流! ---------- java中一些基础类比如String.StringBuffer和基本数据类型包装类都是非常常见且使用非常频繁的类 ...

  6. Java基础之String、StringBuffer、StringBuilder

    1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串. 生活中很多数据的描述都采用的是字符串的.而且我们还会对其进行操作. 所以,java就提供了这样的一个类供我们使用. (2) ...

  7. 黑马程序员——【Java基础】——String、StringBuffer和基本数据包装类

    ---------- android培训.java培训.期待与您交流! ---------- 类String---------------------------------------------- ...

  8. JAVA基础知识 String s = new String("ABC") VS String s = "abc"

    一:   String s = new String("ABC")  VS  String  s = "abc" String  s = "abc&q ...

  9. JAVA基础篇—String和StringBuffer

    区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append() ...

随机推荐

  1. 【转载】程序设计过程中SQL语句Where 1=1的作用

    在Asp.Net网站或者Java网站的程序设计的过程中,很多时候我们可以看到拼接SQL语句的写法的时候都可以看到最前面有个Where 1=1这个条件,其实Where 1=1这是个恒等式,SQL语句写成 ...

  2. js中0.1+0.2 与0.3的对比

    Math.abs(0.1+0.2-0.3)<=Number.EPSILON

  3. java读取文件的几种方式性能比较

    //普通输入流读取文件内容 public static long checksumInputStream(Path filename) { try(InputStream in= Files.newI ...

  4. 开源项目hutool之zip_slip漏洞

    今天突然看到了去年写的一篇漏洞分析文章,搬到博客上 ---------------- Hutool是Github上的一个开源项目,是一个java的工具包,对文件.流.加密解密.转码.正则.线程.XML ...

  5. Redis系列之-—内存淘汰策略(笔记)

    一.Redis ---获取设置的Redis能使用的最大内存大小 []> config get maxmemory ) "maxmemory" ) " --获取当前内 ...

  6. 算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了

    最近发现了个好东西,就是一个学算法的好东西,是网易公开课的一个视频. 直通车 这是麻省理工学院的公开课,有中英字幕,感谢网易.. 也可以在App把视频缓存下来之后再放到电脑上面看,因为我这样可以倍速, ...

  7. 如何在windows server2016搭建DHCP服务器

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分 ...

  8. Java基本知识点o(1), o(n), o(logn), o(nlogn)的了解

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  9. python中赋值和浅拷贝与深拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  10. python中json序列化时汉字变成编码的解决方式

    我们在使用json模块时,如果被序列化对象中不包含汉字,当然没有任何问题,但是有汉字会被编译成unicode码: import json dic = {","sex":& ...