黑马程序员技术交流社区

标题: 关于字符串的一点理解 [打印本页]

作者: jiao142857    时间: 2015-5-4 02:38
标题: 关于字符串的一点理解
本帖最后由 jiao142857 于 2015-5-4 02:58 编辑

学习了半天String字符串,发现好多细节.
直接上代码

    大家都知道String是不可变的,源码如下
    public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];//使用final修饰

    String a = "a";
    a += "b";
    System.out.println(a);//ab
    上面代码可以运行是因为a的指向改变了

String是引用数据类型,那么它的值都是些内存地址

    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1 == s2);//true 说明s1 和 s2指向一样(在栈中)
    String s11 = new String ( "abc" );
    String s22 = new String ( "abc" );
    System.out.println(s11 == s22);//false 说明s11和s22是不同的对象(都在堆中)
   

还有以下情况:

    String ab = "ab";
    String ab1 = "a"+"b";
    System.out.println(ab==ab1);//true
    //字符串常量在编译时已经确定"a"+"b"后的值就"ab"  变量ab 和 ab1指向相同
    String a = "a";
    String b = "b";
    String ab2 = "ab";
    System.out.println(ab2 == (a + b));//false
    //变量在编译时不确定,只用运行时动态分配地址


细节来了

    final String a = "a";
    final String b = "b";
    String ab2 = "ab";
    System.out.println(ab2 == (a + b));//true final修饰的变量类似于常量


新的问题出现了

        public static void main(String[] args) {
            final String a = "a";
            final String b = getB();
            String ab2 = "ab";
            System.out.println(ab2 == (a + b));//false final固定的只是b的引用值 而方法是运行时才调用的
        }
        private static String getB() {
            return "b";
        }


一点总结,分享下




作者: Ray丶少年    时间: 2015-5-4 08:12
厉害,受教了
作者: csu050416    时间: 2015-5-4 09:19
嗯,好帖子。一些问题豁然开朗。
作者: ninjaes    时间: 2015-5-4 09:45
讲的很好  
作者: 快乐Anne    时间: 2015-5-4 10:37
受益匪浅
作者: luoriver    时间: 2015-5-4 18:05
理解深刻啊
作者: jiao142857    时间: 2015-5-4 20:53
大家共同努力
作者: 王英明    时间: 2015-5-4 21:08
快学到了,提前预习一下!
作者: 付长云    时间: 2015-5-4 21:20
顶                                




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2