带你认识 String 类
String 类在 Java 中是很常用的类,很重要的类,在后续的学习中经常会用到,是后续学习的基础
一、认识 String
1.JDK 中的 String
首先我们看看 JDK 中的 String 类源码,它实现了很多接口,可以看到 String 类被 final 修饰了,这就说明 String 类不可以被继承,String 不存在子类,这样所有使用 JDK 的人,用到的 String 类都是同一个,如果 String 允许被继承,每个人都可以对 String 进行扩展,每个人使用的 String 都不是同一个版本,两个不同的人使用相同的方法,表现出不同的结果,这就导致代码没办法进行开发了
继承和方法覆写在带来灵活性的同时,也会带来很多子类行为不一致的问题
2.创建字符串的四种方式
方式一:直接赋值(常用)
String str = " hello word "
方式二:通过构造方法产生对象
String str1 = new String(" hello word ");
方式三:通过字符数组产生对象
char[] data = new char[]{‘a’ , ‘b’ ,‘c’};
方式四:通过 String 的静态方法 valueOf(任意数据类型) = >转为字符串(常用)
String str2 = String.valueOf(10);
3.字符串的字面量
字面量:直接写出来的数值叫做字面量
10 – > int 字面量
10.1 --> double 字面量
true --> boolean 字面量
" abc " – > String 字面量
字符串的字面量其实就是一个字符串对象
String str = “hello word”;
String str2 = str;
此时这既是一个字符串的字面量,也是字符串的对象,为了方便理解,画个图,此时是为了方便理解我们暂时先认为它储存在堆上,其实实在方法区中存放
若此时让 str2 = “Hello”;此时对 str 的输出并没有影响,因为被" "括起来的 Hello 也是一个字符串对象,说明此时在堆上新开辟了一块空间,而此时 str2 保存的就是新对象的地址空间,对 str 没有影响
4.字符串比较相等
所有的引用数据类型在比较是否相等时,使用 equals 方法比较,JDK 的常用类,都已经覆写了 equals 方法,直接使用即可
引用数据类型使用 == 比较的是地址
下图是两个引用指向了同一块地址空间,和字符串的常量池有关
下图产生了两个对象,两块地址空间,使用==返回的就是 false
equals 的比较大小是区分大小写的比较
equalsIgnoreCase 方法是不区分大小写的比较
二、字符串的常量池
1.什么是字符串常量池
当使用直接赋值法产生字符串对象的时候,JVM 会维护一个字符串的常量池,若该对象在堆中还不存,就产生一个字符串对象加入到字符串常量池中;当继续使用直接赋值法产生字符串对象的时候,JVM 发现该引用指向的内容在常量池中已经存在了,此时就不再新建字符串对象,而是直接复用已有的对象,这也是为什么上图的三个引用指向的是同一块地址
当第一次产生对象的时候,常量池中还什么都没有,就在常量池中产生一个字符串对象存入,当第二第三次产生对象时,JVM 发现常量池中已经存在相同的内容,就不再产生新的对象,直接指向和 str1 相同的地址空间
评论