java--String、StringBuilder、StringBuffer的解析和比较?
一、String的解析
1.String的含义
①String是不可以被继承的,String类是final类,String类是由char[]数组来存储字符串。
②String是不可变的字符序列,如果存储abc则在字符串常量池中开辟长度固定为3的字符数组,无论怎么改变均会产生新的实例。

2.String的方法

由上图可知String的方法,不是在原有字符串的基础上进行修改的,都是new出了新的实例,因为String是不可变的字符序列。Sring对象的任何改变都不会改变原有的字符串。
二、字符串常量池的概念
1.String c = “abc” String cc = new String(“abc”)在内存中分布情况?

①Sting c = “abc” 先在字符串常量池中查找,如果常量池中没有,就实例化该字符串,并放到常量池中;如果池中存在abc,直接将字符串的地址赋值给c,c指向常量池的abc。
②String cc = new String(“abc”) 先在字符串常量池中找abc,如果存在再在堆中开辟一个空间指向常量池中的abc,栈中的cc指向堆中的0x12.
③一共开辟了4块内存空间,String cc = new String(“abc”)如果池子中有abc则,创建一个对象,如果池子中没有abc则创建2个对象。
④String cc = new String (“dec”) 的执行顺序是先从右向左。先判断dec在常量池中是否存在。如果不存在实例化一个放入池子中,再new堆中的对象。
2.分情况说明
①非new实例,结果是true,都是指向的字符串常量池中123。

②new实例,结果是false一个指向池子,一个指向堆内存,地址不一致。

③new实例2,结果是false,只要是new 出的实例在内存中就会开辟空间,二者的地址不一致,所以返回false。

④一个字符串由多个字符串拼接而成时,它本身也是字符串常量。
new出的对象不能再编译期间确定,cz02和cz03也不能再编译器确定。cz04和cz05都指向堆内存,cz04的值是在程序运行时确定的。
【常量找池,变量找堆】

⑤编译期优化,jvm将+连接优化为连接后的值,在编译期其值就是”a1”.

⑥字符串常量拼接和字符串引用的拼接,常量的”+”拼接是在编译期完成的,而字符串引用拼接(“+”),是在程序运行时确定的。一个在指向字符串常量池,一个指向堆内存。

三、String、StringBuilder、StringBuffer解析和比较
1.String简单总结
①String不可变的字符序列
②new的对象,一定是创建了对象,在堆中开辟空间。
③直接赋值和new两种方式创建String类型的对象。
④直接赋值不一定创建对象,如果字符串常量池中有的话就直接堆中的实例指向常量池中,不需要创建对象。
⑤final修饰类,不能被继承。
⑥String a = “1”+“2”+“3”+“4”;这个字符串拼接过程要产生多个对象完成,效率比较低。
2.String和StringBuilder、StringBuffer的区别?
①可变性:String不可变的字符序列,Builder和Buffer是可变的字符序列。
②线程安全:String是线程安全的,StringBuilder是线程不安全的,StringBuffer是线程安全。StringBuidler效率高于StringBuffer。因为String是不可变的一般情况下,效率最低。


③使用方式:如果字符串变换较少,使用String类型,如果拼接操作较多使用StringBuilder,如果要求线程安全使用StringBuffer。
3.StringBuffer可变字符序列的解析
①初始容量为16



②自动扩容:初始容量的2倍加2

java--String、StringBuilder、StringBuffer的解析和比较?的更多相关文章
- 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题
REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...
- Java String StringBuilder StringBuffer
String是字符串常量 StringBuilder和StringBuffer都是字符串变量 速度方面:StringBuilder > StringBuffer > String 每当用S ...
- Java - String, Stringbuilder, StringBuffer比较
http://www.cnblogs.com/zuoxiaolong/p/lang1.html
- java中String StringBuilder StringBuffer比较和效率(性能)测试
string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...
- JAVA String、StringBuffer、StringBuilder类解读
JAVA String.StringBuffer.StringBuilder类解读 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作 ...
- 深入源码剖析String,StringBuilder,StringBuffer
[String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...
- String, StringBuilder, StringBuffer问题
1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...
- String StringBuilder StringBuffer区别
String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...
- difference among String,StringBuilder,StringBuffer
difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...
- JDK源码分析系列---String,StringBuilder,StringBuffer
JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...
随机推荐
- Maven对坐标的管理 自动导入传递依赖 坐标和传递依赖分级显示
- codeforces597C-树状数组优化dp
因为整个序列为一个1-n的排列,所以可以这样dp dp[i][j]代表长度为i,以数字j结尾的子序列 dp[i][j]=dp[i-1][1,2,3...j-1]; 这道题的答案就是 dp[k+1][1 ...
- storm maven-shade-plugin
storm-core pom <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...
- NET Core使用Quartz
NET Core使用Quartz 一.前言运用场景 Quartz.Net是一个强大.开源.轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的 ...
- 运行node提示:events.js:160 throw er; // Unhandled 'error' event
运行node时遇到下述提示: events.js:160 throw er; // Unhandled 'error' event或者events.js:160 throw er; // ...
- setState异步函数
changeLeader(value){ console.log(value) this.setState({ leader:value },() => { console.lo ...
- SpringBoot 2.x (13):整合ActiveMQ
ActiveMQ5.x不多做介绍了,主要是SpringBoot的整合 特点: 1)支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议 2)支持许多高 ...
- DOM操作(二)对元素的操作(创建,追加,删除)
1 创建新的 HTML 元素 (节点) var divDom=document.createElement('div'); 2 添加新元素到尾部 element.appendChild(para); ...
- 洛谷 P1690 贪婪的Copy
题目 本题难度较低,操作比较简单,首先对于范围较小的N(<=100),我们可以先跑一遍floyd,求出任意两点之间的最短路.对于很小的p(<=15),我们可以直接考虑全排列,运用到next ...
- Bootstrap下拉菜单相关
1.实现普通下拉菜单:.dropdown>button.dropdown-toggle[data-toggle="dropdown"]+ul.dropdown-menu; 2 ...