今天在CSDN的高校俱乐部里看到了“Java基础水平測试(英文)”。感觉自己学了java这么久,想看下自己的java水平究竟是个什么样。測试结果就不说了,反正是慘不忍睹。

看了一下结果分析,关于StringBuilder、StringBuffer、String类的三道题所有答错。所以就查阅了一些资料记录一下。

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象。不仅效率低下,并且大量浪费有限的内存空间,StringBuffer是可变类。和线程安全的字符串操作类。不论什么对它指向的字符串的操作都不会产生新的对象,StringBuffer和StringBuilder类功能基本相似。

1. String 类


   String的值是不可变的,这就导致每次对String的操作都会生成新的String对象。不仅效率低下,并且大量浪费有限的内存空间。

String a = "a"; //如果a指向地址0x0001
a = "b";//又一次赋值后a指向地址0x0002。但0x0001地址中保存的"a"依然存在。但已经不再是a所指向的,a 已经指向了其他地址。
因此String的操作都是改变赋值地址而不是改变值操作。

2. StringBuffer

StringBuffer是可变类,和线程安全的字符串操作类。不论什么对它指向的字符串的操作都不会产生新的对象。 每一个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时。不会分配新的容量,当字符串大小超过容量时,会自己主动添加容量。

StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串。并在后面预留了16字节的空缓冲区。

3.StringBuilder

   StringBuffer和StringBuilder类功能基本相似。主要差别在于StringBuffer类的方法是多线程、安全的。而StringBuilder不是线程安全的,相比而言,StringBuilder类会稍微快一点。对于常常要改变值的字符串应该使用StringBuffer和StringBuilder类。



4.线程安全


StringBuffer 线程安全

StringBuilder 线程不安全



5.速度

普通情况下,速度从快到慢:StringBuilder>StringBuffer>String,这样的比較是相对的,不是绝对的。

6.总结

(1).假设要操作少量的数据用 = String

(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

java中StringBuilder、StringBuffer、String类之间的关系的更多相关文章

  1. 全面解释java中StringBuilder、StringBuffer、String类之间的关系

    StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...

  2. Java中int和String类型之间转换

    int –> String int i=123; String s=""; 第一种方法:s=i+""; //会产生两个String对象 第二种方法:s=S ...

  3. java中静态类与普通类之间区别

    所谓静态,指以static关键字修饰的,包括类,方法,块,字段. 非静态,指没有用static 修饰的. 一.静态类的特点 1.全局唯一,任何一次的修改都是全局性的影响 2.只加载一次,优先于非静态 ...

  4. 在Java中如何用String类中的indexof方法得到一个词的出现频率

    public class Test{ public static void main(String[] args) { String s="hello jack hello look me ...

  5. java学习之Java中JDK,JRE和JVM之间的关系(转载)

    最近要重新抓一下java,大量扫技术文档,保存下来供自己查阅.以下转载自http://www.cnblogs.com/xiaofeixiang/p/4085159.html 初学JAVA很容易被其中的 ...

  6. pygame中多个class类之间的关系

    用一个实例介绍一下有关pygame中不同类之间的通信,详细介绍在代码段有标注,感兴趣的可以复制代码试试: import pygame import sys # -------------------- ...

  7. Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  8. Java中JDK,JRE和JVM之间的关系-(转载)

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  9. Java中有趣的String、StringBuffer与StringBuilder

    String介绍 String类属于java.lang包中,String类是不可变类,任何对String的改变都会引发新的String对象的生成. 创建String的两种方式: 1.通过构造器创建:S ...

随机推荐

  1. Android开发之控制手机音频

    本实例通过MediaPlayer播放一首音乐并通过AudioManager控制手机音频.关于AudioManager的具体解释可參照:Android开发之AudioManager(音频管理器)具体解释 ...

  2. CDH使用秘籍(一):Cloudera Manager和Managed Service的数据库

    背景 从业务发展需求,大数据平台须要使用spark作为机器学习.数据挖掘.实时计算等工作,所以决定使用Cloudera Manager5.2.0版本号和CDH5. 曾经搭建过Cloudera Mana ...

  3. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  4. BZOJ3170: [Tjoi2013]松鼠聚会

    [传送门:BZOJ3170] 简要题意: 给出n个点的坐标,规定两个点的距离=max(|x1-x2|,|y1-y2|) 要求选出一个点,使得这个点到所有点的距离和最小 题解: 切比雪夫转换例题 将一个 ...

  5. Troubleshooting Failed Requests Using Tracing in IIS 8.5

    https://docs.microsoft.com/en-us/iis/troubleshoot/using-failed-request-tracing/troubleshooting-faile ...

  6. 蓝桥杯-- 历届试题 核桃的数量 (gcd)

      历届试题 核桃的数量   时间限制:1.0s   内存限制:256.0MB        问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋 ...

  7. db file sequential read等待事件 --转载

    db file sequential read db file sequential read等待事件有3个参数:file#,first block#,和block数量.在10g中,这等待事件受到用户 ...

  8. Spark on YARN运行模式(图文详解)

    不多说,直接上干货! 请移步 Spark on YARN简介与运行wordcount(master.slave1和slave2)(博主推荐) Spark on YARN模式的安装(spark-1.6. ...

  9. javascript在html直接传值

    function getUrlParam(url, name) { var pattern = new RegExp("[?&]" + name + "\=([^ ...

  10. css——外部样式

    外部样式 先建立一个css文件,如下: 然后开始写代码,不要加<style> 然后可以在html文件中的<head>内引用:<link rel="stylesh ...