字符串是一个非常重要的类型。而且字符串是不同语言和平台之间交互之间比较好的方式。

  1. String类。
  2. 所属的在java.lang包下。不用导入。
  3. 找寻构造方法创建对象。
    1. String s1 = “abc”; // 可以视为常量形式,但是确是对象。在字符串常量池中。
    2. String s2 = new String(“123”); // 带String参数的构造方法。
    3. String s3 = new String(byte []);// 将数组中每一个byte类型数字转化为char,再把一个一个char组合成数组。
    4. String s4 = new String(char []); // 同理跟byte类似。
  4. String是一个非常特殊的引用类型,可以像基本类型一样去创建赋值。
  5. 没有任何继承关系,实现了三个接口:Serializable, Comparable[String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html), CharSequence

    String类中的特性

    第一档笔试题:

    1. String s1 = "abc";
    2. String s2 = "abc";
    3. String s3 = new String("abc");
    4. String s4 = new String("abc");
    5. System.out.println(s1 == s2); // true
    6. System.out.println(s1 == s3); // false
    7. System.out.println(s1.equals(s2)); // true
    8. System.out.println(s1.equals(s3)); // true
    9. System.out.println(s3.equals(s4)); // true

    上面的答案进行解释。equals重写了,并且如果不是同一个String类的话,比较的是每一个字符的值是否相等。
    image.png
    String的不可变特性:
    String类中包含一个数组。private final char value[]; 用来存储String中的每一个字符。因为final表示不可变,数组的地址不让改变。数组的长度是本身不可变的。private只有在当前类中才能访问(可以通过反射技术),这个数组中的内容页也不能改变了,因为根本改变不了了。体现在长度及内容。

Stirng对象的存储:”abc”-》常量池中的一个对象。
new String(“abc”);堆内存中的一个对象。

String类中的常用方法

  • boolean = equals(Object anObject); Object重写,比较两个字符串的字面值是否相等。
  • equalsIgnoreCase(); 忽略大小写比较。
  • int = hashCode(); 重写了hashCode的方法,一般重写equals,会伴随着重写hashCode
  • int = compareTo(String str;实现自Comparable接口。用来按照字典(Unicode编码的顺序)索引的顺序比较。下面是compareTo的源码。按照两个字符串较短的那个作为循环的次数。一直比,发现有不相等的,就相减chart的值。(调用compareTo的减参数里面的)如果一直相当,那么就长度相减。等于0,表示两个字符相等。长度相等,每一个也相等。compareTo一般跟字符排版相关的。

    1. public int compareTo(String anotherString) {
    2. int len1 = value.length;
    3. int len2 = anotherString.value.length;
    4. int lim = Math.min(len1, len2);
    5. char v1[] = value;
    6. char v2[] = anotherString.value;
    7. int k = 0;
    8. while (k < lim) {
    9. char c1 = v1[k];
    10. char c2 = v2[k];
    11. if (c1 != c2) {
    12. return c1 - c2;
    13. }
    14. k++;
    15. }
    16. return len1 - len2;
    17. }
  • String = toString();继承自Object重写,不再输出地址包名.类名@xxx,而是输出字符串的值。

  • char = chartAt(int index); 返回index对应位置的那个chart值。
  • int = codePointAt(int index); 返回index对应位置的那个chart对应的code码。
  • int = length(); 返回字符串的长度的。就是底层vlaue数组的长度。
  • String = concat(String str); 拼接字符串,返回一个新的字符串。体现了String的不可变特性。源码就是创建新的数组,用来放原来的和新增的。以下是源码。

    • 加号也可以进行拼接。和concat的区别。这个过程中产生了几个String对象。
      • String str4 = “a” + “b” + ‘c’ + “d”;
      • 答案:字符常量池中7个。a,b,c,d各一个,ab,一个,abc一个,abcd一个。不停的进行拼接,产生新的对象。
      • concat和拼接谁的性能好呢?concat 不会产生新的对象,只会产生新的数组,一个String对象,自己的value属性在频繁的创建新的小数组。拼接会频繁的创建新的对象,会很慢。
      • 答案:concat属性好。
        1. public String concat(String str) {
        2. int otherLen = str.length();
        3. if (otherLen == 0) {
        4. return this;
        5. }
        6. int len = value.length;
        7. char buf[] = Arrays.copyOf(value, len + otherLen);
        8. str.getChars(buf, len);
        9. return new String(buf, true);
        10. }
  • StringBuffer/StringBuilder()方法,拼接效率非常高,像以前自己封装的ArrayBox。

  • Boolean = contains(CharSequence s); 用来判断给定的s是否在字符串中存在。
  • Boolean = startsWith(String prefix); 判断此字符串是否以什么什么开头。
  • Boolean = endsWith(String suffix); 判断此字符串是否以什么什么结尾。
  • byte[] = getBytes(); 将字符串转化成数组的。返回值是byte[]。getBytes(String charsetName);按照什么类型拆分。
  • char[] = toCharArray(); 将字符串转化成char数组。
  • int index = indexOf(String s,index fromIndex?); 找寻给定的元素第一次在字符串中出现的索引。fromIndex表示从那开始找。返回的索引都是从头开始数的。找不到的话,返回值是-1。第一个参数还可以是char字符对应的code码。但是String可以找多个char字符对应的字符串。code每次只能填一个。所以,有四个方法重载。上面的进行排列组合就行了。
  • lastIndexOf();找寻给定的元素最后一次在字符串中出现的索引。参数类似于上面的indexOf。若不存在返回-1。重载更上面一样。
  • boolean = isEmpty();判断当前字符串是否为空。length是否为0。注意与null之间的区别。
  • replace();
  • replaceAll();
  • replaceFirst();
    • 将给定的字符串替换为另外的字符串。
    • replace和replaceAll差不多。all语义化更好一点
    • First可只替换第一个。
  • String[] = split(String reges[,int limit]); regular(有规律的) expression(表达式)
    • 按照给定的表达式将原来的字符串拆分的。
  • String = substring(int beginIndex[,int endIndex]);将当前字符串截取一部分。只有一个参数,默认到末尾。都是左开右闭。给定的参数必须要是有效的数字。
  • 对字符串本身进行了改变之后,无论是截取,拆分,拼接。都是返回新的东西,因为String的不可变特性。
  • String = toUpperCase(); 将全部字符串转为大写
  • String = toLowerCase(); 转小写。
  • trim();去掉字符串前后多余的空格的。