作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手非凡写出鸿篇巨作的人,常常坚持不了完成第1章节。 |
1.1 前言
说起String,大家最熟习不过了。我也是那末说过,但是恍如这熟习的里面也有很多细节,或是我们没掌握的东西。常常有很多旧东西里面爆出很多光点。比如,作者泥瓦匠近期在冬季的牛崽裤里面搜出了1张100现金(不宜乐乎)。回到正题,我们下面以下几点讲下String。分两个部份:
基础部份:(JDK源码 文档)
- 1.2 你好 String
- 1.3 String字符串操作
扩大部份:
- 1.3 == 与 equals 不是亲家
- 1.4 也不难 泥瓦匠再出奇招
- 1.5 equals碰到n长字符串呢?
- 1.6 intern妙用
楼主不是大牛级别的人物,泥瓦匠1直认为的是“打算起手非凡写出鸿篇巨作的人,常常坚持不了完成第1章节。”所以,操着键盘,听着喜欢的音乐。幽默的对你说我的理解体会。
(希望大牛指出毛病,万分感谢!)
1.2 你好 String
怀着初次见你的心情,泥瓦匠和你1起打开JDK1.7文档。我最近想写1些关于JDK1.7的理解,都知道JDK8出来了,新特性我准备下阶段有空学习。
泥瓦匠想说,浏览E文文档有益于体会原汁原味。但毕竟国内大牛翻译的很不错了,我们不加评判,喜欢哪一种自己挑。能抓老鼠,能解决实际项目,适应业务环境的就是你学到了。请看下面的小例子:
清单1.1
泥瓦匠,你不是在忽悠我吗?这么简单的程序,你想说甚么。说实在确切是基础,但基础扎实才能有更高的突破。就想泥瓦匠默默为自己,为家人为未来打基础。
可以见,String是不需要用new来创建1个新对象的类。它是不可变的(Constant),其值(像"abc"创建后,不可改变)。自然,String其实实现了基本类型char的序列的功能,因此中文名“字符串”。这里大家有可能疑惑,泥瓦匠就找到JDK源码证据给你们看:
这段代码是来自JDK1.7源码里面的,char型value数组的情势组成了String类的内容。其操作就是针对value数组操作。这样想是不是豁然开朗,然后心里自喜“so easy”。其实难点下面,大家渐渐看下去。
1.3 String字符串操作
照旧看代码清单1.1,Java提供了1个特殊的连接操作符(concatenation operator)+ 用于直接来拼接字符串。其中操作经常使用的方法罗列以下:
随着泥瓦匠运行下清单1.1,你可以看到打印出来:
很简单的发现答案就是我们心目中想要的。这里我不打算很详细的解释api,这样会失去文章的趣味和读者的兴趣。我喜欢用例子来引导出,对String在我项目和经验中的总结。
下面就以我们substring()方法来解释下源码,可以看到其中实现的细节:
逻辑大致归纳以下:
1. 首先判断传入值得可靠性,判断传入的开始和结束,还有子字符串的长度。这是在每一个系统开发需要在细节中关心的。关心细节,才能干大事。
2. 然后判断是否是原String,是的话,直接返回this,如果不是就new1个子串。这个构造函数实现也不难,如果有兴趣可以看看,其实也就是实现char数组的拷贝。
就String基础部份泥瓦匠就介绍这里,在这里我们可以得出的结论是:设计源于生活,源于简单。像1个方法和1个类结构的设计,单1简单。所以我们学习以后设计方法要简单,耦合度不能太高。
到这里,读者可以先听首歌,比如甚么的钢琴曲,甚么月光曲。休息会继续讲。
1.3 == 与 equals 不是亲家
有人看到这个会大吃1惊,然后质问说“老师说,String 和 == 没关系,你是否是瞎扯淡”。哈哈,我只能说,只不过修行在实际。举个小栗子吧。
看下面清单1.2
看到这里,你是不是觉得这么简单,心里想着肯定是“false,泥瓦匠真逗。”运行下,结果却是
结论: 关于 == ,我们要知道 == 用于匹配内存单元的内容。Java中对照的就是两个内存单元的内容(其实就是1串数字)。至于8个基本类型直接比较值。例如清单1.2,比较的是两个援用,两个援用对照的是援用的对象的逻辑值(也就是两个对象对应内存单元的内容)。
泥瓦匠的记忆宫殿:就是相当于 泥瓦匠和我的亲姐姐比较我们两个的爸爸,毕竟的爸爸都是那1个,固然是true。
"a" + "b"的生命是怎样样的呢?网络牛人有些反编译会发现实际上是类似下面的进程:
究竟JVM是怎样把"a" + "b"和"ab"知道他们是1样的呢。我们回顾下,由于String是不可变类,也就是静态Java语言的特点。这触及到JVM的优化方案。但JVM很死板,它不会很人工智能的像人脑,它会的只是它能处理的,所以好好了解JVM有助于开发更好的额程序。比如定义1个ab字符串常量够了,它不会在再 子串 a b。这就是它的优化方案。
泥瓦匠的记忆宫殿:这就是偷懒思想,今天我要见我爸爸,明天姐姐要见爸爸。合并下呗,后天1起去见爸爸。
就此我们可以得出结论:编译器给我带来它对程序的优化,为了提升程序的效力和内存资源等,所以我们可以明白,如何掌握其特性写出更好的代码。
1.4 也不难 泥瓦匠再出奇招
补充个例子,看看你们真的掌握没?
这触及了JVM的优化,答案是: