最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • [Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)


    作者:泥沙砖瓦浆木匠
    网站: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 abc = "abc";
    char data[] = {'a','b','c'};
    String abcStr = new String(data);
    System.out.println("abc");
    String cde = "cde";
    System.out.println("abc" + cde);
    String c = "abc".substring(2,3);
    String d = cde.substring(1, 2);
    System.out.println(c);
    System.out.println(d);

            泥瓦匠,你不是在忽悠我吗?这么简单的程序,你想说甚么。说实在确切是基础,但基础扎实才能有更高的突破。就想泥瓦匠默默为自己,为家人为未来打基础。

           可以见,String是不需要用new来创建1个新对象的类。它是不可变的(Constant),其值(像"abc"创建后,不可改变)。自然,String其实实现了基本类型char的序列的功能,因此中文名“字符串”。这里大家有可能疑惑,泥瓦匠就找到JDK源码证据给你们看:

    wpsDD6A.tmp

            这段代码是来自JDK1.7源码里面的,char型value数组的情势组成了String类的内容。其操作就是针对value数组操作。这样想是不是豁然开朗,然后心里自喜“so easy”。其实难点下面,大家渐渐看下去。

     

    1.3 String字符串操作

            照旧看代码清单1.1,Java提供了1个特殊的连接操作符(concatenation operator)+ 用于直接来拼接字符串。其中操作经常使用的方法罗列以下:

    方法 作用
    s.length() 返回s字符串长度

    s.charAt(1) 返回s字符串中下标为1的字符

    s.substring(0, 2) 返回s字符串中下标0到2的子字符串

    s.indexOf("nsg") 返回子字符串"nsg"的下标

    s.startsWith(" ") 判断s是不是以空格开始

    s.endsWith("end") 判断s是不是以"end"结束

    随着泥瓦匠运行下清单1.1,你可以看到打印出来:

    abc
    abccde
    c
    d

            很简单的发现答案就是我们心目中想要的。这里我不打算很详细的解释api,这样会失去文章的趣味和读者的兴趣。我喜欢用例子来引导出,对String在我项目和经验中的总结。
    下面就以我们substring()方法来解释下源码,可以看到其中实现的细节:
    wpsDD7A.tmp
    逻辑大致归纳以下:
            1. 首先判断传入值得可靠性,判断传入的开始和结束,还有子字符串的长度。这是在每一个系统开发需要在细节中关心的。关心细节,才能干大事。
            2. 然后判断是否是原String,是的话,直接返回this,如果不是就new1个子串。这个构造函数实现也不难,如果有兴趣可以看看,其实也就是实现char数组的拷贝。 

            就String基础部份泥瓦匠就介绍这里,在这里我们可以得出的结论是:设计源于生活,源于简单。像1个方法和1个类结构的设计,单1简单。所以我们学习以后设计方法要简单,耦合度不能太高。

    到这里,读者可以先听首歌,比如甚么的钢琴曲,甚么月光曲。休息会继续讲。

    1.3  == 与 equals 不是亲家

            有人看到这个会大吃1惊,然后质问说“老师说,String 和 == 没关系,你是否是瞎扯淡”。哈哈,我只能说,只不过修行在实际。举个小栗子吧。
    看下面清单1.2

    static String b = "ab";
    private static void test(){
    String a = "a" + "b";
    System.out.println(a == b);

    }

    看到这里,你是不是觉得这么简单,心里想着肯定是“false,泥瓦匠真逗。”运行下,结果却是

    true

          结论: 关于
    == ,我们要知道 == 用于匹配内存单元的内容。Java中对照的就是两个内存单元的内容(其实就是1串数字)。至于8个基本类型直接比较值。例如清单1.2,比较的是两个援用,两个援用对照的是援用的对象的逻辑值(也就是两个对象对应内存单元的内容)。


    泥瓦匠的记忆宫殿:就是相当于 泥瓦匠和我的亲姐姐比较我们两个的爸爸,毕竟的爸爸都是那1个,固然是true。

    "a" + "b"的生命是怎样样的呢?网络牛人有些反编译会发现实际上是类似下面的进程:

    StringBuilder temp = new StringBuilder();
    temp.append("a").append("b");
    return temp.toString();

            究竟JVM是怎样把"a" + "b"和"ab"知道他们是1样的呢。我们回顾下,由于String是不可变类,也就是静态Java语言的特点。这触及到JVM的优化方案。但JVM很死板,它不会很人工智能的像人脑,它会的只是它能处理的,所以好好了解JVM有助于开发更好的额程序。比如定义1个ab字符串常量够了,它不会在再 子串 a b。这就是它的优化方案。
            泥瓦匠的记忆宫殿:这就是偷懒思想,今天我要见我爸爸,明天姐姐要见爸爸。合并下呗,后天1起去见爸爸。
            就此我们可以得出结论:编译器给我带来它对程序的优化,为了提升程序的效力和内存资源等,所以我们可以明白,如何掌握其特性写出更好的代码。

     

    1.4 也不难 泥瓦匠再出奇招

    补充个例子,看看你们真的掌握没?

    private static String getA(){ return "a";}
    private static void test2(){
    String a = "a";
    String b = a + "b";
    String e = getA() + "b";
    System.out.println(b == "ab");
    System.out.println(e == "ab");
    }

    这触及了JVM的优化,答案是:

    false
    false

    如果猜到了,证明你真懂了。泥瓦匠还是耐心的讲授下:
            第1个false:b是包括了1个常量和1个援用的值,所以。
            第2个false: 你也能够猜到外部方法的常量在本方法只是1个援用。所以。
    结论以下:我们现在如果不知道JVM怎样在编译时期优化,我们就渐渐了解它们。

     

    1.5 equals碰到n长字符串呢?

            这个例子不好写,泥瓦匠就带你们看看源码等。equals其实不陌生,相信大家的系统里面有很多设计到这个方法。

            其实equals是实现了Object的equals方法,而在Object的equals:
    wpsDD7B.tmp
    它其实就是实现了 == 比较内存的内容。
    Q:泥瓦匠,为何String要重写Object,这不致使意义不1致了吗?
    A:非也非也,String是String,String用来处理的事物逻辑和业务和Object完全不同。equals顾名思义等于,等于不表示完全相等。而是1样或相似。正所谓业务看情况,比如泥瓦匠处理得金融数据1般小数点10几位,那请问你还会在意小数点10位后的的值吗,当它们比较的时候,你不会在意,所以这就是相似。

            那末我们就看1下String实现的equals方法:
    wpsDDAB.tmp

            简单描写下,就是遍历两个数组最好的条件下,就是要末长度不同,要末前面几个不同。直接返回false。
    Q:如果碰到大字符串这就悲剧了。所以1些大字符串怎样处理呢。
    A:其实实际中,大字符串也难见。但说处理的话,大字符串匹配可以斟酌分割匹配或是啥的这里就不展开了。

    Q:equals重写 和 hashCode 有关系吗?

    A:这里我们要先说明hashCode方法提供对象的hashCode值,返回与默许的System.identityHashCode()1致。其广泛用于集合框架。到后面我也会讲到。hashCode的源于计算机的比较源于数字,而不是对象。所以1个hashCode值标识1个对象,产生了对象相干的很多算法。但是默许的hashCode犯法会发起对本地的调用开消很大。

    好累好累,泥瓦匠喝口水,讲完下面这个,我们String到此结束。

    1.6 intern妙用

    intern大家就有点陌生了。我们首先得普及下常量池的概念,常量池(constant pool)指的是在编译期被肯定,并被保存在已编译的.class文件中的1些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。然后看看下面的例子:

    private static void test5(){
    String a = "a";
    String b = a + "b";
    String c = "ab";
    String d = new String("ab");
    System.out.println(c == d.intern());
    System.out.println(b.intern() == d.intern());
    }

    当调用 intern()方法时,JVM 会在这个常量池中通过 equals()方法查找是不是存在等值的 String,如果存在,则直接返回常量池中这个 String 对象的地址;没有找到,则会创建等值的字符串,返回其地址。
    思考提升:这有甚么用呢?
    答曰:可以用于1些常量的存储比较,枚举(枚举底层就是字符串,哈哈)。当想常量比常量,多数的情况下,斟酌效力则选择 intern()而不是equals。

    总结

    String是Java基础组件重要的1部份。我渐渐的总结的J2EE Java的组件体系,然后增加内容进去。还是那句话,泥瓦匠想说:

    如以上文章或链接对你有帮助的话,别忘了在文章按钮或到页面右下角点击 “赞1个” 按钮哦。你也能够点击页面右侧“分享”悬浮按钮哦,让更多的人浏览这篇文章

    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » [Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级