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.不可变对象,顾名思义就是创建后的对象 ...
随机推荐
- JSP EL简介
JSP EL简介:1.语法: ${expression} 2.[ ]与.运算符 EL 提供“.“和“[ ]“两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等 ...
- vue2.0对不同数据类型的显示
- forget word out2
1★ dictionary / dik ʃ ən əri dict 2★ fy => faction f æk ʃ ən 派别
- Chrome nacl开启
Chrome nacl开启
- 重启oracle数据库的操作方法
在实际的应用中,有时候工作数据库需要重新启动.本文介绍了一个特别实用的操作步骤,希望对大家有所帮助. 1. 停应用层的各种程序 2. 停Oralce的监听进程 $ lsnrctl stop 3. 在独 ...
- hdu4348
题解: 因为卡空间,所以直接到spoj上面去做了 区间修改的线段树 但是加lazy会把之前的操作修改 正确的解法是lazy不下传,只是在当前计算 但是听说可以记录时间的下传,我弱弱不会 代码: #in ...
- mysql 到postgresql
1 import pandas as pd 2 import psycopg2 3 from io import StringIO 4 import pymysql 5 conf={"mys ...
- L1-042 日期格式化
世界上不同国家有不同的写日期的习惯.比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”.下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期. 输入格式: 输入在一行中按照“ ...
- Jmeter BeanShell 从数据库中获取数据并创建一个requesBody
一.前言 在测试接口的时候常常会使用到数据库中的数据,当要使用大量的数据时,仅仅使用数据库查询是不够的.还需要使用自动化让操作更简便. 下面以一个简单的例子阐述一下如何使用beanShell让代码更简 ...
- [转载]三款SDR平台对比:HackRF,bladeRF和USRP
这篇文章是 Taylor Killian 13年8月发表在自己的博客上的.他对比了三款平价的SDR平台,认为这三款产品将是未来一年中最受欢迎的SDR平台.我觉得这篇文章很有参考价值,简单翻译一份转过来 ...