博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我对java String的理解 及 源码浅析
阅读量:7136 次
发布时间:2019-06-28

本文共 2322 字,大约阅读时间需要 7 分钟。

hot3.png

摘要: 摘要: 原创出处: 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 算是个经常用到的东西,老生常谈了。看看自己看法,大家各抒己见吧。

参考资料:

转载于:https://my.oschina.net/jeffli1993/blog/303122

你可能感兴趣的文章
全排列问题(内测第0届第1题)
查看>>
使用GROUP BY统计记录条数 COUNT(*) DISTINCT
查看>>
python中的迭代器
查看>>
IIS如何设置可以让.aspx后缀的文件直接下载
查看>>
dhcpcd 移植
查看>>
hdu 4676 Sum Of Gcd 莫队+phi反演
查看>>
Java关系操作符简写
查看>>
原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)...
查看>>
Java动态编程---动态代理
查看>>
GBDT(MART) 迭代决策树入门教程 | 简介
查看>>
第二十节,基本数据类型,集合set、综合应用新数据更新老数据
查看>>
架构设计:前后端分离之Web前端架构设计
查看>>
C#动态调用WCF接口(2)
查看>>
SQLAlchemy增删改查基本操作,及SQL基本技能样码(join,group)
查看>>
Python中获取当前日期的格式
查看>>
win10 安装visual studio 2015遇到的坑
查看>>
机器学习——基于概率论的分类方法:朴素贝叶斯
查看>>
Spring中的Interceptor 拦截器 专题
查看>>
mysql计算连续天数,mysql连续登录天数,连续天数统计
查看>>
用离散傅里叶变换实现线性卷积
查看>>