String字符串创建与存储机制
Java内存可以粗略的区分为堆内存(Heap)和栈内存(Stack),堆中存放的是对象实例,而栈中存放的则是方法调用过程中的局部变量或引用等。
在Java语言中,字符串的生命与初始化有如下两种方式:
1. 初始化
String str1 = "helloJava";
String str2 = "helloJava";
在JVM中存在存在一个字符串常量池,用于存放特定的字符串对象,可以被共享使用。str1和str2引用的是同一个字符串常量池里的对象。当创建一个字符串常量时,如"helloJava",首先会在常量池中查找是否已经存在相同的字符串(通过string.equals()方法判断,如果返回true,则认为是相同的字符串),如果存在,则直接获取其引用,不需要重新创建对象;若不存在,则会首先创建这个对象,然后把它加入到字符串常量池中,再将它的引用返回。
由于String类是不可变类,一旦创建好后就不能修改,因此String对象可以被共享而且不会导致程序混乱。
2. 创建对象
String str3 = new String("helloJava");
String str4 = new String("helloJava");
str3和str4是通过new关键字创建的两个不同的对象,在内存中的地址是不同的。
String str3 = new String("helloJava")这条语句可以分解为两个过程:
1)创建对象
即new String("helloJava"),调用String类的构造方法,传入一个字符串常量,等价于两个操作:"helloJava"和new String()。如果字符串常量池中不存在"helloJava",则会创建常量"helloJava",并添加到常量池中;若存在则不创建,new String()会在堆中创建一个新的对象,因此str3和str4分贝指向堆中不同的对象。
2)赋值
即String str3 = ,将一个String类型的引用赋值给str3变量,这个过程不会创建新的对象。
举例说明 :
String s1 = "helloJava";//把"helloJava"放入常量池中,编译时产生
String s2 = "hello"+"Java";//把"hello"和"Java"转换成"helloJava"放入常量池中
String s3 = "helloJava";//引用常量池中的对象,不会重新创建对象
String s4 = new String("helloJava");//运行时把"helloJava"放入堆里面,在堆中创建一个对象
String s5 = new String("helloJava");//在堆中又创建一个新的对象
存储图例 :

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!
▼微信扫一扫下图↓↓↓二维码关注

String字符串创建与存储机制的更多相关文章
- 《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么
在Java语言中.字符串起着非常关键的数据.字符串的声明与初始化主要有例如以下两种情况:(1) 对于String s1=new String("abc")语句与String s2= ...
- 《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么
在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况: (1) 对于String s1=new String("abc")语句与Strin ...
- String字符串创建方法
String字符串的创建方法我们总结为3+1,3是一共有3种构造方法,1是有一种特殊的创建方法. 首先来看3种构造方法: 1.new String() 无参构造 用该方法创建的字符串是一个空字符串, ...
- java之String类在堆栈存储机制
String类是一个比较特殊的类,最主要的体现是它有多种创建形式,例如,String a ="abc";Sting a=new("abc");表面上看得到的结果 ...
- 创建String字符串的方式与区别
Java中创建一个字符串的方式有很多种,常见如: String s = new String("riqi"); String s = "riqi"; 但两者有什 ...
- Java中String对象创建机制详解()
一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...
- 关于String s = new String("xyz");创建了几个字符串对象?的问题
引用自这位朋友:http://blog.sina.com.cn/s/blog_6a6b14100100zn6r.html 首先让我们了解几个概念: 栈:由JVM分配区域,用于保存线程执行的动作和数据引 ...
- 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素
package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...
- Java基础-String 存储机制管理
JVM运行的时候,将内存分为两个部分,一部分是堆,一部分是栈.堆中存放的是创建对象,而栈中存放的则是方法调用过程中的局部变量或引用.在设计JAVA字符串对象内存实现的时候,在堆中又开辟了一块很小的内存 ...
随机推荐
- spring security oauth2
https://connect.qq.com/manage.html#/ http://wiki.connect.qq.com/%E7%BD%91%E7%AB%99%E5%BA%94%E7%94%A8 ...
- Spring_boot入门(1)
Spring boot 将很多东西都集成在一起了,搭建maven项目的时候只需要引入很少的依赖就可以实现项目的搭建. 1.搭建maven项目结构 2.引入Spring boot 依赖 直接去官网找就可 ...
- 【bzoj2331】[SCOI2011]地板
题目链接: TP 题解: 分类讨论好烦啊! 0表示没有插头,1.2表示有插头,1表示接下来可以转弯,2表示接下来不能转弯,只能停在一个地方. 然后分类讨论: 插头状态 到达状态 0 0 2 2 | 1 ...
- [Usaco2009 Jan]安全路经Travel BZOJ1576 Dijkstra+树链剖分+线段树
分析: Dijkstra求最短路树,在最短路树上进行操作,详情可见上一篇博客:http://www.cnblogs.com/Winniechen/p/9042937.html 我觉得这个东西不压行写出 ...
- Dropwizard入门及开发步骤
Dropwizard介绍 Dropwizard结构的服务组成 开发步骤 Dropwizard介绍 Dropwizard是一个微服务框架, 是各项技术的一个集成封装.它包含了以下组件: 嵌入式Jetty ...
- Java的序列化和反序列化
概述 Java对象的序列化和反序列化,这个词对我来说追溯到大学阶段,学Java对象流时知道有这东西.老师告诉我们可以把Java对象化作字节流,储存文件或网络通信.然后就是巴啦巴拉,一脸懵逼.举个例子, ...
- TypeScript 实现任务队列
业务中经常会有一些批量操作的任务,比如使用 JavaScript 预加载一组图片,批量上传一些资源.如果这些任务一次性启动,势必会消耗很多资源和带宽.理想的做法应该对这些任务进行限制,比如一次只跑几个 ...
- Java ArrayList正确循环添加删除元素方法及分析
在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. 一.foreach循环 foreach循环(Foreach loop)是计算机编程 ...
- 网页基础:网页设计(我所知道的所有的html和css代码(含H5和CSS3)),如有错误请批评指正
最基础的网页设计,就是给你一个图片你做成一个网页,当然,我的工作是C#,个人网页的功底不是很高首先先认识一下网页的一些相关知识: 一般的,现在一个html网页一般包含html文件,css文件,js文件 ...
- python接口自动化(二十一)--unittest简介(详解)
简介 前边的随笔主要介绍的requests模块的有关知识个内容,接下来看一下python的单元测试框架unittest.熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和 T ...