Java之String

1,Java中的String位于lang包下,通过阅读源码可知

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** 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实现了三个接口,并且由final修饰,final修饰符保证了此类不会被继承,也就是说不能通过子类改变此欸中的方法或者属性,保证了其安全性

2,查看api文档,可知

  • String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

  • 字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:
 String str = "abc";

  相当于

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

并且通过源码可知,Java中String实质上相当于字符数组,

api中还有一句话 

Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder (或StringBuffer )类及其append方法实现的。

可知通过 '+'号来拼接字符串实质上是通过StringBuilder或者StringBuffer两个字符缓冲数组来拼接,而StringBuilder或StringBuffer两个方法实质上是由一个新创建的字符数组,通过System包下的arraycopy方法将原来字符串的重新拷贝得到的。方法源码如下

* @param      src      the source array.
* @param      srcPos   starting position in the source array.
* @param      dest     the destination array.
* @param      destPos  starting position in the destination data.
* @param      length   the number of array elements to be copied.
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

3,String的一些常用方法

构造方法

String(char[] value) 
分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。 
 
int compareTo(String anotherString)   //按字典顺序比较两个字符串。 

此方法因继承comparable接口得来

源码如下

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

通过字符数组的一个个字符相减来判断是否一致,一旦一个结果不为0则返回相减的结果、

String[] split(String regex) //将此字符串分割为给定的正则表达式的匹配。
String[] split(String regex, int limit)   //将此字符串分割为给定的正则表达式的匹配。例如limit为2,那么数组的长度最长为2
String substring(int beginIndex) 
String substring(int beginIndex, int endIndex) //返回一个字符串,该字符串是此字符串的子字符串。 

4,String, StringBuffer,StringBuilder

 StringBuffer,StringBuilder是一个字符缓冲数组,当然String通过 '+' 来拼接字符串,也是通过 StringBuffer或者StringBuilder

通过查看StringBuffer源码得知

/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}

进入父类构造
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

无参构造创建了一个容量为16的字符数组

查看其append方法源码,加了synchronized关键字,所以线程安全,用在多线程环境中,而

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

而StringBuilder的append方法没有synchronized关键字所以线程不安全,用在单线程环境中,当然,相比较,StringBuilder比StringBuffer更高,应为没有锁

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
原文地址:https://www.cnblogs.com/hunt1coder/p/12775766.html