zoukankan      html  css  js  c++  java
  • java字符串常量池

    字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的String对象的内存地址)。

    测试:

            String str1 = new String("cockcokcockcokc");
         String str = "cockcokcockcokc";
            String str2 = str.intern();
            String str3 = str1.intern();
            String str4 = "cockcokcockcokc";
            String str5 = "cockcok"+"cockcokc";
            String str6 = "cockcok"+new String("cockcokc");
            String str7 = str6.intern();

            System.out.println(str == str1);//false
            System.out.println(str == str2);//true
            System.out.println(str2 == str3);//true
            System.out.println(str == str4);//true
            System.out.println(str == str5);//true
            System.out.println(str == str6);//false
            System.out.println(str == str7);//true
            System.out.println(str == str6);//false
            System.out.println(str1 == str6);//false
            System.out.println(str == str7);//true


    HEAP视图:

    下面来分析:

    1、   String str1 = new String("cockcokcockcokc");

    建立了两个对象,因为常量池中没有"cockcokcockcokc"字符串引用,所除了在堆区建立的String对象外,常量池也建立了一个String对象

    2、String str = "cockcokcockcokc";

    因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str

    3、String str2 = str.intern();

    因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str2

    4、 String str3 = str1.intern();

    因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str3

    5、String str4 = "cockcokcockcokc";

     因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str4

    6、String str5 = "cockcok"+"cockcokc";

     因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str5

    7、String str6 = "cockcok"+new String("cockcokc");

     建立了一个对象,因为常量池中"cockcokcockcokc"字符串引用存在于字符串常量池,所以只在堆区建立了一个String对象

    8、 String str7 = str6.intern();

    因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str7

    总结:

    当第一次使用String s = new String("characterString")时,会在堆中建立两个Stirng对象,一个引用返回给s,另一个引用维护在常量池中,用inter()方法取得的永远是常量池中的引用;若第一次使用String s="characterString",会在堆中建立一个String对象,维护在常量池中,并返回给s,所以,平时使用Stirng的时候,尽量不要使用new String("characterString")的方式初始化String

  • 相关阅读:
    安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误
    [迷宫中的算法实践]迷宫生成算法——Prim算法
    [MVC学习笔记]7.使用极验验证来制作更高逼格的验证码
    Android UI--提高Android UI体验
    Genymotion的使用 -- A Faster Android Emulator
    【Xamarin】Visual Studio 2013 Xamarin for Android开发环境搭建与配置&Genymotion
    【ASP.NET Web API2】利用HttpClient调用Web API(TODO)
    VMware 11 安装 Mac OS X10.10
    ASP.NET MVC 缓存Outputcache (局部动态)
    【ASP.NET Web API2】初识Web API
  • 原文地址:https://www.cnblogs.com/lige-H/p/7216544.html
Copyright © 2011-2022 走看看