String源码解析总结

  

String类

    属性:

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方法拼接字符串可能出现意想不到的结果, 比如"/"需要转义为"///",否则结果会报错

 

  

你可能感兴趣的:(JAVA基础)