对于java程序中的字符直接量,JVM会使用一个字串池来保存它们。当第一次使用某个字符串直接量时,JVM会将它放入字符串池中进行缓存。在一般情况下,字符串池中的字符串对象不会被垃圾回收。当程序再次需要使用该字符串时,无需重新创建一个新的字符串就可以直接让引用变量直接指向字符串中已有的字符串。而使用new操作创建的字符串对象不指向字符串池中的对象,但是可以使用intern方法使其指向字符串池中的对象。
public class StringDemo {
public static void main(String args[]){
String str1 = "abc";
String str2 = "abc";
String str3 = "def";
String str4 = "abcdef";
String str5 = "abc" + "def";//在字符串池中能找到“abcdef”对象,故str5 == str4 为true
String str6 = str2 + str3;//在运行时才知道,也就是说str1+str2是在堆里创建的
String str7 = new String("abcdef");//new操作创建的字符串对象不指向字符串池中的对象
String str8 = str7.intern();//使用intern方法使str7指向的对象加入字符串池中
if(str1 == str2){
System.out.println("此时str1引用变量与str2引用变量" +
"是指向在字符串池中的同一个内存块");
}else{
System.out.println("此时str1引用变量与str2引用变量" +
"不是指向在字符串池中的同一个内存块");
}
if(str4 == str5){
System.out.println("此时str4引用变量与str5引用变量" +
"是指向在字符串池中的同一个内存块");
}else{
System.out.println("此时str4引用变量与str5引用变量" +
"不是指向在字符串池中的同一个内存块");
}
if(str4 == str6){
System.out.println("此时str4引用变量与str6引用变量" +
"是指向在字符串池中的同一个内存块");
}else{
System.out.println("此时str4引用变量与str6引用变量" +
"不是指向在字符串池中的同一个内存块");
}
if(str4 == str7){
System.out.println("此时str4引用变量与str7引用变量" +
"是指向在字符串池中的同一个内存块");
}else{
System.out.println("此时str4引用变量与str7引用变量" +
"不是指向在字符串池中的同一个内存块");
}
if(str4 == str8){
System.out.println("此时str4引用变量与str8引用变量" +
"是指向在字符串池中的同一个内存块");
}else{
System.out.println("此时str4引用变量与str8引用变量" +
"不是指向在字符串池中的同一个内存块");
}
}
}
/*out:
此时str1引用变量与str2引用变量是指向在字符串池中的同一个内存块
此时str4引用变量与str5引用变量是指向在字符串池中的同一个内存块
此时str4引用变量与str6引用变量不是指向在字符串池中的同一个内存块
此时str4引用变量与str7引用变量不是指向在字符串池中的同一个内存块
此时str4引用变量与str8引用变量是指向在字符串池中的同一个内存块*/
因为字符串池中的字符串对象不会被垃圾回收,所以当某个字符串池中的字符串对象失去引用时,它将变成垃圾,而字符串池又不回收。于是便产生了java内存泄露。示例如下:
public class StringDemo1 {
public static void main(String args[]){
String str1 = "abc";
String str3 = "def";
str3 = str1 ;
System.out.println(str3);
System.out.println(str1);
}
}
/*out:
abc
abc
*/
/*"def"失去引用,将成为垃圾,进而内存泄露*/
分享到:
相关推荐
winform 字符串池源码! 很值得下载看看!资源免费,大家分享!!
JAVA字符串池和字符对象[参照].pdf
Java字符串池(String Pool)深度解析.docx
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
主要介绍了java 字符串池的深入理解的相关资料,这里提供实例代码帮助大家学习理解这部分内容,希望大家能够掌握,需要的朋友可以参考下
本文主要介绍Java中的字符串常量池的知识,这里整理了相关资料及简单示例代码帮助大家学习理解此部分的知识,有需要的小伙伴可以参考下
jvm如何处理长字符串?java的classs文件中,constant_utf8_info的长度是u2,也就是说,一个字符串最长是65535个字节,但是,在本机做测试,超过这个长度的字符串也是允许的,原因是什么?
本工具用于生成随机字符串,可以自定义字符池及字符串长度。欢迎下载使用! 本工具用于生成随机字符串,可以自定义字符池及字符串长度。欢迎下载使用!
字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的...
String int 字符串常量池 包装类型 函数参数 值传递引用传递 的 内存分配例子——源码 public static void fun_ref (Ref_test ref_out){ Ref_test ref_in=new Ref_test(); ref_in.s1="in"; //ref_out.s1=...
485通讯改了字符串转数组,解决通讯问题
主要介绍了C#字符串内存分配与驻留池学习分享,大家参考使用吧
当我们创建一个 String 对象时,JAVA 虚拟机(JVM)首先会在字符串池中查找是否已经存在了该对象,如果存在,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则创建新的对象,并将其加入字符串池中。 ...
什么是字符串常量池?Java开发Java经验技巧共6页.pdf.zip
day08_03_字符串的常量池
*String 对象的创建:如果用户创建了一个字符串常量,系统首先会在字符串池中查找有无相同内容的字符串存在,若有就把原有取出使用,若无则重新生成。 二、StringBuffer 类 *StringBuffer 类的追加、插入、查找、...
将ASCII数字转为字符串,方法非常简单而精妙,无需输入冗长的ASCII码表对照。
主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池,需要的朋友可以参考下
oracle连接字符串: class:oracle.jdbc.driver.OracleDriver url:"jdbc:oracle:thin:@localhost:1521:jbitdb","epet","epet" sqlserver: class:com.microsoft.sqlserver.jdbc.SQLServerDriver url:"jdbc:sql...