目录
(4)将字符串中的内容转为字符数组(String->char[])
一、JDK中String类的声明
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
String实现了多个接口,就具备了多种能力。
为什么String要用final修饰?
可以知道的是被final修饰的类无法被继承,所以String就不存在子类,这样的话就可以保证所有使用JDK的人,大家所用到的String类仅此一个。
二、创建字符串的四种方式
String str1="hello world";
String str2=new String("hello world");
char[] arr={'a','b','c'};
String str3=new String(arr);
String str4=String.valueOf(10);
1、直接赋值
String str=''hello world'';
2、通过String的构造方法产生对象
String str2=new String(''hello world'');
3、通过字符数组产生对象
char[] arr=new char[]{'a','b','c'};
4、通过String的静态方法valueOf(任意类型)
String str=String.valueOf(10);
三、String引用数据类型
1、字面量和字符串对象
String str=''hello world'';等号后面这一部分既是字面量,也是字符串对象。
2、字符串的比较
所有引用数据类型在比较时,等号hi用equals方法比较,JDK的常用类都已经重写了equals方法,大家直接使用即可。引用数据类型使用“==”比较的是地址是否相等。
注意,当牵扯到用户输入时,一定要做判空处理
如果使用第一种比较方法就会出现空指针异常,因为我们要比较的特定内容本身就是字符串字面量,一定不是空对象,把要比较的内容放在equals的前面,就可以方便处理name为空的问题。
3、关于字符串的常量池问题
可以发现,此第一个图中的str1,str2和str3使用“==”比较都返回了true,但是在第二个图中的又都返回了false,这是怎么回事呢?
当使用直接赋值法创建字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中还不存在,则产生一个新的字符串对象加入常量池中。当继续使用直接赋值法产生字符串对象时,JVM发现该引用指向的内容在常量池中存在了,则此时就不在新建字符串对象,而是复用已有的字符串对象。
4、手工入池
public native String intern();
String类提供的intern方法:
调用intern方法会将当前字符串引用指向的对象保存到字符串常量池中
①若当前常量池中已经存在了该对象,则不在产生新的对象,返回常量池中的String对象
②若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址