关于常量池
2015-08-20 14:45
176 查看
关于常量池
首先要知道JVM运行时数据划分为六种:程序计数器、JAVA栈、方法区、JAVA堆、本地方法区,运行时常量池。其中,运行时常量池也在方法区中!而且我们通常所说的常量池就是运行时常量池。
先看下面的代码:
内存结构图如下:
![](http://img.blog.csdn.net/20150820144638909?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
String 对像是不可变的对像,如果对字符串作出修改,将创建新的对像。
只要采用双引号赋值的字符串,在编译期都会被放到方法区中的字符串的常量池中。运行期如果对字符串进行相加减则会放到堆中(放之前会先验证方法区中是否含有相同的字符串常量,如果存在,把地址返回,如果不存在,先将字符串放到常量池中,然后再返回该对像的地址)
再看如下代码:
![](http://img.blog.csdn.net/20150820144653920?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1. 如果是采用双引号引起来的字符串常量,首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成class文件时就把它放到常量池里了,所以s1和s2都指向常量池中的同一个字符串“abc”。
2. 因为s3采用的是new的方式,在new的时候存在双引号,所以他会到常量区中查找“abc”,而常量区中存在“abc”,所以常量区中将不再放置字符串,而new关键字在堆中分配内存,所以在堆中创建一个对像abc,s3指向这个对像。
面试题:下面的代码创建几个对像?
答案:三个,内存分配如下:
![](http://img.blog.csdn.net/20150820144720225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过以上分析:
1. String类常量不建议采用new来分配,因为new会分配两个对像。
2. 对字符串拼接来讲,会产生很多中间对像,所以性能降低。
首先要知道JVM运行时数据划分为六种:程序计数器、JAVA栈、方法区、JAVA堆、本地方法区,运行时常量池。其中,运行时常量池也在方法区中!而且我们通常所说的常量池就是运行时常量池。
先看下面的代码:
String s1 = "a"; String s2 = "b"; s1 = s1+s2;
内存结构图如下:
String 对像是不可变的对像,如果对字符串作出修改,将创建新的对像。
只要采用双引号赋值的字符串,在编译期都会被放到方法区中的字符串的常量池中。运行期如果对字符串进行相加减则会放到堆中(放之前会先验证方法区中是否含有相同的字符串常量,如果存在,把地址返回,如果不存在,先将字符串放到常量池中,然后再返回该对像的地址)
再看如下代码:
String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc");
1. 如果是采用双引号引起来的字符串常量,首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成class文件时就把它放到常量池里了,所以s1和s2都指向常量池中的同一个字符串“abc”。
2. 因为s3采用的是new的方式,在new的时候存在双引号,所以他会到常量区中查找“abc”,而常量区中存在“abc”,所以常量区中将不再放置字符串,而new关键字在堆中分配内存,所以在堆中创建一个对像abc,s3指向这个对像。
面试题:下面的代码创建几个对像?
String s1 = new String("abc"); String s2 = new String("abc");
答案:三个,内存分配如下:
通过以上分析:
1. String类常量不建议采用new来分配,因为new会分配两个对像。
2. 对字符串拼接来讲,会产生很多中间对像,所以性能降低。
相关文章推荐
- 《旅游点附近如何赚钱》
- 在win7下用U盘安装ubuntu12.04
- kuangbin带你飞 专题九 连通图
- ZooKeeper开发手册中文翻译
- 嵌入式软件工程师介绍
- Note For Linux By Jes(2)-Linux文件与目录管理
- Apache HttpClient4.3.x忽略证书验证
- OpenGL中的绘制命令
- Unicode与UTF-8互转(C语言实现)
- ZOJ 3699 Dakar Rally(贪心)
- 倒排索引
- 细说layout_weight属性
- 安卓突击:数据存储方式
- linux进程间同步和共享内存
- hadoop命令大全
- Linux 时钟处理机制
- 获取ios系统的电池电量比例,是否充电中,是否充满
- 斐波那契数列
- Android学习—selector
- hadoop实战之HDFS常用JavaAPI