关于java中String,StringBuffer,StringBuilder的区别以及StringBuffer,StringBuilder的安全性问题

标签: java

	1、首先是String和后两者的区别,这三者都是字符串操作,但是String中的value[]有一个final进行修饰,相当于其是不可变的,如果我们想要更改它的值那就是要在堆内存中再开辟出一个空间用来存储这个新的值,而原来的值还占着内存,这样就会造成大量的内存被占用,这个方面通过new String();创建字符串对象也会造成大量的内存被占用,而StringBuilder和StringBuffer都是继承了AbstractStringBuilder这个虚拟的类,里边的value[]没有用final进行修饰所以其值是可变的,这样对内存就比较友好。
	2、然后我们再来说说StringBuffer和StringBuilder的区别,这两个主要的区别就是安全问题和效率问题,StringBuilder效率比较高但是线程不安全,StringBuffer效率低但是线程安全,至于会造成这个问题的原因我们现在就来研究一下。
	先举一个例子,我们要初始化2000个线程来用append()方法向这两个对象中添加2000个字符“a”,首先是StringBuilder对象
	![在这里插入图片描述](https://img-blog.csdnimg.cn/20200626173646473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDg5Mg==,size_16,color_FFFFFF,t_70)
	但是经过测试,我们最后输出StringBuilder的长度却是1991如果我们多次执行,最后的结果数值也是不同的,为什么会造成这种结果呢?,我们从他的源码来看看
	![在这里插入图片描述](https://img-blog.csdnimg.cn/20200626174223678.png)
	在这里边都是继承了父类的方法,对字符串进行了添加,并且如果字符数组的长度不够对它进行扩容操作,然后通过getChars()方法对其进行了添加,这里有一个	`count+=len;`操作,并且这个append方法没有规定同时只能由一个线程访问,假设原来的字符串长度是100,接下来如果有两个线程同时访问了这个方法对其进行了添加然后第三个线程进来访问这个长度是多少呢?是101,没错,不是102,因为同时两个线程对其进行了访问所以导致其长度发生了变化,与真实的数据不符合这也就导致了我们上边的每次输出的长度都不一样的问题。
	接下来再看StringBuffer

在这里插入图片描述
这里的结果就是正确的然后我们来看他的append方法
在这里插入图片描述
它在前边加了一个synchronized来修饰,相当于同时只能有一个线程来访问他,这样就不会产生上边的问题但同时他的效率也就比StringBuilder低,

版权声明:本文为weixin_43270892原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43270892/article/details/106971994

智能推荐

TYVJ 4864 天天去哪吃 || 清北学堂金秋杯大奖赛

题目描述: 记录一下i这个值上次出现的位置在哪里,就是pre...

java反编译

jvm 把Boolean类型的值flag当做int类型处理。​​​ Foo.java: 由 class 文件生成 jasm 文件:java -jar asmtools.jar jdis Foo.class > Foo.jasm  修改jasm文件: 执行反编译: java -jar jd-gui-1.6.6.jar File 打开Foo.class文件:b修改为2 重新执行java...

【学习笔记】03-v-html的学习和示例

v-html的认识和使用 示例: 显示结果: 注意:v-html是有复制的...

Java实现在线考试系统(系统介绍)

1.和现在有的考试系统有以下几种优势: a.和现在有的系统比较起来,本系统有科目、章节、老师、学生、班级等信息的管理,还有批阅试卷查看已批阅试卷等。传统的考试系统划分并不细,业务功能简单。 b.和学校的考试系统还有外面的考试系统比较起来,本系统是B/S结构,学校的考试系统一般为C/S结构,性能方面不如B/S结构,并且C/S接口需要安装客户端,客户端压力很大,我的系统只需要电脑具有浏览器,在同一局域...

计算机视觉--多视几何初步尝试

基础矩阵的原理 K和K’分别是两个相机的参数矩阵。p和p’是X在平面π的坐标表示。所以可以得出 具体计算过程 代码: #!/usr/bin/env python coding: utf-8 from PIL import Image from numpy import * from pylab import * import numpy as np from imp ...

猜你喜欢

java初学者怎么学习才可以快速入门

java初学者怎么学习才可以快速入门 一、了解JAVA 我们要知道:Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言。 Java之父:詹姆斯·高斯林 1.1 java的三个体系 Java SE(Java Platform Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境...

字段属性之主键&增删改查&自增长&唯一键约束

字段属性之主键&自增长&唯一键约束 主键 主键:primary key 主要的键 一张表中只有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能重复,这种称之为主键 一张表只能最多一个主键 增加主键 SQL操作中有多种方式增加主键大体分为三种 1.在创建表的时候直接在字段之后跟primary key关键字(主键本身不允许为空) 优点:非常直接:缺点:只能使用一个字段作为...

linux下 基于libmad的socket多用户mp3音频在线播放服务器

在众多大神的帮助下,这个在线播放流媒体服务器终于完成啦。。。。 这个mp3流媒体服务器设计的思路是,服务器程序server用多线程实现和多个客户端的通信(这是必然的),然后发送给客户端当前的音频列表公客户端选择,之后根据k客户端的选择给多个客户端传输相应mp3文件的数据,同时,客户端进行实时地音频解码并播放。 关于libmad开源mp3音频解码库的使用,见上一篇博客吧。。。。 在服务器程序这一端,...

Nginx

Nginx Nginx简介: Nginx是一个高性能的http和反向代理服务器,特点是有内存少,并发能力强,事实上Nginx的并发能力确实在同类型网页服务器中表现较好, Nginx用作web服务器:Nginx可以作为静态页面的web服务器,同时还支持CGI语言,但不支持java,java程序只能通过Tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受...

SpringCloud Alibaba - Sentinel入门案例(二)(流控规则 | 直接 / 关联 / 链路 / 快速失败 / Warm Up / 排队等待)

SpringCloud Alibaba - Sentinel入门案例(二)(流控规则 | 直接 / 关联 / 链路 / 快速失败 / Warm Up / 排队等待) 回溯 Sentinel 基本概念 正文 环境准备 流控规则介绍 简单介绍 对 阈值类型 / 单机阈值做 测试 流控模式 直接流控模式 关联流控模式 链路流控模式 资源名称的修改 链路模式正文 坑来了,怎么解决? 禁止收敛URL的入口 ...