我对java 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
{
    \u0070\u0075\u0062\u006C\u0069\u0063 static void main(String\u005B\u005D 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;
    }

相关文章
|
1天前
|
JavaScript Java 测试技术
基于Java的快递信息管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的快递信息管理系统的设计与实现(源码+lw+部署文档+讲解等)
25 5
|
1天前
|
JavaScript Java 测试技术
基于Java的通讯录管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的通讯录管理系统的设计与实现(源码+lw+部署文档+讲解等)
21 5
|
1天前
|
JavaScript Java 测试技术
基于Java的普通话培训信息管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的普通话培训信息管理系统的设计与实现(源码+lw+部署文档+讲解等)
27 9
|
1天前
|
JavaScript Java 测试技术
基于Java的在线开放课程的设计与实现(源码+lw+部署文档+讲解等)
基于Java的在线开放课程的设计与实现(源码+lw+部署文档+讲解等)
27 3
|
1天前
|
JavaScript Java 测试技术
基于Java的个人消费管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的个人消费管理系统的设计与实现(源码+lw+部署文档+讲解等)
21 4
|
1天前
|
JavaScript Java 测试技术
基于Java的大学生校园招聘网的设计与实现(源码+lw+部署文档+讲解等)
基于Java的大学生校园招聘网的设计与实现(源码+lw+部署文档+讲解等)
20 3
|
1天前
|
JavaScript Java 测试技术
基于Java的社区人员管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的社区人员管理系统的设计与实现(源码+lw+部署文档+讲解等)
12 2
|
1天前
|
JavaScript Java 测试技术
基于Java的学生就业管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的学生就业管理系统的设计与实现(源码+lw+部署文档+讲解等)
14 3
|
1天前
|
JavaScript Java 测试技术
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
21 3
|
1天前
|
JavaScript Java 测试技术
基于Java的图书馆智能选座系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的图书馆智能选座系统的设计与实现(源码+lw+部署文档+讲解等)
15 2