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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiao142857 中级黑马   /  2015-5-4 02:38  /  800 人查看  /  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 个回复

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