面试题:String StringBufere StringBuilder 不用看
一、String 使用 private final char value[]来实现字符串存储
所以String对象创建之后就不能再修改此对象中存储的字符串内容,所以说String本质是字符数组char[],且其类型是不可变的!
相对应String,StringBuffer与String功能大致相同,但实现方法不同,StringBuffer是可变的,而且是线程安全的。
二、Java中String的创建方法(四种)
1、直接使用" "双引号创建; (String s1 = "first";)
2、使用new String()创建;(String s2 = new String();)
3、使用new String("string")创建;(String s3 = new String("string");)
4、采用重载的字符串连接符创建; (String s4 = "first" + "second";)
三、在深入了解String创建机制之前,要先了解一个重要概念:常量池(Constant Pool)
在Java编译好的字节码文件.class文件中,有个区域被称为Constant Pool,是一个由数组组成的表,用来存储程序中的各种常量,包括Class、String、Integer等各种Java基本数据类型;
String Pool是Constant Pool中存储String常量的区域;
四、直接使用" "双引号的创建机制
用" "双引号创建的方法是一种非常特别的创建方法;例如下面这段代码:
- String s1 = "first";
- Stirng s2 = "first";
- System.out.println(s1 == s2);
1、编译期:"first"是编译期常量,编译期就能确认它的值,在编译好的.class字节码文件中,"first"就已经存在String Pool中了;
2、运行期:JVM仅仅会查找维护常量池,拿着"first"在String Pool中查找是否存在内容相同的字符串(用equals()方法确认),如果存在,返回String Pool中相应内存单元的引用,赋值给s1(s1即是String Pool中存放"first"内存单元的地址);如果不存在,则创建一个"first"放在String Pool中,返回引用,赋值给s1;s2同理;
这个过程实际是调用intern()方法实现的;
此过程中,JVM绝不会在堆区(heap)创建String对象;
所以,上述代码,s1与s2指向String Pool中同一块内存区域,是同一个对象,故返回true。
五、用new string("string")的创建机制
相当于创建两次String对象,一次在String Pool中,一次在堆区(heap)中;
- String s1 = new String("first");
- String s2 = "first";
- System.out.println("s1 == s2");
在Java中,使用new关键字创建一个新对象,不管在String Pool中是否有值相同的对象,总会创建一个新的String对象存储在堆区(heap)中,然后返回堆栈区(heap)中相应内存单元的引用,赋值给s1;而s2还是指向String Pool中相应内存单元;
故s1与s2肯定不是同一个对象,只是存储字符串值相同,故返回false。
六、Java内存模型
堆 存放 对象和数组, 是GC主要操作的区域 由于堆是动态分配内存. 堆存取效率低于栈.
虚拟机栈 存放基本数据类型 和对象的引用.线程. 栈中数据可以共享.
方法区 存放常量、静态变量 ,编译后的代码
本地方法栈 虚拟机使用的本地服务
JVM具有一个堆(heap),堆是运行时数据区,为所有类实例与数组动态分配内存(堆的优势),数据的生命周期不必告诉编译器,而内存的释放由GC(垃圾处理机制)自动回收,但由于动态分配内存,堆的存取效率较低(堆的缺点);
相比于堆,栈存取速度很快(栈的优势),仅次于寄存器,一般用来存放基本类型变量数据如(int、short、long、byte、float、double、boolean、char)与对象的引用,栈中数据可以共享;但栈中数据大小与生命周期必须是确定的,缺乏灵活性(栈的缺点)。
(转载整理自并发编程网,略有修改整理,多涉猎多分享,共同学习,愿大家都成为Offer收割机!)
多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题!
面试题:String StringBufere StringBuilder 不用看的更多相关文章
- String PK StringBuilder,传说就是传说,只有动手实验,才能得出确定的答案
本机测试结果如下: 大部分情况下,string 性能并不比StringBuilder差,只有特殊情况才出现差异,并非 如前面有些朋友测试的结果哪样,只要使用StringBuilder 就一定比Stri ...
- 从.Net版本演变看String和StringBuilder性能之争
在C#中string关键字的映射实际上指向.NET基类System.String.System.String是一个功能非常强大且用途非常广泛的基类,所以我们在用C#string的时候实际就是在用.NE ...
- 探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- Java中String、StringBuilder以及StringBuffer
原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...
- 转发: 探秘Java中的String、StringBuilder以及StringBuffer
原文地址 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- 探秘Java中的String、StringBuilder以及StringBuffer(转载)
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- 【转】探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
随机推荐
- CodeForces - 963D:Frequency of String (bitset暴力搞)
You are given a string ss. You should answer nn queries. The ii-th query consists of integer kiki an ...
- 【java规则引擎】drools6.5.0中kie的概论
什么是KIE? KIE是jBoss里面一些相关项目的统称,下图就是KIE代表的一些项目,其中我们比较熟悉的就有jBPM和Drools. 这些项目都有一定的关联关系,并且存在一些通用的API,比如说涉及 ...
- fn project AWS Lambda 格式 functions
Creating Lambda Functions Creating Lambda functions is not much different than using regular funct ...
- FastAdmin 出现慢的问题 (DB host)
FastAdmin 出现慢的问题 用户反馈断网后 FastAdmin 后台变慢. 而且是很多同事出现一样的现象. 查看了 runtime / log 里的日志,发现 DB 时间超过 20s. 经过群里 ...
- Markdown 中的目录自动生成功能 TOC
目录 Markdown 中的目录自动生成功能 TOC 1. 标题一 1.1 标题二 1.标题二 2. 标题一 2.1 标题二 2.2 标题二 Markdown 中的目录自动生成功能 TOC 1. 标题 ...
- Tomcat服务器下 catalina.out 日志开关
很多异常在 debug 日志里不会打印,但在 catalina.out 里会打印,比如方法调用找不到,jdk 版本不匹配等.但是打开了该日志开关又会产生一个问题,就是它会哗啦啦的不断急剧膨胀,文件太大 ...
- 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)
事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...
- Vue.js:目标结构
ylbtech-Vue.js:目标结构 1.返回顶部 1. Vue.js 目录结构 上一章节中我们使用了 npm 安装项目,我们在 IDE(Eclipse.Atom等) 中打开该目录,结构如下所示: ...
- javascript知识
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...
- Linux学习笔记 -- 目录与文件的管理
目录结构 Linux的目录结构为树状结构,最顶级的目录为根目录 “/”. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什么是. 绝对路径与相对路径 绝 ...