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”