• java String 两种不同的赋值 比较


    原文:http://blog.163.com/woshihezhonghua@126/blog/static/1271436362012101214031911/

    首先明确一点,String是一个类。下面我们主要讨论两个问题 

     a) String类的对象的两种赋值方式

     b) 为什么String类的对象可以直接赋值

     

    a) 1 类似普通对象,通过new创建字符串对象。String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后 把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。

    java String 两种不同的赋值 比较 - hzh - The Legend of 1900

    a)2 直接赋值。 如String str = "Hello";  首先会去缓冲池中找有没有一个"Hello"对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,下次如果还有String对象也用直接赋 值方式定义为“Hello”, 则不需要开辟新的堆空间,而仍然指向这个池中的"Hello"

    java String 两种不同的赋值 比较 - hzh - The Legend of 1900
     
    以下代码可以测试这一结论 ,最后输出结果为 true, 我们用的是== 测试,输出true,说明两者的地址是一样的
    java String 两种不同的赋值 比较 - hzh - The Legend of 1900
     
    a)3  手动入池
    即使使用new关键字,第一种方式赋值,也可以使用一个java中的手动入池指令,让所创建的对象入池,以后依然可以背重复使用,利用下面两段代码可以测试, 如下图,结果显然是false,因为二者的地址不同。 

    java String 两种不同的赋值 比较 - hzh - The Legend of 1900

     
     
    下面程序中,我们使用了intern()方法,手动入池,所以结果是true.
    public class TestString
    {
     public static void main(String args[]){
      String str1 = new String("Hello").intern();
      String str2 = "Hello";
      System.out.println( str1==str2 );
     }
    }
     
    下面程序中,str2没有使用直接赋值,所以结果又变为false
    public class TestString
    {
     public static void main(String args[]){
      String str1 = new String("Hello").intern();
      String str2 = new String("Hello");
      System.out.println( str1==str2 );
     }
    }
     
     
    综上所述,开发中,使用直接赋值的方式,显然效率更高。
     
     
    b) 为什么String类的对象可以直接赋值  

     


    打开了String.class,有这么一段介绍:

    1. /** 
    2. * The <code>String</code> class represents character strings. All 
    3.  * string literals in Java programs, such as <code>"abc"</code>, are 
    4.  * implemented as instances of this class. 
    5.  * <p> 
    6.  * Strings are constant; their values cannot be changed after they 
    7.  * are created. String buffers support mutable strings. 
    8.  * Because String objects are immutable they can be shared. For example: 
    9.  * <p><blockquote><pre> 
    10.  *     String str = "abc"; 
    11.  * </pre></blockquote><p> 
    12.  * is equivalent to: 
    13.  * <p><blockquote><pre> 
    14.  *     char data[] = {'a', 'b', 'c'}; 
    15.  *     String str = new String(data); 
    16.  * </pre></blockquote><p> 
    17.  * Here are some more examples of how strings can be used: 
    18.  * <p><blockquote><pre> 
    19.  *     System.out.println("abc"); 
    20.  *     String cde = "cde"; 
    21.  *     System.out.println("abc" + cde); 
    22.  *     String c = "abc".substring(2,3); 
    23.  *     String d = cde.substring(1, 2); 
    24.  * </pre></blockquote> 
    25.  * <p> 
    26.  */  

    通 过上面的介绍,我们可以清楚,直接赋值的话,是通过编译器在起作用,当你对"abc"没有通过new创建时,他会自动默认给你调用构造函数new String(char value[]). 不显式调用String的构造函数(通过new叫显式调用),其实JDK编译器会自动给你加上。

  • 相关阅读:
    django项目一:基于django2.2可重用登录与注册模块-图片验证码
    django项目一:基于django2.2可重用登录与注册模块-Django表单
    django项目一:基于django2.2可重用登录与注册模块-登录视图函数
    谈谈我的移动端rem适配方案
    微信公众号jssdk自定义分享,二次分享自定义失败解决技巧
    html-webpack-plugin的使用
    formData 无需form异步上传多个图片
    原生javascript跨浏览器常用事件处理
    apache+php+mysql运行环境
    MySQL企业级备份
  • 原文地址:https://www.cnblogs.com/tc310/p/4015153.html
Copyright © 2020-2023  润新知