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.不可变对象,顾名思义就是创建后的对象 ...
随机推荐
- 33. 81. Search in Rotated Sorted Array *HARD*
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络
from:http://www.cnblogs.com/kemaswill/p/3266026.html 1. 多层神经网络存在的问题 常用的神经网络模型, 一般只包含输入层, 输出层和一个隐藏层: ...
- python中的对象
一.python对象 python使用对象模型来存储数据.构造任何类型的值都是一个对象. 所有python对象都拥有三个特性:身份.类型.值 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份可 ...
- 快速切题 sgu116. Index of super-prime bfs+树思想
116. Index of super-prime time limit per test: 0.25 sec. memory limit per test: 4096 KB Let P1, P2, ...
- sgu107. 987654321 problem 简单打表 难度:0
107. 987654321 problem time limit per test: 0.25 sec. memory limit per test: 4096 KB For given numbe ...
- Android中aar和jar文件的认识
在Android开发中,我们总是会引入其他第三方的库或者资源等,有时候是添加一个jar文件,有时候添加一个aar文件,那么这两种类型的文件有什么区别吗?详情请看下文. 一.描述. 1. *.jar ...
- poj3461
题解: 简单kmp 然而strlen时间号费啊 代码: #include<cstdio> #include<cstring> using namespace std; ; #d ...
- javascript的replace之正则表达式的浅析
在javascript中,字符串的replace方法可以指定替换某些字符串. 1.直接替换字符串 "yy/MM/dd".replace("yy","2 ...
- 用UILabel实现文字滚动播放(跑马灯)效果
- (void)viewDidLoad { [super viewDidLoad]; //数据源 self.messageArray = [NSArray arrayWithObjects: &quo ...
- Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb
原文链接:http://blog.csdn.net/yunhaibin/article/details/9001198 最近在研究redis,以及spring data对redis的支持发现了一个奇怪 ...