String源码分析

来源:互联网 发布:电脑视频剪辑软件推荐 编辑:程序博客网 时间:2024/04/30 19:03


1、String的值实际上是有字符数组维护的 从String的源码可以看到该类有一个属性 private final char value[];
2、两个字符的比较 String实现了Serializable, Comparable<String>, CharSequence接口。字符串比较方法如下
    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;
    }
 字符'9'的值为57 字符'A'为65 'a'为97 所有a > A
3、String构造函数
String()、
String(String original)、
String(char value[])、
String(char value[], int offset, int count) 当offset < 0 或者count < 0 或者offset > value.length - count时会抛出异常StringIndexOutOfBoundsException,所以
 char[] cc ={'1','2','3','4','5','6','7','8','9'};
  String s1 = new String(cc,8,2);会抛出异常。
String(byte bytes[])
String(StringBuffer buffer)线程安全的
String(StringBuilder builder)
4、String常用方法isEmpty()该方法返回value.length == 0
charAt(int index)返回index位置的字符,index不合法会抛StringIndexOutOfBoundsException(index)异常

getBytes()返回字符串的字节数组 s1.getBytes("utf8") 把String转换成bytes,各种编码转换成的bytes不同,比如UTF-8每个汉字转成3bytes,而GBK转成2bytes,所以要说明编码方式,否则用缺省编码。
5、String的equals方法与==举例如下
  String s1 = "hello";
  String s2 = "hel" + "lo";
  String s3 = new String("hello");
  System.out.println(s1==s2);//true
  System.out.println(s1==s3);//false
  System.out.println(s1.equals(s2));//true
  System.out.println(s1.equals(s3));//true
  
6、返回字符第一次出现的位置indexOf(int ch)
7、获取子串substring(int beginIndex, int endIndex)
8、字符串连接concat(String str)
9、字符替换replace(char oldChar, char newChar)  System.out.println("hello".replace('l', 'c')); //hecco
Java中replace()、replaceFirst()和replaceAll()区别
str.replace(str中被替换的,替换后的字符)
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是:
  1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);
  2)replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号;
  相同点是都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用 replaceFirst(),
    这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串;
  另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的
10、字符分割  String s1 = "h,e,l.l.o";
  String[] s = s1.split(",");//[h, e, l.l.o]
  String[] ss = s1.split(".");//[]
  1
  
11 StringBuilder与 StringBuffer的区别是,StringBuffer是线程安全的,StringBuilder是线程不安全的,所以StringBuilder速度快,两张都有reverse方法
12 hashCode(),若s1.equal(s2);则s1.hashCode() == s2.hashCode();//true
Boolean bool = new Boolean("true");


0 0
原创粉丝点击