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字符串对象内存实现的时候,在堆中又开辟了一块很小的内存 ...
随机推荐
- BlackArch安装(译文)
翻译:荒原之梦 原文地址:BlackArch Install 以下是译文: 该教程将会向你展示如何使用ISO和blackarch-installer安装BlackArch Linux. 这个教程中使用 ...
- c# Socket通信异步TCP
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- 巩固java(七)-----java反射机制
一般而言,开发者社群说到动态语言,大致认同的一个定义是:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言, ...
- java面向对象中四种权限(private,protected,public,友好型)详解
转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...
- grpc.go
package,,), etcd.WithPrefix(), etcd.WithPrevKV()} gw.wch = gw.c.Watch(gw.ctx, gw.target, opts... ...
- stm32的NVIC是什么?
NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器. 对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的.8位的话 ...
- sql中1=1的and和or问题
SELECT * FROM mentor_teacher WHERE 1 = 1 AND status = ? limit 0, 10 sql语句中如果有1=1的问题, 那么,如果是and并且的关 ...
- 机器学习中的范数规则化-L0,L1和L2范式(转载)
机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http://blog.csdn.net/zouxy09 今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化. ...
- Random在高并发下的缺陷以及JUC对其的优化
Random可以说是每个开发都知道,而且都用的很6的类,如果你说,你没有用过Random,也不知道Random是什么鬼,那么你也不会来到这个技术类型的社区,也看不到我的博客了.但并不是每个人都知道Ra ...
- 线性表概述及单链表的Java实现
一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...