zoukankan      html  css  js  c++  java
  • String的深入解析

     

    1.String和StringBuilder、StringBuffer的区别?

      答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

    2.String str=new String("hello");

      上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量是放在方法区的(常量池)。

    3.以下题目博大精深

    package com.etc.dao;
    
    public class dd {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
             String s1 = "Programming";
                String s2 = new String("Programming");
                String s3 = "Program";
                String s4 = "ming";
                String s5 = "Program" + "ming";//java自动拼接成Programming
                String s6 = s3 + s4;
                System.out.println(s1 == s2);//字符串引用==字符串
                System.out.println(s1 == s5);//字符串==字符串
                /**
                 *  字符串的+操作其本质是创建了StringBuilder对象进行append操作,
                 *  然后将拼接后的StringBuilder对象用toString方法处理成String对象,返回的是引用
                 */
                System.out.println(s1 == s6);//字符串==引用
                //intern方法返回 如果常量池在字符串返回字符串,不存在,存入,返回引用
                System.out.println(s1 == s6.intern());//字符串==字符串
                System.out.println(s2 == s2.intern());//字符串引用==字符串
        }
    
    }
    结果:false
       true
       false
       true
       false

      

    补充:解答试题需要清楚两点:

      1. String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true,返回该字符串),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;

      2. 字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这一点可以用javap -c StringEqualTest.class命令获得class文件对应的JVM字节码指令就可以看出来。

    这是我的新博客,以后文章都会放在上面,欢迎来访。http://blog.shadowwu.club

  • 相关阅读:
    【BZOJ2599】[IOI2011]Race 树的点分治
    【BZOJ1787】[Ahoi2008]Meet 紧急集合 LCA
    【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流
    【BZOJ3012】[Usaco2012 Dec]First! Trie树+拓补排序
    【BZOJ2743】[HEOI2012]采花 离线+树状数组
    【BZOJ2946】[Poi2000]公共串 后缀数组+二分
    【BZOJ2157】旅游 树链剖分+线段树
    【BZOJ2661】[BeiJing wc2012]连连看 最大费用流
    【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
    【BZOJ4236】JOIOJI STL
  • 原文地址:https://www.cnblogs.com/wuxinyiwu/p/7485788.html
Copyright © 2011-2022 走看看