我对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/
http://blog.csdn.net/sunzhenhua0608/article/details/7628663
http://blog.csdn.net/f562867448/article/details/8679550
我对java String的理解 及 源码浅析的更多相关文章
- java String类 trim() 方法源码分析
public String trim() { int arg0 = this.value.length; //得到此字符串的长度 int arg1 = 0; //声 ...
- [Java源码解析] -- String类的compareTo(String otherString)方法的源码解析
String类下的compareTo(String otherString)方法的源码解析 一. 前言 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识, ...
- Java集合系列[4]----LinkedHashMap源码分析
这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...
- 深入理解OkHttp源码(三)——网络操作
这篇博客侧重于了解OkHttp的网络部分,包括Socket的创建.连接,连接池等要点.OkHttp对Socket的流操作使用了Okio进行了封装,本篇博客不做介绍,想了解的朋友可以参考拆轮子系列:拆O ...
- 【JVM】深度分析Java的ClassLoader机制(源码级别)
原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...
- String 源码浅析(一)
前言 相信作为 JAVAER,平时编码时使用最多的必然是 String 字符串,而相信应该存在不少人对于 String 的 api 很熟悉了,但没有看过其源码实现,其实我个人觉得对于 api 的使用, ...
- java集合系列之HashMap源码
java集合系列之HashMap源码 HashMap的源码可真不好消化!!! 首先简单介绍一下HashMap集合的特点.HashMap存放键值对,键值对封装在Node(代码如下,比较简单,不再介绍)节 ...
- JAVA设计模式-动态代理(Proxy)源码分析
在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
随机推荐
- PL/SQL Developer 破解方法~
1.有注册码的方式:亲自测试,立马见效 LicenseNumber : 999 productCode : 46jvnzf74ysf3mqm4hx4tvhcamh8gpe3v5 SeriesNumbe ...
- fiddler不能抓某些的包的原因
用fiddler抓某app的包时,死活抓不到,确定自己设置的没有错,并且让小A同事也看了一遍我的设置,确认没错后,又在小A同事那儿试了下还是抓不到 后来在网上找了很多资料,才发现是因为一些app使用了 ...
- #2019-2020-4 《Java 程序设计》第九周总结
2019-2020-4 <Java 程序设计>第九周知识总结 第十一章:JDBC与MySQL数据库 11.1 MySQL数据库管理系统 下载安装: 11.2 启动MySQL数据库服务器 具 ...
- 深入理解java虚拟机(二)-----垃圾回收
做一个java程序员很是幸福,不用管不用的对象如何被回收,但是我认为了解一下也不是坏事. 一.如何判断对象已经死亡? 在进行垃圾回收之前,第一件事肯定是判断对象是否已经死亡.1.引用计数算法给对象添加 ...
- Nexus安装、使用说明、问题总结
Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...
- linux 环境统配
#java JAVA_HOME=/opt/jdk CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME C ...
- android-基础编程-Notification
Notification 的创建主要涉及到 Notification.Builder . Notification . NotificationManager . Notification.Buile ...
- windows mysql zip 安装
https://www.cnblogs.com/iathanasy/p/8461429.html
- 性能测试-----monkey稳定性测试
我们稳定性测试用的monkey,跑monkey的同时存储log monkey脚本: @echo.@set /p name=请输入你的名字(比如liuyl): set YYYYmmdd=%date:~0 ...
- Python之旅Day8 socket网络编程
socket网络编程 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可.soc ...