实现接口。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
- java.io.Serializable
这个序列化接口没有任何方法和域,仅用于标识序列化的语意。
- Comparable]
这个接口只有一个compareTo(T 0)接口,用于对两个实例化对象比较大小。
- CharSequence
这个接口是一个只读的字符序列。包括length(), charAt(int index), subSequence(int start, int end)这几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了改接口。
主要成员
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
String是一个不可变的类 value存储字符串,所以string字符串声明后值属性是不可变的; hash作用:因为String经常被用于比较,保存一个hashcode的缓存可达到复用的效果,避免重新计算哈希码。这个hash值是根据value换算出来的
equals()和==区别
equals()
比较两个字符串的unicode序列是否相等
相等返回0,小于返回负值,大于返回正值
==
比较两个字符串地址是否相同
字符串拼接
String ss="sss"+"yyy"+"xxx";
StringBuilder str = new StringBuilder("sss");
str.append("yyy");
String =str.toString();
StringBuilder str = new StringBuilder(x);
str.append("xxx");
String ss=str.toString();
String类被设计成不可变的原因
####线程安全
可以被多个线程共享
效率优化
字符串不变型保证Hash码的唯一性
比如在HashMap中的使用,不必重新计算新的哈希码
安全性
String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等,如果string可修改会引起各种隐患
字符串常量池的需要
如果字符串值已经存在常量池,那么就不会创建新的对象,而是引用已经存在的对象
确保一个字符串常量只有一个拷贝。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
new String
不是常量,不会放常量池,有自己的地址空间