一、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的解析和比较?的更多相关文章

  1. 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题

    REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...

  2. Java String StringBuilder StringBuffer

    String是字符串常量 StringBuilder和StringBuffer都是字符串变量 速度方面:StringBuilder > StringBuffer > String 每当用S ...

  3. Java - String, Stringbuilder, StringBuffer比较

    http://www.cnblogs.com/zuoxiaolong/p/lang1.html

  4. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  5. JAVA String、StringBuffer、StringBuilder类解读

    JAVA String.StringBuffer.StringBuilder类解读 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作 ...

  6. 深入源码剖析String,StringBuilder,StringBuffer

    [String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...

  7. String, StringBuilder, StringBuffer问题

    1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...

  8. String StringBuilder StringBuffer区别

    String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...

  9. difference among String,StringBuilder,StringBuffer

    difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...

  10. JDK源码分析系列---String,StringBuilder,StringBuffer

    JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...

随机推荐

  1. 黑马学习MyBatis 用MyBatis对表进行条件查询 模糊查询 动态sql

    package cn.itcast.domain; /* CREATE TABLE `message` ( `id` int(11) NOT NULL, `command` varchar(16) D ...

  2. Jmeter跨线程组传参

      我们知道,同一线程组中可以通过“正则表达式提取器”获取其中一个取样器的响应结果中的参数,直接传给线程组中的其他取样器.但其他线程组中的取样器也想使用同样的参数时,无法直接获取.举个例子: 提取“登 ...

  3. jsonpath 求和

    { "price": [ 1.0, 2.0 ] } $..price.sum() 以下表达式

  4. 福昕阅读器把pdf某一页保存出来

    第一步: 第二步: 第三步: 第四步:点击保存即可

  5. MyBatis学习总结(一)

    MyBatis,是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解 ...

  6. 结合源码看nginx-1.4.0之nginx内存管理详解

    目录 0. 摘要 1. nginx内存结构设计 2. nginx内存数据结构 3. nginx内存管理原理 4. 一个简单的内存模型 5. 小结 6. 参考资料 0. 摘要 内存管理,是指软件运行时对 ...

  7. Kendo UI 单页面应用(二) Router 类

    Kendo UI 单页面应用(二) Router 类 Route 类负责跟踪应用的当前状态和支持在应用的不同状态之间切换.Route 通过 Url 的片段功能(#url)和流量器的浏览历史功能融合在一 ...

  8. git remote add 用法

    前一阵子,对于git remote add 的内容一直调错,现在明确一下: 这里是gitStack的用法:git remote add gitServerName http://ip/name(这里没 ...

  9. UIWebView全解

    是iOS内置的浏览器控件,可以浏览网页.打开文档等 能够加载html/htm.pdf.docx.txt等格式的文件 系统自带的Safari浏览器就是通过UIWebView实现的 MIME的英文全称是“ ...

  10. ApexSQL Log中的Redo Script跟原始SQL不一致问题

    最近遇到一个误更新数据的问题,使用ApexSQL Log做挖掘事务日志的时候,发现ApexSQL Log生成的Redo Script跟原始SQL是有区别的.它们并不是完全一致的.只是逻辑上等价而已.如 ...