package mytest;
public class StringTest {
/**
* 我们知道String是final类,它所封装的是字符串常量,因此String对象在创建后其内部(字符串)值不能改变,也因此String对象可以被共享。
* intern有个好处,下文中的d对象就会被回收,常量池中的对象可以被共享,节省了资源的利用
* 使用==比较字符串,性能更高,equal会比较字符串中每一个字符。但是==号可能会出现和本意不符的使用场景
*/
public static void main(String[] args) {
String a = new String("1");// 在堆内存空间创建一个字符串对象、常量池中又创建一个对象
String b = new String("1");
String c = "1";// 在常量池内存空间中创建一个字符串对象
System.out.println(a == b);// FALSE
System.out.println(a == c);// FALSE
String d = new String("1");
String f = d.intern();// 从常量池中获取equal相等的对象,如果没有则在常量池中新建。
System.out.println(d == f);// FALSE:堆内存对象和常量池中的对象比较
System.out.println(f == c);// TRUE:常量池中的对象与常量池中的对象比较
String g = "1";
String h = "2";
final String gg = "1";// 1和2都是常量,值是固定的,因此s的值也是固定的,它在类被编译时就已经确定了
final String hh = "2";
String i = g + h;// 在运行时创建的字符串具有独立的内存地址,所以不引用自同一String对象.
String ii = gg + hh;
String j = "12";
String k = "1" + "2";// 在编译成.class时能够识别为同一字符串的,自动优化成常量,引用自同一String对象.
System.out.println(i == j);// FALSE
System.out.println(i == k);// FALSE
System.out.println(ii == k);// TRUE
System.out.println(j == k);// TRUE
String xx = new StringBuffer().append("123").append("456").toString();
System.out.println(xx.intern() == xx);//TRUE 两个常量池中的值比较
}
}
String
最新推荐文章于 2024-08-02 10:48:42 发布