String

字符串常量,由String创建的字符内容,长度是不可改变,存放字符的数组被声明为final。

实际上String类操作字符串是通过建立一个StringBuffer,然后调用append();最后再toString()转换为String,效率上要低一些。并且原来的对象需要被回收,影响性能。

为什么String要设计为不可变?

1.字符串常量池的需要

字符串常量池是Java堆中一个特殊的存储区域,当创建一个String对象时,如果该字符串值已存在常量池中,就不会创建一个新的对象,而是引用已经存在的对象。

String s1 = " Helloworld! ";

String s2 = " Helloworld! ";

执行完第一行代码后,常量池已存在" Helloworld ",则直接把已存在的字符串内存地址返回给s2

如果字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立的对象,这也是一种优化的手段。

2.允许String对象缓存HashCode

Java中String对象的HashCode被频繁使用,字符串不变性保证了HashCode的唯一性,可以对HashCode进行缓存,无需每次使用都计算新的HashCode.

3.安全性

String被许多Java类用来当做参数,如URL地址,文件路径PATH,反射机制所需的String参数等,若String是可变的,将会引起各种安全隐患。

设计为不可变带来的好处

1.字符串不可变才能实现字符串池,可以在运行时节省很多Java堆空间

2.还是安全性提高了,数据库,网络编程甚至类加载器都会使用到字符串,不可变的字符串会减少漏洞的发生

3.多线程安全。同一个字符串实例可以被多个线程共享,String本身就是线程安全的

4.其HashCode被缓存,无需重新计算,使得字符串适合作为Map中的键,因为处理速度要更快。

StringBuffer

字符串变量,如果频繁对字符串内容进行修改,最好使用StringBuffer,因为它对StringBuffer对象本身进行操作,而不是生成新的String对象然后指针指向新的对象。

StringBuffer大部分字符串操作方法都加了关键字Synchronized,即线程安全。

StringBuffer和String之间的转换如下:

String s1 = " 123 " ;

StringBuffer s2 = new StringBuffer( s1 ) ;  String转StringBuffer

String s3 = s2.toString( ) ; StringBuffer转String

注:String和StringBuffer属于不同类型,也不存在继承关系,无法强转和向上造型!

StringBuilder

可变的字符序列,JDK5新增,提供一个与StringBuffer兼容的API,但不保证同步。一般用在单线程条件下使用字符缓冲区,如果允许,建议优先采用该类,不考虑线程安全且其他情况相同下,它比StringBuffer要快10%~15%左右的性能,但应该要提前确定是否运行在单线程下。

三者使用情况

操作少量数据,使用String;单线程下操作大量数据,使用StringBuilder;多线程下操作大量数据,使用StringBuffer。

String,StringBuilder和StringBuffer的更多相关文章

  1. String StringBuilder以及StringBuffer

    例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...

  2. String, StringBuilder 与StringBuffer的区别与联系

    1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...

  3. Java中String, StringBuilder和StringBuffer

    Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder. 区别 三者都继承自CharSequence接口, 首先说明三者间主要区别 String字 ...

  4. String,StringBuilder和StringBuffer的特点和使用场景

    这三个类是平时开发中经常遇到的,主要差别是运行速度和线程安全,使用起来String最方便了,另外两个稍微复杂一些. 从运行速度角度看,StringBuilder>StringBuffer> ...

  5. java String,StringBuilder和StringBuffer

    String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...

  6. String,StringBuilder与StringBuffer的区别

    相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...

  7. Java基础学习总结(65)——Java中的String,StringBuilder和StringBuffer比较

    字符串,就是一系列字符的集合. Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的.字符 ...

  8. java 常用类库:String ; StringBuilder和StringBuffer类

    1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...

  9. String,StringBuilder 和StringBuffer区别

    1. String 和字符串缓冲区的区别是: String 是一个不可变的字符序列 , 而字符串缓冲区是可变的 2. StringBuffer 是一个线程安全的可变字符序列 ; 线程安全对应的效率低 ...

随机推荐

  1. spark 笔记 13: 再看DAGScheduler,stage状态更新流程

    当某个task完成后,某个shuffle Stage X可能已完成,那么就可能会一些仅依赖Stage X的Stage现在可以执行了,所以要有响应task完成的状态更新流程. ============= ...

  2. java基本算法

    1.链表 链表用来存储数据,由一系列的结点组成.这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的.一个结点由数据的值和下一个数据的地址组成.一个链表内的数据类型可以是 ...

  3. 一起学vue指令之v-bind

    一起学vue指令之v-bind 一起学 vue指令 v-bind  网页的图片url地址并不是固定写死的,如果写死,每一个活动就改一次图片的url,一个网页有多少张图片,工作量多大? 通常来说,客户端 ...

  4. electron之API学习

    学习一个新框架或者技术,最深入最全面的方法就是通过官方API,例如我们学习electron: 例如我们需要学习electron的BrowserWindow对象的使用,以及在创建她时我们可以配置的参数: ...

  5. C#三种常用的读取XML文件的方法

    下面我将介绍三种常用的读取XML文件的方法.分别是 1: 使用 XmlDocument 2: 使用 XmlTextReader 3: 使用 Linq to Xml 这里我先创建一个XML文件,名为Bo ...

  6. JavaEE-实验三 Java数据库高级编程

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.在MySQL中运行以下脚本 CREATE DATABASE mydatabase; USE mydatabase; CREA ...

  7. sql 游标的关闭和释放

    如果不关闭游标,就会 消息 ,级别 ,状态 ,过程 (过程名),第 xx 行 名为 'c1' 的游标已存在. 消息 ,级别 ,状态 ,过程 (过程名),第 xx 行 游标已打开. 如何关闭游标,其实和 ...

  8. 数据测试002:利用Jmeter推送测试数据(上)

    数据测试002:利用Jmeter推送测试数据(上) 刚才用Jmeter配置一下MySQL数据库花了点时间,好在最后都解决了,注意下面几个问题: 1)没有配置  “Cannot load JDBC dr ...

  9. 常用ARM指令

    常用ARM指令1:数据处理指令   mov mvn MOV(MOVE)指令可完成从另一个寄存器.被移位的寄存器或将一个立即数加载到目的寄存器 MOV R0,R1;R1的值传到R0 MOV R3,#3 ...

  10. DSP28335 eCAP 测频

    F28335共有6组eCAP模块,每个eCAP不但具有捕获功能,而且还可用作PWM输出功能.F28335捕获模块的主要特征如下: 1. 150MHz系统时钟的情况下,32位时基的时间分辨率为6.67n ...