一起学Java(三十七)----- 字符串

不积跬步,无以至千里;不积小流,无以成江海。

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 是什么内容。

猜你喜欢

转载自www.cnblogs.com/smilexuezi/p/12912920.html