String是如何实现的?有哪些重要方法?

String是如何实现的?

以JDK8为准,String内部存储结构为char数组

常用方法

  • String的构造方法有哪些?
    • char value[]
    • String str
    • StringBuilder bulder
    • StringBuffer buffer
  • equals():比较字符串相等
    • 使用instanceof判断是否为String
    • 循环逐个字符的比较
    • 类似的有:equalsIgnoreCase忽略大小写比较字符串相等
  • compareTo():比较字符串大小
    • 循环对比所有字符
    • 当遇到两个字符不相同时,return char1-char2
    • 类似的有compareToIgnoreCase忽略大小写比较字符串大小
    • equals和compareTo比较
      • equals只能比较是否相等,compareTo可以比较大、小、相等
      • equals参数可以是Object,compareTo只能是String
      • equals返回值Boolean,compareTo返回值int
  • indexOf():查询字符串首次出现的下标位置
  • lastIndexOf():查询字符串最后出现的下标位置
  • contains():查询字符串中是否包含另一个字符串
  • toLowerCase():把字符串全部转换成小写
  • toUpperCase():把字符串全部转换成大写
  • length():查询字符串长度
  • tirm():去掉字符串首位空格
  • replace()替换字符串中某些字符
  • split():字符串按符号分割返回数组
  • join():把字符串数组转为字符串
  • toCharArray():把字符串转为char数组
  • substring(a,b):返回字符串下标[a,b)的字符

扩展

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

  • 安全:使用过程中避免了被修改
  • 高效:常量池缓存字符串

equals和‘==’的区别是什么?

  • Object中的equals就是由‘==’实现的,String类重写了equals方法
  • String中‘==’表示地址相同,equals表示字符相同
   public static void main(String[] args) {
        String a = new String("123");
        String b = new String("123");
        System.out.println(a == b);
        System.out.println(a.endsWith(b));
    }

String 和 StringBuilder、StringBuffer 有什么区别?

  • String是不可变类,StringBuffer和StringBuilder是可变类
  • StringBuilder线程不安全,StringBuffer线程安全

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

将堆中的变量加入到常量池

String类型在JVM中如何存储的?编译器做过哪些优化?

创建String对象的方式有两种

  1. String s1 = "Java";
    s1首先在常量池查找字符串“Java”,如果存在,引用指向常量,如果不存在,在常量池中创建字符串常量,再将引用指向常量

  2. String s2 = new String("Java");
    s2直接在上创建一个变量,调用intern会将字符串存储到常量池

编译器优化

String s1 = "Ja" + "va";
String s2 = "Java";
System.out.println(s1 == s2);

显示结果为true
“Ja” + "va"直接被优化编译成了“Java”


更多Java面试复习笔记和总结可访问我的面试复习专栏《Java面试复习笔记》,或者访问我另一篇博客《Java面试核心知识点汇总》查看目录和直达链接