zoukankan      html  css  js  c++  java
  • 我对java String的理解 及 源码浅析

    摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢!

    每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! -泥沙砖瓦浆木匠

    一.char说起到String

    二.String的认识及源码浅析

    一.char说起到String

    这也是自己第二次回过头来啃java基础书,小生自认为愚昧无知。如果大神有好的教育,可以评论私信。以下都是我的看法:
    为什么说char呢,我这里先卖个关子。在java中,char是用unicode编码的,占16位(2字节)。从ansi编码(1字节)到unicode编码(2字节)。Java中使用Unicode的原因是,Java的Applet(网页)运行,Unicode里面包含最多最广比如:中文,English,Spanish,German, French等。因此,char属于java的基本类型之一,使用也很方便。

    注意:在java中,char类型用UTF-16编码描述的一个代码单元。

    二.String的认识及源码浅析

    这里我就解答则个关子,刚才为啥说String和char密切相关。因为java字符串String就是char值序列(其实就是final的char数组)组成。在源码中很好的证明了这一点:

    /** The value is used for character storage. */
        private final char value[];
    为了证明上面的东西,大家可以来写一段好玩的代码:
    public class Test
    {
        u0070u0075u0062u006Cu0069u0063 static void main(Stringu005Bu005D args)
        {
            System.out.println("this is not PI: u03C0");
        }
    }

    运行后你可以看到以下输出:

    this is not PI: π

    但有些人不要误解,比如java的

    String name = "Jeff Li";

    以为它就是想C语言中的 char name[]="Jeff Li"; 这种认知是错误的,其他它更像char*指针:

    char *name = "Jeff Li";

    最常见的也是最经常被使用的 boolean equals()分析,源码如下:

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String) anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                                return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }

    从源码中慢慢道来:例子(A.equals(B))
    第一:if (this == anObject)

    //this代表A,其实就是判断其B对象是否和A的引用型变量表示的是两个变量在堆中存储的地址(就是栈引用一样内容自然一样)。

    第二: if (anObject instanceof String)

    //java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。这句话为了下面强转 String anotherString = (String) anObject;
    第三:我刚开始有些疑惑源码中的:我觉得是String类型的anotherString获取到char值序列(char[]),这就回到了前面内容。

    anotherString.value

    猜测是如上意思,如果大牛有的可以说的地方,请说。因为我自己想实现一个简单的StringCopy时,这个老是不行,不知道为什么。

    第四:剩下的就是char[]直接循环比较了。

    还有些常用的 split (正则) format 这里不发表一一看法了。

    另外有一句很好的代码分享:来自org.apache.commons.lang

    public static boolean isEmpty(String str) {
            return str == null || str.length() == 0;
        }

    三.感谢知识来源和小结

    String 算是个经常用到的东西,老生常谈了。看看自己看法,大家各抒己见吧。

    一.char说起到String

    二.String的认识及源码浅析

    参考资料:

    http://elmer08.blog.163.com/blog/static/71204254201011121382438/

    http://blog.csdn.net/sunzhenhua0608/article/details/7628663

    http://blog.csdn.net/f562867448/article/details/8679550

  • 相关阅读:
    virtualbox使用相关问题
    mac os中的一些快捷键使用及基础软件安装
    U盘安装CentOS7
    Netbeans8下 Weblogic EJB案例
    Linux Weblogic 数据源 TimesTen配置
    JDBC操作TimesTen
    Red Hat TimesTen安装记录
    使用Protractor进行AngularJS e2e测试案例
    基于Karma和Jasmine的AngularJS测试
    protractor protractor.conf.js [launcher] Process exited with error code 1 undefined:1190
  • 原文地址:https://www.cnblogs.com/Alandre/p/3917608.html
Copyright © 2011-2022 走看看