易截截图软件、单文件、免安装、纯绿色、仅160KB

JAVA String对象和字符串常量的关系解析

JAVA String对象和字符串常量的关系解析
1 字符串内部列表
  JAVA中所有的对象都存放在堆里面,包括String对象。字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了。
虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string、integer和float point常量)和对其他类型、字段和方法的符号引用。
例如,
String s = new String( "myString" );
其中字符串常量是"myString",在编译时被存储在常量池的某个位置。在解析阶段,虚拟机发现字符串常量"myString",它会在一个内部字符串常量列表中查找,如果没有找到,那么会在堆里面创建一个包含字符序列[myString]的String对象s1,然后把这个字符序列和对应的String对象作为名值对( [myString], s1 )保存到内部字符串常量列表中。如下图所示:
  如果虚拟机后面又发现了一个相同的字符串常量myString,它会在这个内部字符串常量列表内找到相同的字符序列,然后返回对应的String对象的引用。维护这个内部列表的关键是任何特定的字符序列在这个列表上只出现一次。
例如,String s2 = "myString",运行时s2会从内部字符串常量列表内得到s1的返回值,所以s2和s1都指向同一个String对象。但是String对象s在堆里的一个不同位置,所以和s1不相同。
JAVA中的字符串常量可以作为String对象使用,字符串常量的字符序列本身是存放在常量池中,在字符串内部列表中每个字符串常量的字符序列对应一个String对象,实际使用的就是这个对象。
2 字符串截留intern
在某些上下文环境下,仅仅保留某个字符串的一份copy能够提高内存的使用和效率。String类的intern()方法可以截留字符串,如果String对象包含的字符序列不在字符串常量内部列表中,那么就把这个String对象包含的字符序列和String对象的引用作为名值对保存到内部列表中,最后intern()返回一个指向String对象本身的引用;如果
String对象包含的字符序列在字符串常量内部列表中,那么就返回列表的名值对中的对应的字符串对象引用,而String对象本身的就会被丢弃。
例如,s.intern()就会返回和s2相同的引用,而以前的s对象就会被垃圾回收。
使用intern()要注意,被放到字符串内部列表中的字符串对象是不会被垃圾回收的,生命周期和整个程序相同,所以如果使用不当会造成内存泄露。
 


相关文档:

编程, 阅读程序, Java,开源

  最近一两个月以来一直在看java 代码, 看了一些开源的实现, 也看了一些产品中的代码,从这些代码中,学习了一些开源框架的应用(如ActiveMQ,cxf),也学习了这些框架的实现,同时也注意去理解每个类 以及接口的设计,以及设计模式的应用, 关注了一下,每个类,接口的规模,基本上有一些也会非常大,有几千行,有一些 ......

黑莓Java应用开发环境

设置 win xp/win 7 的黑莓Java的开发环境的步骤如下:
1. BlackBerry应用开发基于Java,首先需要JDK (6.0以上的版本)
下载最新JDK
下载完后双击安装即可。
2. 下载BlackBerry SDK,这里有两种选择: BlackBerry JDE, BlackBerry Java Plug-in with Eclipse
2.1 BlackBerry JDE是RIM自主开发的IDE
下载 BlackBerry J ......

Java输入数据流详解


<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体" ......

java面试


一、Java部分(共40分)
1、 说说Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?(5分)
Overload是覆盖,子类的方法跟父类方法名字一样,子类的方法把父类的覆盖了。 
Override是重载,不同的方法参数、返回值不一样,紧紧返回值不一样的两个函数不叫重载,编译不会通过的。
Over ......

java获取当前日期的前一天日期与字符串日期之间的转换

         这几天一直在处理Java的日期问题,通常需要按要求生成日期的话,通常会用到util包中的Calendar类,再用Calendar的getTime()方法生成对应的Date,最后用SimpleDateFormat输出。
 
1. 获取当期日期、年份、月份
import java.util.Calendar;
public clas ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号