Java中String对象创建机制详解(转载)
来源:互联网 发布:windows程序设计 教材 编辑:程序博客网 时间:2024/05/17 08:35
- 一String 使用 private final char value来实现字符串存储
- 二Java中String的创建方法四种
- 三在深入了解String创建机制之前要先了解一个重要概念常量池Constant Pool
- 四直接使用 双引号的创建机制
- 五用new stringstring的创建机制
- 六Java内存模型
一、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对象创建机制详解(转载)
- Java中String对象创建机制详解
- Java中String对象创建机制详解(面试必问)
- JAVA中string创建对象详解
- Java String 对象创建详解
- Java String 对象创建详解
- (转载)JAVA中对象创建和初始化过程
- java 中String创建对象的区别
- java string 创建对象
- Java String 创建对象
- Java中String创建字符串创建对象问题
- Java反射机制详解(转载)
- 转载(java反射机制详解)
- 详解Java String字符串对象的创建及管理(1)
- 详解Java String字符串对象的创建及管理(2)
- 到底创建了几个String对象?(转载)
- JAVA内存管理+String创建字符串对象+常量池详解(合集)
- java 创建string对象机制 字符串缓冲池 字符串拼接机制
- 栈
- uboot的sd/mmc流程
- 笔记:mysql查看表的结构及注释、创建表sql语句方法。
- spring类图二 DefaultListableBeanFactory相关类图
- webkit介绍
- Java中String对象创建机制详解(转载)
- hibernate的联合主键
- reset.css
- 泛微OA 定时任务、bos接口调用
- C语言指针之通过修改内存修改数组的数据
- 研究人脸识别的十大概念
- 汇报刘强东!前IBM Watson首席科学家周伯文加盟京东
- “跟着西瓜去学习”之--绪论
- npm总是报错:unable to verify the first certificate