Java类库复习——java.lang.String
? ? 今年终于重新回到开发岗位继续我的程序员生涯,但时隔一年半,很多都有些生疏了,仔细读了一遍<Thinking In Java>,发现很多基本技术和思想其实从一开始就没研究明白。决定重新对照着书本,jdk和源码把Java中基本的类库研读总结下。
? ? 第一篇就先从最简单最基本的String开始吧!
? ? 博客的对代码的排版似乎不好,附件里附上txt格式的内容,可读性会好些。
?
1.String的基本特性
? ? 我们在class中找到java.lang.String,先来看String的基本特性。
?
? ? String类的定义是这样的:public final class String implements java.io.Serializable, Comparable<String>, CharSequence
? ? 从以上定义,我们可以看出String的几个基本特性:
? ? ·String是一个类。(似乎是废话。主要与其他基本类型分开,Java中的类型似乎只有String与Enum是类形式定义的。)
? ? ·String是只读的常量,具有不可变性;不可被继承。(修饰为final)
? ? ·String类型是可序列化的,可比较的字符序列。(implements java.io.Serializable, Comparable<String>, CharSequence)
? ? 再来看一下Sting类中的定义的几个基本field
? ? private final char value[];//String的值,String的本质就是char型数组
? ? private final int offset;//子数组第一个字符的索引
? ? private final int count;//字符串中的字符数量
? ? private int hash; //对象的hash code
? ? 经过上面的分析,其实我们已经能看出String对象的本质是一个经过封装的char型数组,封装后提供了一些方便操作的方法。
?
? ??
2.Sting常用方法及实现(大部分注释选自JavaSE5中文API说明)
? ? 2.1.equals(Object anObject)
?
?
public static String valueOf(float f) {return Float.toString(f);}?3.String的几点使用须知? ??? ? 3.1.String的不变性。String对象是不可变的,只读的,任何对他的引用都无法改变他的值。我们从上面看的几个String内置方法的实现也可以看出,任何需要改变字符串内容的方法,实际在实现时都是创建了新的String对象作为返回值,而不是改变原有的String对象。(比如substring,trim)? ? 3.2.String和StringBuilder(StringBuffer)的区别。这是个老生常谈的问题了,在频繁调用的循环中,StringBuilder无疑是有优势的(tips:如果能预先估算字符串的上限,那么预先为StringBuilder分配空间大小是提高效率的好办法),但是正常的简单拼接中,使用String的"+"和"+="真的没有想象的那么“效率低下”,因为编译器会自动调用StringBuilder来帮你实现。如果只是String newString = oldString + "test"这样的语句的话,那么真的没有必要使用StringBuilder实现,在大多数情况下,让“人”舒服比让“机器”舒服更为重要。? ? 3.3.String的对象引用机制。每个字符串都会在内存中分配地址,String对象实际上是对内存中字符串的引用。比如我们现在有个String a = "a";那么当我们创建一个新的String对象String b = new String("a");时,并没有在内存中分配新的空间来再存储"a",而是将b的引用也指向了原来"a"在内存中的位置。同样的,当没有对象引用指向"a"时,垃圾回收器会对他进行接管。