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.不可变对象,顾名思义就是创建后的对象 ...
随机推荐
- 浏览器请求中文乱码(ISO-8859-1 to UTF-8)
String utfString=new String(param.getBytes("iso-8859-1"),"utf-8");
- 对称点line
2 线 题⽬描述 有一天rax看到了男神,有时可爱美丽的她派ypq去把yyqx抓回来给rax欣赏,但ypq和yyqx间隔了一条线,她必须跳到yyqx以前待得点的对称点才有可能抓到yyqx给出⼀条直线, ...
- Linux免密码登陆
A电脑实现不用密码登陆到B电脑! vim /etc/ssh/sshd_config 编辑文件 01.在A电脑上生成ssh密钥 ssh-keygen -t rsa02.把A电脑生成的id_rsa.p ...
- 《Python》 内置函数
一.内置函数: Python给你提供的,拿来直接用的函数,比如print.input等等,就是内置函数. 截止到Python版本3.6.2,现在Python一共为我们提供了68个内置函数. ...
- QT环境下实现UI界面的“拼图游戏”
main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *ar ...
- 关于while(cin>>c)语句的理解
1.while(cin>>c)条件语句,其功能是检测输入流中的输入是否有效,若是文件结束标记或者非法输入,则条件判断为假,否则为真. 2.windows下的文件结束标记是Ctrl+z,Li ...
- 玩转X-CTR100 | X-Assistant串口助手控制功能
更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器配套的X-Assistant串口调试 ...
- React Native笔记整理
判断一个APP页面时原生还是H5:http://www.cnblogs.com/sonice-cinsy/p/5671324.html 写给移动开发者的React Native指南:http://bl ...
- apache的<directory> 语句以及属性的含义
在整完apache和tomcat的之后我觉得有必要把<directory>和它下面的属性捋顺一下 如何访问根目录下的目录http://192.168.1.12/test/ 第一.缺省apa ...
- TJson.format() 输出错误的CRLF
下面的JSON串: { "a":"x=\"a,b\"" } 通过下面代码输出,多了CRLF: procedure JsonFormatTes ...