Java字符序列CharSequence接口学习记录

一、基本认识

CharSequence是java.lang包下的一个接口,此接口对应不同的实现类,如CharBuffer、String、StringBuffer、StringBuilder

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CharSequence接口的源码

package java.lang;

import java.util.NoSuchElementException;
import java.util.PrimitiveIterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.IntConsumer;
import java.util.stream.IntStream;
import java.util.stream.StreamSupport;

public interface CharSequence {

    int length();

    char charAt(int index);

    CharSequence subSequence(int start, int end);

    public String toString();

    public default IntStream chars() {
        class CharIterator implements PrimitiveIterator.OfInt {
            int cur = 0;

            public boolean hasNext() {
                return cur < length();
            }

            public int nextInt() {
                if (hasNext()) {
                    return charAt(cur++);
                } else {
                    throw new NoSuchElementException();
                }
            }

            @Override
            public void forEachRemaining(IntConsumer block) {
                for (; cur < length(); cur++) {
                    block.accept(charAt(cur));
                }
            }
        }

        return StreamSupport.intStream(() ->
                Spliterators.spliterator(
                        new CharIterator(),
                        length(),
                        Spliterator.ORDERED),
                Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED,
                false);
    }

    public default IntStream codePoints() {
        class CodePointIterator implements PrimitiveIterator.OfInt {
            int cur = 0;

            @Override
            public void forEachRemaining(IntConsumer block) {
                final int length = length();
                int i = cur;
                try {
                    while (i < length) {
                        char c1 = charAt(i++);
                        if (!Character.isHighSurrogate(c1) || i >= length) {
                            block.accept(c1);
                        } else {
                            char c2 = charAt(i);
                            if (Character.isLowSurrogate(c2)) {
                                i++;
                                block.accept(Character.toCodePoint(c1, c2));
                            } else {
                                block.accept(c1);
                            }
                        }
                    }
                } finally {
                    cur = i;
                }
            }

            public boolean hasNext() {
                return cur < length();
            }

            public int nextInt() {
                final int length = length();

                if (cur >= length) {
                    throw new NoSuchElementException();
                }
                char c1 = charAt(cur++);
                if (Character.isHighSurrogate(c1) && cur < length) {
                    char c2 = charAt(cur);
                    if (Character.isLowSurrogate(c2)) {
                        cur++;
                        return Character.toCodePoint(c1, c2);
                    }
                }
                return c1;
            }
        }

        return StreamSupport.intStream(() ->
                Spliterators.spliteratorUnknownSize(
                        new CodePointIterator(),
                        Spliterator.ORDERED),
                Spliterator.ORDERED,
                false);
    }
}

二、基本注意事项

对于抽象类或者接口来说不可以直接使用new的方式创建对象,但是可以直接给它赋值;
例如:CharSequence b = "test" 是一个类型强转操作 等于CharSequence b = (CharSequence) new String("test")

三、学习和理解

3.1 在线文档

Java在线文档
在这里插入图片描述

3.2 理解注意

a-释义理解

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

b-举例1
在这里插入图片描述
b-举例2
在这里插入图片描述

参考文章:

主要String第一讲_char的可读序列

Java字符序列类CharSequence基本详解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java字符串操作大全,适合初学者,浅显易懂 部JAVA字符串操作 2008-07-11 15:39:42| 分类: JAVA | 标签: |字号大中小 订阅 . JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为10,表示10进制,16表示16进制啦 int i = Integer.parseInt(a, 16); 1、length() 字符串的长度   例:char chars[]={'a','b'.'c'};     String s=new String(chars);     int len=s.length(); 2、charAt() 截取一个字符   例:char ch;     ch="abc".charAt(1); 返回'b' 3、getChars() 截取多个字符   void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)   sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。   例:String s="this is a demo of the getChars method.";     char buf[]=new char[20];     s.getChars(10,14,buf,0); 4、getBytes()   替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。 5、toCharArray() 6、equals()和equalsIgnoreCase() 比较两个字符串 7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。   boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)   boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars) 8、startsWith()和endsWith()   startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束 9、equals()和==   equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。   例:String s1="Hello";     String s2=new String(s1);     s1.eauals(s2); //true     s1==s2;//false 10、compareTo()和compareToIgnoreCase() 比较字符串 11、indexOf()和lastIndexOf()   indexOf() 查找字符或者子串第一次出现的地方。   lastIndexOf() 查找字符或者子串是后一次出现的地方。 12、substring()   它有两种形式,第一种是:String substring(int startIndex)          第二种是:String substring(int startIndex,int endIndex) 13、concat() 连接两个字符串 14 、replace() 替换   它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:   String replace(char original,char replacement)   例如:String s="Hello".replace('l','w');   第二种形式是用一个字符序列替换另一个字符序列,形式如下:   String replace(CharSequence original,CharSequence replacement) 15、trim() 去掉起始和结尾的空格 16、valueOf() 转换为字符串 17、toLowerCase() 转换为小写 18、toUpperCase() 转换为大写 19、StringBuffe

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值