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

String是如何实现的?

以JDK8为准,String内部存储结构为char数组,JDK9 之后String的存储就从char数组转成了byte数组(这样做的好处是存储变的更紧凑,占用的内存更少,操作性能更高了.)

常用方法:

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表示字符相同
1    public static void main(String[] args) {
2         String a = new String("123");
3         String b = new String("123");
4         System.out.println(a == b);
5         System.out.println(a.endsWith(b));
6     }

String 和 StringBuilder、StringBuffer 有什么区别?

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

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

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

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

  •  创建String对象的方式有两种
  •     String s1 = "Java";
  •     s1首先在常量池查找字符串“Java”,如果存在,引用指向常量,如果不存在,在常量池中创建字符串常量,再将引用指向常量
  •     String s2 = new String("Java");
  •     s2首先在常量池查找字符串“Java”,如果存在,复制一份引用到堆上,返回堆的引用。如果不存在,在常量池创建一个字符串常量,然后复制一份引用到堆上,然后返回堆的引用。

编译器优化

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

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

原文地址:https://www.cnblogs.com/lkylin/p/12692657.html