String的声明

String的声明

public class StringTest {

   @Test
   public void test4(){
       String s1 = "helloworld";
       String s2 = "world";
       String s3 = "hello"+s2;
       System.out.println(s1 == s3);//false

       final String s4 = "world";
       String s5 = "hello"+s4;
       System.out.println(s1 == s5);//true
  }

   /*
   结论:
   1.常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量
   2.只要其中有一个是变量,结果就在堆中
   3.如果拼接的结果调用intern(),返回值就在常量池中
    */

   @Test
   public void test3(){

       String s1 = "hello";
       String s2 = "world";

       String s3 = "helloworld";
       String s4 = "hello" + "world";
       String s5 = s1 + "world";
       String s6 = "hello" + s2;
       String s7 = s1 + s2;
       String s8 = s5.intern();//返回值得到的s8使用的是常量池中已经存在的“helloworld”

       System.out.println(s3 == s4);//true
       System.out.println(s3 == s5);//false
       System.out.println(s3 == s6);//false
       System.out.println(s3 == s7);//false
       System.out.println(s5 == s7);//false
       System.out.println(s3 == s8);//true
  }


   /*
   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", 11);
       Person p2 = new Person("Tom", 11);

       System.out.println(p1.name.equals(p2.name));//true
       System.out.println(p1.name == p2.name);//true
       p1.name = "Mike";
       System.out.println(p2.name);//Tom
  }

   /*
   String:字符串,使用一对""引起来表示
   1.String类声明为final,不可被继承
   2.String实现了Serializable接口,表示字符串是支持序列化的。
           实现了Comparable接口,表示String可以比较大小
   3.String内部定义了final char[] value用于存储字符串数据
   4.String代表不可变的字符序列。简称:不可变性
       体现: 1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值
             2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
             3.当调用String的replace()修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
   5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
   6.字符串常量池中是不会存储相同内容的字符串的。
    */

   @Test
   public void test1(){
       String s1 = "abc";
       String s2 = "abc";
       //s1 = "hello";

       System.out.println(s1);
       System.out.println(s2);
       System.out.println(s1 == s2);

       System.out.println("********************");
       String s3 = "abc";
       s3+="def";
       System.out.println(s2);//abc
       System.out.println(s3);//abcdef

       System.out.println("*****************");
       String s4 = s2.replace('a', 'm');
       System.out.println(s2);//abc
       System.out.println(s4);//mbc
  }
}
posted @ 2022-02-19 17:04  阳光真好的博客  阅读(283)  评论(0)    收藏  举报