zoukankan      html  css  js  c++  java
  • Java中用字符串常量赋值和使用new构造String对象的区别

    String str1 = "ABC";
    String str2 = new String("ABC");

    String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象(“ABC”),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝,Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。

    String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”

    String str1 = new String("ABC");
    String str2 = new String("ABC");
    str1 == str //false
    
    String str3 = "ABC";
    String str4 = "ABC";
    String str5 =  "AB" + "C";
    str3 == str4   //true
    str3 == str5  // true
    
    
    String a  = "ABC";
    String b = "AB";
    String c = b + "C";
    System.out.println( a == c );//false

    a、b在编译时就已经被确定了,而c是引用变量,不会在编译时就被确定。

    应用的情况:建议在平时的使用中,尽量使用String = “abcd”;这种方式来创建字符串,而不是String = new String(“abcd”);这种形式,因为使用new构造器创建字符串对象一定会开辟一个新的heap空间,而双引号则是采用了String interning(字符串驻留)进行了优化,效率比构造器高。

    参考:1.Java中String直接赋值和使用new的区别

       2.Java中String类通过new创建和直接赋值字符串的区别

    只为训练自己,时刻锤炼一个程序员最基本的技能!
  • 相关阅读:
    测试候选区
    This is my new post
    发布到首页候选区
    nb
    []
    隐藏列(gridview遍历)
    交叉表、行列转换和交叉查询经典
    数据库设计中的14个技巧
    jQuery操作表格,table tr td,单元格
    不愿将多种编程语言杂糅在一起?可能你还没意识到而已
  • 原文地址:https://www.cnblogs.com/coding-wtf/p/6413206.html
Copyright © 2011-2022 走看看