zoukankan      html  css  js  c++  java
  • java中字符串的存储

    在java中,不同的字符串赋值方法,其所在的地址可能不同也就导致,两个字符串的值看似相等可是在s1==s2操作时,其结果返回的却是false

    例:

    	String s1 = "Programming";  
            String s2 = new String("Programming");
            String s5 = "Program" + "ming";
            System.out.println(s1 == s2); //返回值为false  
            System.out.println(s1 == s5);//返回值为true  

    其原因就与java中内存分配的机制有关:而当一个字符串被定义时,会先到常量池中寻找,如果常量池中有这个字符串,则地址直接指向常量池中字符串,如常量池中不存在则将其放入到常量池中;

    关于java的内存分配机制:

    https://www.cnblogs.com/dingyingsi/p/3760730.html
    http://blog.csdn.net/tutngfei1129287460/article/details/7383480


    例:

    //常量池中本来就不含有jva字符,所以new的jva会放入常量池,属于同一个对象,返回true  先new一个SringBuffer对象,此时单独开辟一个区域,然后调用append方法  
          //拼接字符串(相当于对字符串的拼接而不是new的对象了),将拼接完成的字符串放入常量池,此时new出来的对象就是需要放入常量池的,返回true  
                String s1 = new StringBuilder("j").append("va").toString();  
                System.out.println(s1.intern()==s1);//true  
                  
                //常量池中本身就有字符串java所以返回的并不是同一个字符串 s2.intern()返回常量池中的  
                //java s2为new的字符所以不相等返回false  
                String s2 = new StringBuilder("ja").append("va").toString();  
                System.out.println(s2.intern()==s2);//false  
                  
                //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同和  
                String s3 = new StringBuilder("Programming").toString();  
                System.out.println(s3.intern()==s3);//false  
    



    public static void main(String[] args){  
            String s1 = "Programming";    
            String s2 = new String("Programming");  
            String s3 = "Program";  
            String s4 = "ming";  
            String s5 = "Program" + "ming";  
            String s6 = s3 + s4;  
            String s7 = new StringBuilder("Programming").toString();  
            String s8 = new StringBuilder("Program").append("ming").toString();  
              
              
            System.out.println(s1 == s2); //false  s1被赋予字符串Programming后发现常量池中并没有这一字符串,就将其  
            //放入常量池  
            System.out.println(s1 == s5);//true   //字符串的+操作其本质是创建了StringBuilder对象进行append操作,  
            //然后将拼接后的StringBuilder对象用toString方法处理成String对象,s5拼接完成后发现常量池中已经有字符串Programming  
            //所以s5直接取常量池中的字符串所以返回true  
            System.out.println(s1 == s6);//false    这个暂时没搞懂  
            System.out.println(s1 == s5.intern());//true  
            System.out.println(s1 == s6.intern());//true  
            System.out.println(s2 == s2.intern());//false  因为s2  new了一个字符串对象,在堆中单独开辟一块区域,并不是常量池  
                                                    //中对象 所以返回false  
            System.out.println(s7.intern()==s7);//false //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同  
            System.out.println(s8.intern()==s8);///false   这个单独执行时是true  放在这里一起执行是false,个人推测  
            //是因为常量池中已经存在字符串Programming,而s8是new出来的,他拼接完成之后,其地址与常量池中字符串的地址  
            //不同,返回false  
         
        }  
    






  • 相关阅读:
    实用机器学习 跟李沐学AI
    Explicitly drop temp table or let SQL Server handle it
    dotnettransformxdt and FatAntelope
    QQ拼音输入法 禁用模糊音
    (技术八卦)Java VS RoR
    Ruby on rails开发从头来(windows)(七)创建在线购物页面
    Ruby on rails开发从头来(windows)(十三)订单(Order)
    Ruby on rails开发从头来(windows)(十一)订单(Order)
    新员工自缢身亡,华为又站到了风口浪尖
    死亡汽油弹(Napalm Death)乐队的视频和来中国演出的消息
  • 原文地址:https://www.cnblogs.com/tonghao/p/8506033.html
Copyright © 2011-2022 走看看