我对java String的理解 及 源码浅析
摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢!
每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! -泥沙砖瓦浆木匠
一.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; }
三.感谢知识来源和小结
String 算是个经常用到的东西,老生常谈了。看看自己看法,大家各抒己见吧。
参考资料:
http://elmer08.blog.163.com/blog/static/71204254201011121382438/