java中String对象的存储位置
public class Test {
public static void main(String args[]) {
String s1 = "Java";
String s2 = "Java";
System.out.println(s1 == s2); // true
}
}
程序只创建了一个"Java"字符串对象,存放在常量池中,故s1 == s2结果为true,两个变量都指向了同一个对象。
常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据。如字符串常量,类、方法中的常量。
public class Test {
public static void main(String args[]) {
String s3 = new String("Java");
String s4 = new String("Java");
System.out.println(s3 == s4); // false
}
}
"Java"直接量与new String("Java")的区别:前者只创建于常量池中。后者先在常量池中创建一个对象,再创建一个新的String对象于
堆内存中,换句话说new String("Java")创建了两个对象(“Java”第一次出现)。
String s3 = new String("Java");创建了两个String对象,一个存于常量池中,一个于堆内存中且由s3指向。
String s4 = new String("Java");由于常量池中已经存在"Java"对象,故只创建一个对象于对内存中由s4指向。
故s3 == s4的结果为false。
public class Test {
public static void main(String args[]) {
String s5 = "HelloJava";
String s6 = "Hello" + "Java";
System.out.println(s5 == s6); // true
}
}
由于常量的值在编译的时候就被确定(优化)了。在这里,"Hello"和"Java"都是常量,因此变量s6的值在编译时就可以确定。
s6指向常量池中的"HelloJava"对象,故s5 == s6 的结果为true。
public class Test {
public static void main(String args[]) {
String s5 = "HelloJava";
String s7 = "Hello";
String s8 = "Java";
String s9 = s7 + s8;
System.out.println(s5 == s9); // false
}
}
s9由两个String变量相加的得到,不能在编译时就确定下来,故不能引用常量池中的对象,而是在堆中创建了一个新的String对象并由s9指向。
故s5 == s9 结果为false
public class Test {
public static void main(String args[]) {
String s5 = "HelloJava";
final String s7 = "Hello";
final String s8 = "Java";
String s9 = s7 + s8;
System.out.println(s5 == s9); // true
}
}
这里s7与s8位由final修饰为宏变量,编译器会把程序中所有用到该变量的地方直接替换成该变量的值,故s9编译时就确定了。指向
常量池中的对象。
java中String对象的存储位置的更多相关文章
- Java中String对象的存储位置(学习笔记)
首先,String是final修饰的.immutable对象,它以一个个字符的方式存储在字符数组中.其次,String类型创建对象有两种方式:①通过字面量赋值:会先去常量池中查找是否存在相同的字符串, ...
- 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高级特性与最佳实践> 一书后,总结所得.写的不 ...
- 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中String对象的split方法
在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|78 ...
- java中String类为什么不可变?
在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象 ...
随机推荐
- linux安装配置postgres及使用dblink
好久不写东西,一直在看些开源的东西,下面贴下linux上安装配置postgres及使用dblink的操作参考,以供读者和自己今后参考: 1.下载源码:postgresql-9.3.2.tar.gz 2 ...
- vEthernet(默认交换机) 无法访问网络
VMware 开启虚拟机 最近公司由无线网转为有线时,我用VMware Workstation Pro装的几个系统,其中一个 ubuntu无法访问网页,在ubuntu运行ifconfig -a ,直接 ...
- memory prefix hypo,hecto,hyper out1
1● hypo 次等 2● hecto 许多,百 3● hyper 超过,许多
- 使用Windbg解析dump文件
WinDbg OllyDbg SoftICE (已经停止更新) 虽说WinDbg在无源码调试方面确实比较困难,但在调试内核方面却真的有独到之处. https://www.pediy.com/kssd/ ...
- simulate mdns message
use dns-sd command simulate mdns message: dns-sd -R test _test._tcp local 1234 a=1111111111111111111 ...
- jenkins的流水线pipeline+项目实验php
声明:实验环境使用Jenkins的应用与搭建的环境 新建一个流水线 pipeline脚本语法架构 node('slave节点名'){ def 变量 #def可以进行变量声明 stage('阶段名A') ...
- 返回值为record类型的函 初始化 内存泄漏 复制
1.函数需要初始化,否则下次调用函数时,Result还是上次的值,可能会引起误判.但是不会有内存泄漏,即使包含string类型的成员. 2.如果record包含的都是值类型的成员,比如integer, ...
- DevExpress v17.2新版亮点—ASP.NET篇(三)
用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v17.2 的GridView Control. ...
- js写的一个HashMap
1.脚本 /** * 模拟HashMap */ function HashMap(){ //定义长度 var length = 0; //创建一个对象 var obj = new Object(); ...
- Python mode_r
f = open("例子.txt",mode="r",encoding="utf-8") print(f.read(5)) # 读取5个字符 ...