A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiao142857 中级黑马   /  2015-5-4 02:38  /  801 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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";
        }


一点总结,分享下



评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

8 个回复

倒序浏览
厉害,受教了
回复 使用道具 举报
嗯,好帖子。一些问题豁然开朗。
回复 使用道具 举报
讲的很好  
回复 使用道具 举报
受益匪浅
回复 使用道具 举报
理解深刻啊
回复 使用道具 举报
大家共同努力
回复 使用道具 举报
快学到了,提前预习一下!
回复 使用道具 举报
顶                                
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马