一、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内存模型

JVM具有一个堆(heap),堆是运行时数据区,为所有类实例与数组动态分配内存(堆的优势),数据的生命周期不必告诉编译器,而内存的释放由GC(垃圾处理机制)自动回收,但由于动态分配内存,堆的存取效率较低(堆的缺点);

相比于堆,栈存取速度很快(栈的优势),仅次于寄存器,一般用来存放基本类型变量数据如(int、short、long、byte、float、double、boolean、char)与对象的引用,栈中数据可以共享;但栈中数据大小与生命周期必须是确定的,缺乏灵活性(栈的缺点)。


原文地址:

http://blog.csdn.net/zhangliangzi/article/details/50075281

Java中String对象创建机制详解()的更多相关文章

  1. Java中String 的equals 和==详解

    一.Java中数据存储区域包括: 1.寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new ...

  2. java中String与equals,==详解

    首先,String str1="abc",这个str1所指向的是常量池中的一块内存. 如果又有,String str2="abc",那么str1和str2所指向 ...

  3. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  4. Java 中的异常和处理详解

    Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...

  5. Java中String对象的不可变性

    首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...

  6. java中内存结构及堆栈详解

    一. java内存结构 1. Heap(堆):实例分配的地方,通过-Xms与-Xmx来设置 2. MethodArea(方法区域):类的信息及静态变量. 对应是Permanet Generation, ...

  7. Java中String对象的存储位置(学习笔记)

    首先,String是final修饰的.immutable对象,它以一个个字符的方式存储在字符数组中.其次,String类型创建对象有两种方式:①通过字面量赋值:会先去常量池中查找是否存在相同的字符串, ...

  8. jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解

    一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤. 二.类加载时机:  1 ...

  9. Java 对象序列化机制详解

    对象序列化的目标:将对象保存到磁盘中,或允许在网络中直接传输对象. 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传 ...

随机推荐

  1. break continue学习

    1.break和continue必须使用在循环或者switch语句中 2.当break语句单独存在时.后面不要定义其他语句,因为后面的语句无法执行到 3.break跳出当前所在循环 4.break跳出 ...

  2. js相关语法知识

    alert(); 页面弹窗 <input plactholder="请输入密码"/>(隐藏字体效果)js对数据类型不敏感,与Java相似1.js变量定义符:var2.j ...

  3. 原生redis命令

    一. redis-cli 连接 redis 进入redis安装目录 cd /usr/local/bin 进入redis客户端 ./redis-cli -p 6379 -h 用于指定 ip -p 用于指 ...

  4. Laya 断点调试

    Laya 打断点调试并查看堆栈的方法 发现直接加断点不行没办法调试,直接使用这中方法好像可以,选择F5调试 var camera =this.GameScene.getChildByName(&quo ...

  5. 【译】Async/Await(一)——多任务

    原文标题:Async/Await 原文链接:https://os.phil-opp.com/async-await/#multitasking 公众号: Rust 碎碎念 翻译 by: Praying ...

  6. Spring Boot超详细用户管理项目(零)——开发前准备

    开始前的软件准备:(编写中:未完成) 使用软件介绍: Java版本:Java SE 11(LTS) 开发工具:IDEA(2020.3版本) Linux系统: 数据库: Java 版本:Java SE ...

  7. 网件wndr4300 ttl连接

    路由成砖而还能进入cfe或uboot等情况下,可以通过ttl快速救砖. r4300主板有TTL的接线脚,脚的顺序可以找在OpenWrt的wiki上找到. 如下图4个TTL针在左下角,从下往上分别是GN ...

  8. oracle 释放表空间到OS(resize)

    1.查看表空间里面的对象 SELECT OWNER AS OWNER, SEGMENT_NAME AS SEGMENT_NAME, SEGMENT_TYPE AS SEGMENT_TYPE, SUM ...

  9. SAP表的锁定与解锁

    表的锁定模式有三种模式. lock mode有三种模式:分别是S,E,X.含义如下:     S (Shared lock, read lock)     E (Exclusive lock, wri ...

  10. commons-lang3相关类实例

    一.ArrayUtils //1.判断两个数组长度是否相等 ArrayUtils.isSameLength(new int[] {1,2,3,4}, new int[] {1,2,3,4});//tr ...