快速到达看这里-->
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对象的方式有两种
-
String s1 = "Java";
s1首先在常量池查找字符串“Java”,如果存在,引用指向常量,如果不存在,在常量池中创建字符串常量,再将引用指向常量 -
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面试核心知识点汇总》查看目录和直达链接