字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
实例化一个String类有两种方法:
String str = "hello world";
示例:
String str = new String("hello world");
字符串常量实际上是String的匿名对象。这里 "hello world"
就是一个String的匿名对象。因此 "hello world"
可以直接调用String类的方法和属性。
因此所谓的 直接赋值
实际上是给一个匿名对象设置了名字而已,匿名对象由系统自动生成,不再有用户使用 new
创建。
使用 构造方法
进行String类对象实例化,会开辟两块堆内存空间,一块是 "hello world"
匿名对象所占,一块是使用 new
关键字创建的堆内存。
而且在赋值操作完成后, "hello world"
匿名对象所占的堆内存空间将会变成垃圾空间。
因此直接赋值将会比使用构造方法的方式节省一块堆内存空间。而且使用构造方法定义的String对象,也不会保存在对象池中。
使用 new
一定会开辟新的堆内存空间。
如果希望新开辟的String类内存数据保存进对象池,可以使用String类的 intern()
方法。
因此这两种实例化的区别总结如下:
示例:
public class StringDemo{
public static void main(String args[]) {
String stra = "hello";
String strb = "hello";
String strc = "hello";
String strd = new String("hello");//一旦使用new,一定会分配新的堆内存。
String stre = new String("hello").intern();//使用intern手工入池。
System.out.println(stra == strb);
System.out.println(stra == strc);
System.out.println(strc == strb);
System.out.println(stra == strd);
System.out.println(stra == stre);
}
}
输出结果:
true
true
true
false
true
参考: https://docs.oracle.com/javas...
== equals()
示例:
public class StringDemo{
public static void main(String args[]) {
String stra = "hello";
String strb = new String("hello");
String strc = strb;
System.out.println(stra == strb);
System.out.println(stra == strc);
System.out.println(strc == strb);
System.out.println(stra.equals(strb));
}
}
输出结果:
false
false
true
true
String对象的内容不能改变,而对于String变量内容的变化,是利用了引用关系的变化而实现的。每一次的变化都会使得String变量指向的堆内存空间改变,而且原先的堆内存空间将会变成垃圾空间。
示例:
public class StringDemo{
public static void main(String args[]) {
String str = "hello ";
//使用identityHashCode获取根据对象内存地址计算出来的哈希码,不同的地址算出来的结果是不一样的。
System.out.println(System.identityHashCode(str));
str = str + "world ";
System.out.println(System.identityHashCode(str));
str += "!!!";
System.out.println(System.identityHashCode(str));
System.out.println(str);
}
}
输出结果:
366712642
1829164700
2018699554
hello world !!!