字符串广泛应用 在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 !!!