java常量池理解
String类两种不同的创建方式
String s1 = "zheng"; //第一种创建方式
String s2 = new String("junxiang"); //第二种创建方式
第一种创建方式是编译期在常量池中创建对象,如果常量池中已经存在"zheng"这个String对象,就将地址赋给s1.第二种创建方式是运行期在堆中创建对象,无论堆中是否已有都会重新创建一个对象。
String s1 = new String("xyz");
String s2 = new String("xyz");
上边创建了3个String对象,编译期常量池创建了1个,运行期堆中创建了2个。
例1:
String s1 = "xyz";
String s2 = "xyz";
System.out.println(s1==s2);
//输出true,因为如果在常量池中已有相同的对象则不再创建而将地址赋给s2。
例2:
String s1 = new String("xyz");
String s2 = new String("xyz");
System.out.println(s1 == s2);
//输出结果是false,因为采用new在堆中每次都会创建一个新对象。
例3:
String x = "zheng";
String y = "jx";
String s = "jxzheng";
String s1 = y + x;
String s2 = "jx" + "zheng";
System.out.println(s1 == s);//输出false,因为字符串连接操作数中有变量。所以运行期才能确定,存在堆中。
System.out.println(s2 == s);//输出true,因为字符串连接操作数都是字符串常量,编译期即可确定,存在常量池中。
总结为以下四条规律:
1,单独使用""引号创建的字符串都是常量,编译期就已经确定存储到String Pool中;
2,使用new String("")创建的对象会存储到heap中,是运行期新创建的;
3,使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到String Pool中;
4,使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中;
String.intern()
String s1 = new String("xyz");
s1 = s1.intern();//intern()返回在常量池中这个String对象的引用。如果常量池中已经存在这个String对象,则直接返回该对象的引用,否则,在常量池中创建对象并返回引用。
例4:
String s3 = new String("1") + new String("2");
s3.intern();
String s4 = "12";
System.out.println(s3 == s4);//jdk7/8输出结果为true
原因是jdk7中的常量池不是在方法区而是在堆中,可以直接存储对象的引用。所以s4和s3指向的是同一个对象。这篇博客String.intern() Test of JDK6 And JDK7讲解比较清楚。
参考博客:
java常量池理解的更多相关文章
- Java基础知识强化103:Java常量池理解与总结
一.相关概念 1. 什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. 2. Class文件中的 ...
- java虚拟机学习-Java常量池理解与总结(13-2)
一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...
- [转]java常量池理解总结
一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...
- 【转载】Java常量池
本篇随笔为转载,原贴地址:Java常量池理解与总结. (其实Java的常量池有点像C++中的存储字符串常量的常量存储区). 一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法 ...
- java虚拟机学习-触摸java常量池(13-1)
java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...
- 触摸java常量池
java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的 ...
- java常量池概念
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- java常量池中基本数据类型包装类的小陷阱
想必大部分学过java的人都应该做过这种题目: public class Test { public static void main(String[] args) { //第一个字符串 String ...
- java常量池概念 (转)
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
随机推荐
- Cube(hd1220)
Cube 点我 Problem Description Cowl is good at solving math problems. One day a friend asked him such a ...
- MYSQL while 、repeat
前期准备: createt table employee(ID int ,Name varchar(4)); 用下列方法向表中循环插入数据. ----------------------------- ...
- Sql Server专题:SQL 经典实例
SQL 经典实例 1.实例表: Student(S#,Sname,Sage,Ssex) 学生表 S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname ...
- Windows下Node.js开发环境搭建
1.http://nodejs.org/下载node.js运行环境安装 2.打开DOS命令行 .安装express框架 1 >npm install express 末尾显示如下为安装成功 .安 ...
- 一步一步学python(七) - 更加抽象
1.面向对象 面向对象程序设计中的术语对象基本上可以看做数据以及由一系列可以存取这些数据方法所组成的集合. 2.多态 对不同的类的对象使用同样的操作 2.1 多态和方法 程序得到了对象可能有多种形状, ...
- Centos安装webbench
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: 引用 wget htt ...
- 甲骨文推动Java进军“物联网”
该公司希望在嵌入式设备开发项目上Java可以取代C 随着周二宣布对嵌入式的Java版本进行升级,甲骨文希望扩展该平台到新一代连接设备,又名物联网.甲骨文还希望,Java可以在一些嵌入式开发项目 ...
- POJ 3311 Hie with the Pie(状压DP + Floyd)
题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...
- android soundpool 參数说明
SoundPool 类的构造函数例如以下: SoundPool(int maxStreams, int streamType, int srcQuality) 作用:实例化一个SoundPool 实例 ...
- Cassandra - Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless
In cassandra 2.1.4, if you run "nodetool status" without any keyspace specified, you will ...