码迷,mamicode.com
首页 > 其他好文 > 详细

Notes 20180309 : String第一讲_char的可读序列

时间:2018-03-06 17:01:49      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:父类   str1   dex   为什么   程序   也有   图片   获取   技术分享   

  实际上在写本文之前,我曾考虑是先探讨面向对象,还是先选择String和Arrays,最后还是选择了后者,并非是面向对象对我们不重要,相反它是Java的灵魂所在,之所以这样的安排是因为这两个是在是我们程序中最为常见的了,所以放在面向对象前面讲解,开始讲解String之前,我先说一下我对于类的一些探讨路线,我们依据面向接口编程来探讨,首先将相似类的共同方法所在接口进行谈论,然后才是类,本文亦是如此,我们先来讲解char的可读序列_CharSequence,下面开始今天的学习。

可读序列

  我们查看String,发现其实现了CharSequence接口,而在StringBuffer和StringBuilder中也有该接口的实现,这就不得不引起我的注意了,通过API查阅发现对于CharSequence的解释如下【

public interface CharSequence

  CharSequence 是 char 值的一个可读序列。此接口对许多不同种类的 char 序列(这意味着只要是char序列,那么多半就要实现该接口了,从这里我们也就明白了为什么String、StringBuilder、StringBuffer、CharBuffer为什么都实现了该接口,因为这三个底层都是字符数组,即标准的字符序列)提供统一的只读访问。char 值表示 Basic Multilingual Plane (BMP 基本多语言平面) 或代理项中的一个字符。有关详细信息,请参阅 Unicode 字符表示形式,说白了就是char----Unicode----数值。 此接口不修改 equals 和 hashCode 方法的常规协定。因此,通常未定义比较实现 CharSequence 的两个对象的结果。每个对象都可以通过一个不同的类实现,而且不能保证每个类能够测试其实例与其他类的实例的相等性。因此,使用任意 CharSequence 实例作为集合中的元素或映射中的键是不合适的。下图是截取的所有实现CharSequence接口的类,我们在后面一一认识。】

技术分享图片

接口的方法摘要

  返回值       方法

  char          charAt(int index)返回指定索引的char值【该接口是char的字符序列,既然是序列,那么就一定是有长度的,我们自然可以通过索引获取相应位置的字符,所以将该方法提取到接口中是很有必要的,这也是将具有相同属性和行为抽取到一个类中的鲜明实现!】

  int           length()返回次字符序列的长度

    CharSequence  subSequence(int start,intend)返回一个新的CharSequence,它是此序列的子序列。【最初在研究String的时候,并没有研究CharSequence,当时对于该方法很不理解,知道后来研究了该接口,才觉得很聪明的选择,它没用用一个特定的对象来作为返回值,而是一个接口,这样就可以动态返回返回值,通过多态将该字符序列的实现类对象向上转型为接口】

  String        toString()返回一个包含此序列中字符的字符串,该字符串与此序列的顺序相同。【这是重写Object的方法,接口并没有显式继承Object类,实际上也没必要,Object默认是所有类和接口的父类,重写toString()返回以字符串形式表示的字符序列,而不是Object中的hashcode】

小提醒

  在"可读序列"中有这么一句话,读时有所疑惑,所以在这里拿出来再做说明,"此接口不修改 equals 和 hashCode 方法的常规协定。因此,通常未定义比较实现 CharSequence 的两个对象的结果。每个对象都可以通过一个不同的类实现,而且不能保证每个类能够测试其实例与其他类的实例的相等性。因此,使用任意 CharSequence 实例作为集合中的元素或映射中的键是不合适的"。我们在字符序列中使用equals()往往只希望比对字符序列内容,而非是对象引用地址(通过hashcode),但是CharSequence并没有重写equals(),所以如果我们通过多态将CharSequence的实现类对象向上转型为接口,那么此时再使用equals(),如果是同一个类的对象那么比对是通过该类重写的equals(),若不是同一个对象,那么是通过Object的equals方法来比对(通过hashcode),而不是字符序列内容,即便两个实现类重写了equals(),举例如下:

package cn.charsequence;

public class CharSequenceTest {
    public static void main(String[] args) {
        String str1 = new String("AAA");
        String str2 = "AAA";
        System.out.println(str1.equals(str2));
        StringBuffer sb = new StringBuffer("AAA");
        CharSequence cs1 = sb;
        System.out.println(cs1.equals(str2));
    }
}

技术分享图片

  如果以对象作为集合的元素,也会出现这种情况,因为集合中的元素或键是通过equals()来比对的,但是如果是散列表中的键,那么是通过hashcode来比对的,因为散列表中键是不能重复的,如下:

//        list.add("AAA");
        list.add(new String("AAA"));
        list.add(new StringBuffer("AAA"));
        Map<CharSequence, String> map = new HashMap<>();
        map.put("AAA", "String_AAA");
        map.put(new StringBuffer("AAA"), "StringBuffer_AAA");
        System.out.println(list.contains("AAA"));
        System.out.println(map.get("AAA"));
        System.out.println(map.get(new StringBuffer("AAA")));

技术分享图片

Notes 20180309 : String第一讲_char的可读序列

标签:父类   str1   dex   为什么   程序   也有   图片   获取   技术分享   

原文地址:https://www.cnblogs.com/lin-jing/p/8514639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!