开始阅读Java源代码,代码是最好的老师。
String
image.pngString是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对象
网友评论