不积跬步,无以至千里;不积小流,无以成江海。
Java语言基础
Java的字符串
String类包装的是一个数组:
JDK1.8及以前的 String 保存的是字符数组:
private final char[] value;
JDK1.9及以后的 String 保存的是字节数组:
private final byte[] value;
- 两种实例化方式
a. 直接赋值
只会产生一个实例化对象,实现池数据的自动保存(池中没有数据,保存新数据,有的话,不必重新开辟内存,使用已有的内存);
b. 构造方法实例化
String str = new String("123");
此时会开辟两块堆内存空间(new一块,匿名对象一块),而后只会使用 new 的那块;且继续 new ,继续开辟空间,不会自动保存于池中。
注意:可以手工入池
public String intern();
示例:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String strr = new String("123").intern(); String str = "123"; System.out.println(strr.equals(str)); } }
返回 true。
- 字符串比较
public boolean equals(String str);
注意:尽可能将字符串常量写在前面(匿名对象不会为空),因为如果 str 为 null 会出现异常 NullPointerException(str.equals("123"))。
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String str = "123"; System.out.println("123".equals(str)); } }
- String 对象(常量)池
主要实现数据的共享处理,Java中的对象(常量)池实际可分为两种:
静态常量池:程序(*.class)加载时,会自动将程序保存的字符串、普通的常量、类和方法的信息等等,全部进行分配。
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String str = "tu"; String str1 = "tutu"; String str2 = "tu" + "tu"; System.out.println(str1 == str2); // true } }
运行时常量池:程序加载之后,里面的一些变量保存的地方。
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String str = "tu"; String str1 = "tutu"; String str2 = "tu" + "tu"; String str3 = str + "tu"; System.out.println(str1 == str3); // false } }
说明:程序在加载时并不知道 str 是什么内容。