String 类
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
实例化 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() 方法。
因此这两种实例化的区别总结如下:
直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池之中,以供下次再次使用。
构造方法:会开辟两块堆内存空间,其中匿名对象所占的空间会成为垃圾空间,并且不会自动入池,但是用户可以使用 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
String 方法
参考:https://docs.oracle.com/javas…
String“==”与“equals()”的区别
== 是 java 提供的关系运算符,主要的功能是判断数值是否相同,如果用在 String 对象上,比较的是两个 String 对象所指向的堆内存地址是否一样。
equals() 是由 String 提供的一个方法,判断两个 String 对象的内容是否相同。
示例:
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 变量内容的变化,是利用了引用关系的变化而实现的。每一次的变化都会使得 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 !!!
String 类特点总结
String 对象有两种实例化方式,使用直接赋值方式可以不产生垃圾空间,并且可以自动入池。使用构造方法会产生一块垃圾空间,也不会自动入池。
String 对象一旦实例化,其内容不可改变,String 类对象内容的改变是依靠引用关系的改变实现的。因此很多时候可以当成基本数据类型来使用。
String 对象的内容相等判断 equals() 方法完成,“==”实现的是内存地址的判断。