String初始化的几种方式

String初始化的几种方式,第1张

一、String的两种创建方式

     1、String str1 = "abc"

       ①在栈中开辟一块空间创建引用str1;

       ②字符串池中有“abc”,直接让str指向“abc”

          字符串池中没有“abc”,先创建,然后将str指向   “abc”

     2、String str2 = new String("abc")

         ①在栈中开辟一块空间创建引用str2;

         ②在堆中创建对象new String("abc")

         ③str2指向堆中的“abc”

二、对两种创建方式进行一下比较

     1、String str1 = "abc"       

          System.out.println(str1 == "abc")  true

          str1初始化的时候已经在字符串池中创建了一个“abc”,当执行str1==“abc”的时候不会再次创建,此时str1和字符串“abc”指向的是字符串池中的同一个地址,所以输出为true

      2、String str2 = new String("abc")

            System.out.println(str2 == "abc") false

          str2指向的是堆中“abc”的地址,而字符串“abc”再常量池中,所以为false。

         因此不难得出,System.out.println(str2 == str1) false

   1、String str1 = "abc"

       String str2 = "abc"

       System.out.println(str1==str2)  true

  2、String str1 = new String("abc")  

       String str2 = new String(abc)

       System.out.println(str1==str2) false     

总结:第一种方式,只是创建了多个引用,单只有一个对象,比较节省内存空间,会在一定程度上提供程序的运行;

          第二种方式,会创建多个引用,多个对象,加重了程序的负担。

三、字符串的拼接

      1、String str1 = "abcd"

           String str2 = "ab"+"cd"

           System.out.println( str1==str2 )true  

           当一个字符串是由多个字符串常量拼接而成时,它自己肯定也是字符串常量,因此str1初始化之后,字符串池中已存在“abcd”,因此由“ab”和“cd”拼接而成的str2不会再重复创建。  

       2、String str1 = "abcd"

            String str2 = new String("abcd")

            String str3 = "ab" + new String("cd")

           System.out.println( str1==str2 )   false

    System.out.println( str1==str3 )   false

    System.out.println( str2==str3 )  false

           str1 == str2 输出为false,文章的前半部分已经讲过了,这里就不再赘述了;

          str3 是由字符串常量“ab” 和new String("cd")拼接而成的,这里new String("cd")是又创建了一个新的对象,因此,str1 == str3 和 str2 == str3  均输出为false

        3、String str1 = "ab"

              String str2 = "a"

              final  String str3 = "a"

              String str4 = str2+"b"

              String str5 = str3 +"b"

              System.out.println((str1 == str4))   false

              System.out.println((str1 == str5))   true

             ①使用包含变量的字符串链接,如:str2+"b",创建的对象是运行期才创建的;

             只要str2是变量,无论str2指向的池中的字符串就还是堆中的字符串对象,运行期str2+"b" *** 作实际上是编译器创建了StringBuilder对象进行了append *** 作后通过toString()返回了一个字符串对象存在堆中。 所以,(str1 == str4) 为false

              ②str3 是一个用final修饰的变量,再编译期已知,再运行时会直接用常量“a” 代替str3

                  因此 str3+"b " 就等效于 “a” + "b" ,所以,(str1 == str5) 为true.

            

         

string str1// 可以

string str2[10]//可以

string str3="hello"//可以,注意中间过程,先调用string的带char* 构造函数,然后调用复制构造函数

string str4[10]="hello"//不可以,数组不能这样初始化

string str5[10]={}//可以 初始化为空字符串


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11644483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存