JavaSE常用类之String类的实例化

String 类

String概述

String:字符串,使用一对""引起来表示

  1. String 声明为 final 的,不可被继承

  2. String 实现了 Serializable 接口:表示字符串是支持序列化的
    实现了 Comparable 接口:表示String是可比较的

  3. String 内部定义了 final char[] value 用于存储字符串数据

  4. String 代表不可变的字符序列 简称:不可变性

    ​ 体现:①当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的 value 进行赋值

    ​ ②当对字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的 value 进行赋值

    ​ ③当调用 String 的 replace() 方法修改指定的字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的 value 进行赋值

  5. 通过字面量(区别于new)的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中

  6. 字符串常量池中不会存储相同内容的字符串的

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"。

posted @ 2021-03-06 19:01  叁玖贰拾柒  阅读(74)  评论(0)    收藏  举报