栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于java中对String在内存存储方面的理解,以及字符串常量池的作用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于java中对String在内存存储方面的理解,以及字符串常量池的作用

我们知道JVM分三块内存区域——栈、堆和方法区
java中的数据类型分——引用数据类型和基本数据类型
String属于引用数据类型,那么创建的字符串存在哪里呢?例如对以下代码进行内存分析:

public class TestString01 {
	public static void main(String[] args) {
		String s1 = "asd";
   		String s2 = "asd" + "jkl";
    	String s3 = new String("jkl");
    }
}

我们首先要知道,双引号括起来的字符串存储在字符串常量池中,字符串常量池又存在于方法区当中,所以像常量一样,java中字符串一旦创建不可改变,即“asd”储存在方法区当中不能被修改,这种机制的存在,提高了执行效率,例如上述代码中,定义s1和s2时,就在字符串常量池中开辟了三块空间,分别存储"asd"、“jkl"和"asdjkl”,在再创建s3对象时,就可以直接用现成的,不需要重新新开辟空间存储“jkl”,上面代码内存图如下所示:

试分析以下代码的执行效果:

public class TestString01 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("word");
        String s4 = new String("word");
        System.out.println(s1 == s2);
        System.out.println(s3 == s4);
    }
}

我们可以通过画内存图更加直观的知道:

如图可知,s1和s2存储的地址相同,所以第一个输出为true,s3和s4存储的是堆里面的两个String对象的内存地址,虽然堆里面的两个String对象存储的两个内存地址相同,但栈里面s3和s4里面存储的内存地址不一样,所以第二个输出为false。
试分析以下代码创建了几个对象:

public class TestString01 {
    public static void main(String[] args) {
        String s3 = new String("word");
        String s4 = new String("word");
    }
}

正确答案是三个,堆里面两个和字符串常量池里面一个。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/733142.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号