private final char value[]; // 字符串实际存储在这个Char数组中
private int hash; // 字符串对应的hashCode值
private static final long serialVersionUID = -6849794470754667710L; // Java序列化机制用于验证是否同一版本的对象或是否为同一对象
private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; //JAVA序列化机制涉及
string(){this.value = "".value}; // value是char[], 初始化一个空字符串,不为null
string(String original); // 传入一个字符串初始化,并且计算出hashCode值存入hash变量中
string(char[] value); // 传入一个字符数组初始化
string(char value[], int offset, int count) // 初始化string的时候可以直接截取需要的char[]数组, 从offset下标开始,包括下标值一共有count个字符
string(int value[], int offset, int count) // 与上条方法功能一致 支持int数组
string(byte[],params...) // byte是网络传输序列化的一种形式, 暂不关注
string(StringBuffer sb) // 传入一个StringBuffer进行初始化
public int length() {return value.length;} // 返回字符串长度
public boolean isEmpty() {return value.length == 0;} // 当前字符串是否为空字符串
public char charAt(int index) // 获取字符串第 i 个char
public int codePointAt(int index) // 获取ascll编码码,十进制
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) // 将字符串从srcBigin至srcEnd下标的字符存放在dst[]中, 并且从dstBegin下标开始储存
public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) // 与上同理
public boolean equals(Object anObject) // 先比较是否同一对象,然后判断是否instanceof String, 然后判断字符长度,最后判断String中char数组是否一一对应
public boolean contentEquals(StringBuffer sb) // 比较对象是否一致, contentEquals只要求另一个对象是CharSequence或其子类的对象
public boolean equalsIgnoreCase(String anotherString) // 比较方法, 忽略大小写 .实现方法中实际都转为大写比较,调用的char的包装类Character
public int compareTo(String anotherString) // 比较两个字符串的Unicode差值
public boolean startsWith(String prefix, int toffset) // 用于检测字符串是否以指定的前缀开始
public boolean endsWith(String suffix) // 用于检测字符串是否以指定的前缀结束
public int hashCode() // 获取hashcode
public int indexOf(String str, int fromIndex) // 返回指定str在实例中第一次出现的下标,共6个方法,参数不同, fromIndex是从哪个字符进行查找,从1起
public int lastIndexOf(String str, int fromIndex) // 返回最后出现的下标, 与上述方法同理
public String substring(int beginIndex, int endIndex) // 按照给定位置数截取字符串, 去头去尾, 从1开始
public CharSequence subSequence(int beginIndex, int endIndex) // 内部实际调用了substring,只是返回值变为CharSequence类型
public String concat(String str) // 等同于 +号拼接字符串,效率略有提升,但是作用不大
public String replace(char oldChar, char newChar) // 将制定字符、实现CharSequence接口的类替换为新字符或实现CS接口的类
public String replaceFirst(String regex, String replacement) // 只替换第一次出现的字符
public String replaceAll(param...) // 按正则表达式进行替换
public boolean matches(String regex) // 是否匹配正则表达式
public String[] split(String regex, int limit) // 切割字符串, 第二个参数制定返回数组的元素个数,基本不用,第一个参数可以是正则表达式
1. 判断字段是否为空, 可以用isEmpty, 比equals快
2. instanceof关键字, 判断对象是否是指定类的一个事例
3. String 继承于CharSequence,也就是说String也是CharSequence类型。StringBuffer和StringBuilder也是, CharSequence 是 char 值的一个可读序列
4. String 不可变性( immutable object ),String一旦创建则不可改变,这样设计的好处有以下几点
a.Stringpool字符串池, 当创建一个string时,如果pool里存在, 则无需重新创建, 因为不可变性,所以才使字符串池方案可行
这样可以节省空间,属于一种优化设计
b. String如果是可变的, 可能会造成一些安全性问题, 比如账号密码等.所以String线程是安全的.
c. hashCode的使用频率较高,如果string不可变, 则hashcode也不可变, 不用每次都计算hashcode值
d. 类加载器需要用到string, 如果可变则会造成致命错误.
e. 由于String是不可变的, 所以hashCode在String创建的时候已经缓存, 所以在Map等容器中,很适合做Key,因为hashCode是不变的
5. synchronized修饰符保证了数据同步,用来修饰方法后可以锁定此方法,保证还有一个线程可以访问此方法,保证了多线程情况下数据的准确性。
6. Java序列化,将数据转化为字节,主要分为序列化与反序列化, 主要用于网络传输,或将数据从内存中写入磁盘中等操作
7. 一个类只有实现了Serializable接口,它的对象才能被序列化.
8. 字符串拼接效率问题:
a. 效率对比 StringBuffer.append > String.concat > + ;
b. StringBuffer 与 String 不属于同一类, String是不可变的(final char value[]), StringBuffer是可变的(char value[]), 所以在字符串拼接时String会消耗更多资源
c. String拼接产生的对象需要被CG垃圾回收器回收, 但这不是瞬间完成的, 所以会对服务器造成负担.
9.split方法拼接字符串可能出现意想不到的结果, 比如"/"需要转义为"///",否则结果会报错