1. 多构造方法
  • String 为参数的构造方法

  • char[] 为参数的构造方法

  • StringBuffer 为参数的构造方法

  • StringBuilder 为参数的构造方法


2. 方法

  • equals()

    • 重写了equals(), 先判断是否为String类型, 再逐位比较


  • compareTo()

    equals() 与 compareTo()

     - 不同点
      - equals()可以接受一个Object类型的参数, 而compareTo()只能接收一个String类型的参数
      - equals()返回值为Boolean, compareTo()返回值为int
     - 相同点
      - 都可以用于两个字符串的比较
      - 当equals()方法返回true时, 或者是compareTo()方法返回0时, 则表示两个字符串完全相同


    • 循环对比所有的字符, 当两个字符串中有任意一个字符不相同时, 则 return char1 - char2


  • 其他常用方法

    • indexOf():  查询字符串首次出现的下标位置

    • lastIndexOf():  查询字符串最后出现的下标位置

    • contains():  查询字符串中是否包含另一个字符串

    • toLowerCase():  把字符串全部转换成小写

    • toUpperCase():  把字符串全部转换成大写

    • length():  查询字符串的长度

    • trim():  去掉字符串首位空格

    • replace():  替换字符串中的某些字符

    • split():  把字符串分割并返回字符串数组

    • join():  把字符串数组转为字符串


3. 问题延伸

  • 为什么String类型要用final修饰?

     高效
     - final 修饰的类不可变, 能够缓存结果, 当你在传参时不需要考虑谁会修改它的值
     - 如果是可变类的话, 则可能需要重新拷贝出一个新的值类传参, 这样在性能上就会有一定的损失
     
     安全
     - String 类设计成不可变的另一个原因是安全, 防止因一些系统校验造成值发生变化导致结果不一致甚至是引起系统崩溃


  • == 和 equals 的区别是什么?

     == 对于基本类型来说比较的是两者的值, 对于引用类型来说比较的是两者的引用地址


  • String 和 StringBuilder, StringBuffer有什么区别?

     因为String类型是不可变的, 所以在字符串拼接的时候性能会很低, 因此需要使用另一个数据类型 StringBuffer 来进行append() 或 insert() 拼接
     
     StringBuffer 使用 synchronized 来保证线程安全
     
     JDK1.5 以后新增StringBuilder
     相比StringBuffer 它减少了 synchronized 修饰, 在性能上会优于 StringBuffer, 因此在非并发的操作上可以选用该类来进行拼接操作


  • String 的 intern() 方法有什么含义?

     String s1 = new String("Java"); // 在堆上创建一个变量
     String s2 = s1.intern(); // 调用 intern() 方法, 将此字符串保存在常量池中
     String s3 = "Java";
     System.out.println(s1 == s2); // false
     System.out.println(s2 == s3); // true
     


  • String 类型在 JVM (Java虚拟机) 中是如何存储的? 编译器对 String 做了哪些优化?

     // JDK1.7之后把永生代换成了元空间, 把字符串常量池从方法区移到了Java堆上
     
     // JVM对字符串的拼接进行了优化, 例:
     String s1 = "Ja" + "va";
     String s2 = "Java";
     System.out.println(s1 == s2); // true