• String intern()


    前言

    测试环境JDK1.8

    常量池可以存放引用,也可以存放常量

    String.intern()分析

     判断这个常量是否存在于常量池。
      如果存在
       判断存在内容是引用还是常量,
        如果是引用,
         返回引用地址指向堆空间对象,
        如果是常量,
         直接返回常量池常量
      如果不存在,
       将当前对象引用复制到常量池,并且返回的是当前对象的引用

        String a1 = "AA";
        System.out.println(a1 == a1.intern()); //true
        String a2 = new String("B") + new String("B");
        a2.intern();
        String a3 = new String("B") + new String("B");
        System.out.println(a2 == a3.intern());//true
        System.out.println(a3 == a3.intern());//false
        String a4 = new String("C") + new String("C");
        System.out.println(a4 == a4.intern()); //true

    三.总结

    1.只在常量池上创建常量

        String a1 = "AA";

    2.只在堆上创建对象

        String a2 = new String("A") + new String("A");

    3.在堆上创建对象,在常量池上创建常量

        String a3 = new String("AA");

    4.在堆上创建对象,在常量池上创建引用

    
    
        String a4 = new String("A") + new String("A");//只在堆上创建对象AA
        a4.intern();//将该对象AA的引用保存到常量池上

    5.在堆上创建对象,在常量池上创建引用, 在常量池上创建常量(不可能)

        String a5 = new String("A") + new String("A");//只在堆上创建对象
        a5.intern();//在常量池上创建引用
        String a6 = "AA";//此时不会再在常量池上创建常量AA,而是将a5的引用返回给a6
        System.out.println(a5 == a6); //true

    6.

    四.练习

             String aa = "AA";//设置常量AA到常量池
             String bb = "BB";//设置常量BB到常量池
             String ccdd = "CC"+"DD";//设置常量CCDD到常量池
             String neeff = new String("EE")+new String("FF");//设置EE和FF到常量池。并且添加EE、FF和EEFF对象到堆
             String aabb = aa+bb;//添加AABB对象到堆
             String gghh = "GG"+new String("HH");//设置GG和HH常量到常量池,设置HH和GGHH对象到堆
    //         aa.intern();//啥事都不做,返回AA常量
    //         ccdd.intern();//啥事都不做,返回CCDD常量
    //         neeff.intern();//添加EEFF对象的引用到常量池,并返回EEFF对象
    //         aabb.intern();//添加AABB对象的引用到常量池,并返回AABB对象
    //         gghh.intern();//添加GGHH对象的引用到常量池,并返回GGHH对象
             System.out.println(aa.intern()==aa); //true
             System.out.println(neeff.intern()=="EEFF");//true
             System.out.println("EEFF"==neeff);//true
             String nccdd = new String("CCDD");
             System.out.println(ccdd==nccdd);//false
             System.out.println(ccdd==nccdd.intern());//true
             System.out.println(aabb.intern()==aabb);//true
             System.out.println(gghh==gghh.intern());//true
    
    
  • 相关阅读:
    Plugs介绍(翻译) .net/C#开源操作系统学习系列六
    Cosmos的里程碑2(Mile Stone 2)之浅尝PCI总线、设备编程.net/C#开源操作系统学习系列九
    [翻译] WindowsPhoneGameBoy模拟器开发二Rom文件分析
    Cosmos开篇、本系列目录.net/C#开源操作系统学习系列一
    Cosmos的汇编级调试器(翻译) .net/C#开源操作系统学习系列七
    数据库牛人榜(随时更新)
    redis大key删除
    Linux LVM硬盘管理及LVM扩容
    Linux学习之CentOS(十一)CentOS6.4下Samba服务器的安装与配置
    Linux学习之CentOS(三十)SELinux安全系统基础
  • 原文地址:https://www.cnblogs.com/think-in-java/p/10418915.html
Copyright © 2020-2023  润新知