String,StringBuilder和StringBuffer
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的更多相关文章
- String StringBuilder以及StringBuffer
例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...
- String, StringBuilder 与StringBuffer的区别与联系
1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...
- Java中String, StringBuilder和StringBuffer
Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder. 区别 三者都继承自CharSequence接口, 首先说明三者间主要区别 String字 ...
- String,StringBuilder和StringBuffer的特点和使用场景
这三个类是平时开发中经常遇到的,主要差别是运行速度和线程安全,使用起来String最方便了,另外两个稍微复杂一些. 从运行速度角度看,StringBuilder>StringBuffer> ...
- java String,StringBuilder和StringBuffer
String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...
- String,StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- Java基础学习总结(65)——Java中的String,StringBuilder和StringBuffer比较
字符串,就是一系列字符的集合. Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的.字符 ...
- java 常用类库:String ; StringBuilder和StringBuffer类
1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...
- String,StringBuilder 和StringBuffer区别
1. String 和字符串缓冲区的区别是: String 是一个不可变的字符序列 , 而字符串缓冲区是可变的 2. StringBuffer 是一个线程安全的可变字符序列 ; 线程安全对应的效率低 ...
随机推荐
- MySQL定时任务实现方法
类型一:每隔一分钟插入一条数据: 参数说明: DEFINER:创建者: ON COMPLETION [NOT] PRESERVE :表示当事件不会再发生的情况下,删除事件(注意特定时间执行的事件, ...
- 11、kubernetes之dashboard
一.准备dashboard使用的证书 # cd /etc/kubernetes/pki/ pki]# (umask 077; openssl genrsa -out dashboard.key 204 ...
- JNI崩溃调试
JNI崩溃了,系统日志会打印堆栈信息,所以第一步就是取日志 adb shell logcat -v threadtime >>d:/log.txt 然后找到日志里面的关键字backtrac ...
- Charles解析https,unknown错误解决办法
之前一直使用Charles,抓包https的没有问题,enable ssl的时候出现unknown消息,disable ssl的时候出现乱码,解决办法: 在设置–>通用–>关于本机–> ...
- fstab中使用设备的uuid
设备定位的方法有: 设备名称, 如:/dev/sda1, 随着linux内核加载模块顺序在每次启动的时候可能会不同, 在插拔U盘/移动硬盘的时候, 设备分配到的名称可能不同,这样fs映射就会失败 因此 ...
- leetcode 29两数相除
我理解本题是考察基于加减实现除法,代码如下: class Solution { public: //只用加减号实现除法, //不用加减号实现除法: int divide(int dividend, i ...
- unity3d卡在loading的解决方法
解决方案: 关闭U3D,打开电脑的网络适配器把网给掐掉,打开U3D后会提示Workoffline 点击这个即可,然后再把网给起起来就可以了
- django路由的二级分发
基于二级分发设计url路由 path('index/', views.index), path('index/', ([ path('test01/', test01), path('test02/' ...
- notepad++ 正则表达式(记录)
删除操作notepad++去掉行尾空格或逗号查找目标:\s+$ (或,+$)替换为空Note: 以换行符结尾表示是$\r\n,而不是\r\n$ notepad++删除文本文件里面的空白行查找目标:^[ ...
- Tensorflow 对上一节神经网络模型的优化
本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax ...