Java中String对象的存储位置(学习笔记)
首先,String是final修饰的、immutable对象,它以一个个字符的方式存储在字符数组中。
其次,String类型创建对象有两种方式:①通过字面量赋值:会先去常量池中查找是否存在相同的字符串,若存在,栈中引用直接指定该字符串;若不存在,在常量池中进行缓存,再将栈中引用指向它。②通过new关键字:每次new出来的都是一个新的对象,在堆中开辟空间进行存储。
又因为,在JDK1.7的HotSpot中,已经把原本放在永久代的字符串常量池移出,JDK8元空间彻底取代永久代,此时字符串常量池还在堆,所以String变量是以字符数组的形式储在堆。
证明,str1和str2,指向的是同一个字符数组:
String str1="ab";
String str2=new String("ab");
Field field=str2.getClass().getDeclaredField("value");
field.setAccessible(true);
char[] sum=(char[]) field.get(str2);
sum[0]='w';
System.out.println(str1);//wb
System.out.println(str2);//wb
test直接演示String对象的创建位置:
package test.string.equal;
public class Main {
/**
* 创建了三个对象,"helloworld对象创建在常量池中",每次new String()都会创建一个对象在堆内存中。
*/
void test() {
String s1="helloworld";
String s2= new String("helloworld");
String s3= new String("helloworld");
}
/**
* 程序只创建一个字符串对象“Java”,存放在常量池中,所以s1==s2 为true
*/
void test1(){
String s1="Java";
String s2="Java";
System.out.println(s1==s2);
}
/** 第一个new String("Java"):创建了两个对象,Java创建于常量池中,String对象创建于堆内存中。
* 第二个new String("Java"):由于常量池中有Java对象,所以只需创建一个对象,String对象创建于堆内存中。
* s1与s2分别指向String对象堆内存,所以s1==s2 为false
*/
void test2() {
String s1=new String("Java");
String s2= new String("Java");
System.out.println(s1==s2);
}
/** 常量的值在编译的时候就确定了,"hello"、"world"都是常量,因此s2的值在编译的时候也确定了,
* s2指向常量池中的"hello world",所以s1==s2为true
*
*/
void test3() {
String s1="hello world";
String s2="hello "+"world";
System.out.println(s1==s2);
}
/** s4由两个String变量相加得到,不能再编译时就确定下来,不能直接引用常量池中的"helloworld"对象,而是在堆内存中创建一个新的String对象并由s4指向
* 所以s1==s4为false
*
*/
void test4() {
String s1="helloworld";
String s2="hello";
String s3="world";
String s4=s2+s3;
System.out.println(s1==s4);
}
/** s2与s3被final修饰为宏变量,不可更改,编译器在程序使用该变量的地方直接使用该变量的值进行替代,所以s4的值在编译的时候就为"helloworld"
* 指向常量池中的"helloworld"对象
* 所以s1==s4为true
*
*/
void test5() {
String s1="helloworld";
final String s2="hello";
final String s3="world";
String s4=s2+s3;
System.out.println(s1==s4);
}
public static void main(String[] args) {
Main o = new Main();
o.test1();
o.test2();
o.test3();
o.test4();
o.test5();
}
}
Java中String对象的存储位置(学习笔记)的更多相关文章
- java中String对象的存储位置
public class Test { public static void main(String args[]) { String s1 = "Java"; String s2 ...
- Java中String对象的不可变性
首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...
- Java中String对象创建机制详解()
一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...
- JVM 内存分配模型概念和java中各种对象的存储
JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了<深入理解Java虚拟机JVM高级特性与最佳实践> 一书后,总结所得.写的不 ...
- Javascript中String对象的的简单学习
第十一课String对象介绍1:属性 在javascript中可以用单引号,或者双引号括起来的一个字符当作 一个字符对象的实例,所以可以在某个字符串后再加上.去调用String 对象 ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- java中String常量的存储原理
相关题目(运行结果在代码注释后面) 1. package StringTest; public class test1 { public static void main(String[] args) ...
- Java中String对象的创建
字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 String类有一个对应的String池,也就是 String pool.每一个内容相同的字 ...
- JAVA中 XML与数据库互转 学习笔记三
要求 必备知识 JAVA基础知识,XML基础知识,数据库的基本操作. 开发环境 MyEclipse10/MySql5.5 资料下载 源码下载 数据库在数据查询,修改,保存,安全等方面与其他数据处理 ...
随机推荐
- CSS3移动端vw+rem不依赖JS实现响应式布局
1.前言 (1)vw/vh介绍 在使用之前,我们先简单了解一下什么是vw和rem以及它们的作用,vw是css3出现的一个新单位,它是"view width"缩写,定义为把当前屏幕分 ...
- LaTeX 小试牛刀
跟大家分享一下正式第一次使用 LaTex 的经验,之前数学建模的时候一直想用,但没有找到合适的软件.前段时间,实验室老师让我帮忙套个 IEEE ACCESS 的模板. 尝试过 TexPad,的确 UI ...
- 离线方式快速安装python模块以及相关依赖模块
一般公司的服务器都是和外网隔离的,这个如果没有内部pip源的话,想要安装python的模块就需要去python官网一个一个下载依赖模块的包,然后逐个安装,这样做非常耗时间. 我们今天用的办法就是现在我 ...
- 『正睿OI 2019SC Day4』
总结 今天是一场欢乐的\(ACM\)比赛,于是我队得到了全场倒数的好排名. 好吧,其实还是怪自己不能怪队友啦.对于\(ACM\),可能最主要的还是经验不足,导致比赛的时候有点紧张.虽然队友为了磕一道题 ...
- 动态代理(二)—— CGLIB代理原理
前篇文章动态代理(一)--JDK中的动态代理中详细介绍了JDK动态代理的Demo实现,api介绍,原理详解.这篇文章继续讨论Java中的动态代理,并提及了Java中动态代理的几种实现方式.这里继续介绍 ...
- reactiveX沉思(草稿)
一.第一性原理 将异步的io.事件解释为observable.并借用observer的一些类概念进行处理. ReactiveX is a library for composing asynchron ...
- tomcat启动完成执行 某个方法 定时任务(Spring)
第一步引入接口: ServletContextListener @RestController @RequestMapping("/schedule") public class ...
- Linux学习笔记之文件读取过程
0x00 概述 对于Linux系统来说,一切的数据都起源于磁盘中存储的文件.Linux文件系统的结构及其在磁盘中是如何存储的?操作系统是怎样找到这些文件进行读取的?这一章主要围绕这几个问题进行介绍(以 ...
- Web api 右连接
这是原来的代码,两个表的连接的方式是inner join ,查不出我要的全部数据. 后来把代码稍稍改一下,就是left join join into 到一个临时对象里,相当于再select from ...
- jQuery---bootstrap的下载使用,栅格(12个格子),轮播图,矢量图字体图标,进度条,选项卡,标签,表达校验
jQuery---bootstrap的下载使用,栅格(12个格子),轮播图,矢量图字体图标,进度条,选项卡,标签,表达校验 一丶bootstrap的使用 下载资源文件: bootstrap官网 导入 ...