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.不可变对象,顾名思义就是创建后的对象 ...
随机推荐
- C语言按行读文件及字符串分割
#include<stdio.h> #include<iostream> using namespace std; int main() { char s[50]; char ...
- Python中变量、赋值、浅拷贝、深拷贝
https://www.cnblogs.com/LetMe/p/6724555.html 在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用 ...
- Ionic实现自定义返回按键事件
在 Android 和 Window 平台下,有时候我们需要监听返回按键的事件来进行相应的操作,也就是自定义返回按键事件.下面根据一个例子来讲解如何在 ionic 中自定义返回按键事件. 功能需求 首 ...
- 0001——初涉MySQL
MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版本和企业版 MySQL安装方式: 1.MSI安装(Windows Installer) 2.ZIP安装 选择安装类型: 1.T ...
- 转mysql半主从同步
MySQL半同步复制 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) ...
- openSUSE 12.3 默认启动项
修改默认opensuse12.3的默认启动项目(grub2). vim /boot/grub2/grubenv 里面有一条: saved_entry=openSUSE 12.3 修改为saved_en ...
- PatePoco中对sql参数化时Top参数化的问题
PatePoco中对sql参数化是直接用@+参数名来处理,但是想用如下语句时竟然报错了 SELECT TOP @num * FROM tableA 执行时抛出异常,根据错误提示搞了很久都没找到原因,最 ...
- 51nod1079
模板题... 代码: #include <iostream> using namespace std; ],p[]; int main() { int n; while(cin>&g ...
- windows10自动登陆
老是记不住命令,记录一下 win+R 输入以下命令 Control Userpasswords2
- L1-034 点赞
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性.本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特 ...