JavaSE常用类之String类的实例化
String 类
String概述
String:字符串,使用一对""引起来表示
-
String 声明为 final 的,不可被继承
-
String 实现了 Serializable 接口:表示字符串是支持序列化的
实现了 Comparable 接口:表示String是可比较的 -
String 内部定义了 final char[] value 用于存储字符串数据
-
String 代表不可变的字符序列 简称:不可变性
体现:①当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的 value 进行赋值
②当对字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的 value 进行赋值
③当调用 String 的 replace() 方法修改指定的字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的 value 进行赋值
-
通过字面量(区别于new)的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中
-
字符串常量池中不会存储相同内容的字符串的
String 的实例化
实例化的两种方式
String 的实例化方式:
方式一:通过字面量定义的方式
方式二:通过 new + 构造器的方式
两种实例化的区别
@Test
public void test2(){
//通过字面量定义的方式:此时的 s1 和 s2 的数据 JavaEE 声明在方法区中的字符串常量池中
String s1 = "JavaEE";
String s2 = "JavaEE";
//通过 new + 构造器的方式:此时的 s3 和 s4 保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3 = new String("JavaEE");
String s4 = new String("JavaEE");
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s1 == s4); //false
System.out.println(s3 == s4); //false
System.out.println("=============================");
Person p1 = new Person("Tom", 12);
Person p2 = new Person("Tom", 12);
//虽然 equals 比较的是内存是否相同,但在 String 类中重写了,是比较的内容是否相等
System.out.println(p1.name.equals(p2.name)); //true
System.out.println(p1.name == p2.name); //true
}
加深字符串常量池中和堆中的区别
@Test
public void test3(){
String s1 = "JavaEE";
String s2 = "hadoop";
String s3 = "JavaEEhadoop";
String s4 = "JavaEE" + "hadoop";
String s5 = s1 + "hadoop";
String s6 = "JavaEE" + s2;
String s7 = s1 + s2;
System.out.println(s3 == s4); //ture
System.out.println(s3 == s5); //false
System.out.println(s3 == s6); //false
System.out.println(s3 == s7); //false
System.out.println(s5 == s6); //false
System.out.println(s5 == s7); //false
System.out.println(s6 == s7); //false
String s8 = s5.intern(); //返回值得到的 s8 是使用常量池中已经存在的"JavaEEhadoop"
System.out.println(s3 == s8); //true
}
面试题
以 String s = new String("abc"); 方式创建对象,在内存中创建了几个对象?
答:两个,一个是 new 在堆空间中的对象,另一个是 char[] 对应的常量池中的数据:"abc"。

浙公网安备 33010602011771号