Java 源代码阅读 CharSequence String C

2017-07-14  本文已影响81人  小程有话说

开始阅读Java源代码,代码是最好的老师。

String

image.png
String是Java语言中很重要的一个类。

字符串,Java程序中类似“abc”字符串对象都是该类实例;String是常量,不可变,因此可以被多线程共享。

# 新建String对象
String str = "abc"; 
<-->
String str = new String({'a', 'b', 'c'});

String类中方法包含检查、比较、查找字符串等各种操作;类型转换通过java.lang.Character实现;Java语言给String提供了很多支持,字符串拼接使用StringBuilder和StringBuffer;String编码格式是UTF-16,更多编码集查看Charset。

Serializable

一个类如果要序列化、反序列化需要实现Serializable接口,但是奇怪的是这个接口并没有任何抽象方法。
为什么需要实现该接口呢,因为在序列化对象时ObjectOutputStream类中writeObject0方法中会对需要进行序列化对象做检测。

            // remaining cases
            if (obj instanceof String) {
                writeString((String) obj, unshared);
            } else if (cl.isArray()) {
                writeArray(obj, desc, unshared);
            } else if (obj instanceof Enum) {
                writeEnum((Enum<?>) obj, desc, unshared);
            } else if (obj instanceof Serializable) { // 所以如果对象没有实现Serializable接口那么序列化直接报错
                writeOrdinaryObject(obj, desc, unshared);
            } else {
                if (extendedDebugInfo) {
                    throw new NotSerializableException(
                        cl.getName() + "\n" + debugInfoStack.toString());
                } else {
                    throw new NotSerializableException(cl.getName());
                }
            }

Comparable

对实现它的类提供了排序方法。
由实现该接口的类的集合或列表可以使用Collections.sort()或Arrays.sort()排序,实现该接口的类可以作为SortedMap、SortedSet的key;compareTo方法和equals是不同的。

Charset

        Charset utf8 = Charset.forName("UTF-8"); // 使用该方法得到编码集

Charset提供了16位Unicode编码与其他编码的对应关系;我们都知道文件在硬盘中是以UTF-8、GBK、Big5之类的编码格式来存储的,但是Java代码在内存中是以Unicode16来存储的,所以需要建立两者之间的对应关系,这就是Charset的由来。

        ByteBuffer encode = utf8.encode("a");
        CharBuffer decode = utf8.decode(null);

Charset提供的最常用的方法,encode编码后可以存储在文件中;decode解码之后可以供Java代码直接使用。
在Charset之下,Java提供了各个编码集具体实现。


image.png

当我们需要指定编码集时只需要Charset.forName('xxx')然后转换为Unicode编码形式即可。

CharSequence

字符序列,这个接口很简单,只有几个方法;

    int length(); // 返回字符串长度(每个字符16位)
    char charAt(int index); // 返回指定位置字符(位置0 ~ length()-1)
    CharSequence subSequence(int start, int end); // end 不能大于length() 返回原字符串的子字符串(起始位置start, 结束位置end)
    public String toString(); // 返回String对象
上一篇下一篇

猜你喜欢

热点阅读