java面试题(杨晓峰)---第五讲String、StringBuffer、StringBuilder有什么区别?
线程
字符 操作频繁度
1 String
(1)String的创建机制
由于String在java世界中使用过于频繁,java为了避免在一个系统中产生大量重复的String对象,引入了字符串常量池,其运行机制是:创建一个字符串时,首先检查常量池中是否有值相同的字符串对象,如果存在相同字符串则直接使用常量池中的字符串引用,如果不存在新建字符串对象并放入常量池,但是,例外通过new方法创建的String对象是不检查常量池,而是直接在堆或栈中创建对象,并且不会把对象放入常量池。
举例:
String str1=“123”;
String str2=new String(“123”);
注意:String提供inter()方法,调用该方法时,首先检查常量池中是否有值相同的字符串对象,如果存在相同字符串则直接使用常量池中的字符串引用,如果不存在新建字符串对象并放入常量池,
(2)String的特性
【A】不可变,应对多线程需要。是指String对象一旦生成,则不能在对他进行改变。不可变的主要作用是当一个对象需要被多个对象共享并且频繁访问时,可以省略同步和锁等待的时间,从而大幅提高系统性能。不可变模式可以大幅提高系统性能,降低多线程程序复杂度。
【B】针对常量池的优化.当两个String对象拥有相同的值时,他们只引用常量池中的同一个拷贝.当同一个字符串反复出现时,这个技术可以大幅节省内存空间
2 StringBuffer/StringBuilder:值可变
StringBuffer和StringBuilder都实现了AbstractStringBuilder抽象类,两者拥有几乎一致的调用接口,其底层在内存中的存储方式与String相同,都是以一个有序的字符序列进行存储,
不同点:两者对象的值可以改变,并且值改变以后,对象引用不会发生改变,两者对象在构造过程中,首先按照默认大小申请一个字符数组,在使用过程中如果不断添加值使大小超过原先范围时,就创建一个更大的新数组在将原先的值复制进来,丢弃旧数组.因此预先评估可以提升性能.
注意:StringBuffer是线程安全的,StringBuilder是线程不安全的.(不了解)
3.应用场景
[A]String: 在字符串内容不经常发生变化的场景优先使用String类.其中尽量避免大量使用string之间的"+"操作,因为会产生大量无用中间对象,耗费空间,执行效率低.例如常量声明.
[B]StringBuffer: 频繁对字符串进行运算(如拼接,替换,删除等),并且运算在多线程环境下例如xml解析,HTTP参数解析与封装.
[C]StringBuilder:频繁对字符串进行运算(如拼接,替换,删除等),并且运算在单线程环境下例如SQL语句拼接,JSON封装等.
java面试题(杨晓峰)---第五讲String、StringBuffer、StringBuilder有什么区别?的更多相关文章
- java面试题(杨晓峰)---第二讲Exception和Error有什么区别?
本人总结: Exception和Error:正常问题和意外问题,以自行车举例:没气和爆胎. ①理解Throwable,Exception,Error的设计和分类. ②掌握哪些应用最广泛的子类, ③如何 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- java面试题(杨晓峰)---以面试题为切入点,有效提升你的java内功
java是一门历史悠久的编程语言,可以毫无争议的说,java是最主流的编程语言之一.全球有1200万以上的java程序猿以及海量的设备,还有无所不能的java生态圈. 我所知道的诸如阿里,京东,百度, ...
- java中String,StringBuffer,StringBuilder之间的区别
文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...
- java面试题(杨晓峰)---第七讲谈谈int和integer有什么区别?
理解装箱和拆箱的过程. 对象由三部分组成:对象头,对象实例,对齐填充. 对象头:一般是十六个字节,分两部分,第一部分:哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等,第二部分是类型指针 ...
- java面试题(杨晓峰)---第六讲谈谈动态代理是基于什么原理?
我在编译时不知道,而在运行时知道,那么肯定在运行时给了提示,这个提示就是额外功.好处是可以重复利用相同代码. 代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,. ...
- java面试题(杨晓峰)---第四讲强引用、软引用、弱引用、幻想引用有什么区别?
在java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握java对象生命周期和JVM内部相关机制非常有帮助. 今天问题:强引用.软引用.弱引用.幻想引 ...
- java面试题(杨晓峰)---第三讲谈谈final、finally、finalize有什么不同?
java语言有很多看起来相似,但用途却完全不相同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点. 今天我要问你一个基础的java经典题目,谈谈final.finally.finali ...
- java面试题(杨晓峰)---第一讲谈谈你对java平台的理解
本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ...
随机推荐
- 条款39:明智而审慎的使用private继承
Use private inheritance judiciously. 如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base cla ...
- 日期组件wdatepicker
导入WdataPicker文件包到项目的js文件夹下: 在用户管理中的添加.编辑jsp页面对生日表单项引入日期组件: <script type="text/javascript&quo ...
- linux下使用c判断文件夹是否为空的小程序
自己写了一个 判断文件夹是否为空的小代码 //文件夹操作相关的函数的帮助$: man 3 readdir #include <stdio.h> #include <sys/types ...
- 微信小程序开发之拼接json数组字符串
直接上代码 : var imageitem; var imageitemstring=''; for(var i=0;i< that.data.fbimages.length;i ...
- Django 的 之 视图
Django的View(视图) 一个视图函数(类),简称视图, 是个简单的python函数(类),它接受wed请求并且返回web 响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- Python3 编译中文字串报错解决方案
问题: Python3.6.5 版本中,程序有中文,运行时出现以下error: SyntaxError: Non-UTF-8 code starting with '\xb2' in file XXX ...
- 洛谷P1976 鸡蛋饼(Catalan数)
P1976 鸡蛋饼 题目背景 Czyzoiers 都想知道小 x 为什么对鸡蛋饼情有独钟.经过一番逼问,小 x 道出 了实情:因为他喜欢圆. 题目描述 最近小 x 又发现了一个关于圆的有趣的问题:在圆 ...
- django 数据库建表流程,与表结构
目录 配置数据库 创建表结构 多表关连的设置 自创建关联表方法 自建表 和 ManyToManyField 联合使用 配置数据库 在Django项目的settings.py文件中,配置数据库连接信息: ...
- 简述RadioGroup和RadioButton的使用
简述RadioGroup和RadioButton的使用 在项目中有身份选择的选项,需要用到RadioGroup和RadioButton,这里做个记录,和大家交流一下. 话不多说,一起看代码 XML代码 ...
- 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...