zoukankan      html  css  js  c++  java
  • 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?

    当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢?

    且看下面的demo,自然便区分开了

     1 /**
     2  * 
     3  */
     4 package com.b510.test;
     5 
     6 /**
     7  * Problem:
     8  *     对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
     9  *     也即:
    10  *       String testStrA = "abc";
    11  *       String testStrB = new String("abc");
    12  *     
    13  * @author Jone Hongten
    14  * @create date:2013-10-31
    15  * @version 1.0
    16  */
    17 public class StringTest {
    18 
    19     public static void main(String[] args) {
    20         String testStrA = "abc";
    21         String testStrB = new String("abc");
    22         System.out.println("testStrA == testStrB ? " + (testStrA == testStrB ? true : false));
    23         
    24         String testStrC = "abc";
    25         System.out.println("testStrA == testStrC ? " + (testStrA == testStrC ? true : false));
    26         
    27         String testStrD = "ab";
    28         String testStrE = "c";
    29         String testStrF = testStrD + testStrE;
    30         System.out.println("testStrA == testStrF ? " + (testStrA == tsetStrF ? true : false));
    31     }
    32 }

    运行效果:

    testStrA == testStrB ? false
    testStrA == testStrC ? true
    testStrA == testStrF ? false

    我们来分析一下,为什么会出现这样的结果:

    首先我们要明白的是

    1 String testStrA = "abc";

    这样的代码,可能会创建一个对象或者不会创建对象:这里会出现一个名词“字符串实例池”

    实例池中存在字符串

    这个名词很形象,在这个字符串实例池中,存放着很多字符串,可能包含有字符串:"abc",所以

    在这种情况下面,上面的语句是不会创建对象的,而是直接引用池子中的字符串:"abc";

    实例池中不存在字符串

    如果字符串"abc"在实例池中并不存在,那么这时,就会初始化一个字符串:"abc",即创建

    一个字符串对象:"abc",并且会把创建好的字符串放入到"字符串实例池"中。

    1 String testStrB = new String("abc");

    对于关键字:new ,即会产生新的对象,也就是说,每次都会产生新的字符串对象

    这样,对于第一个结果:

    testStrA == testStrB ? false

    我们就知道了,原来是这样的。

    而对于第二个结果:

    testStrA == testStrC ? true

    只要我们对"字符串实例池"有一个印象,这也是不难理解的。

    最后是第三个结果:

    testStrA == testStrF ? false

    这个要稍微难理解一些。

    1 String testStrD = "ab";
    2 String testStrE = "c";
    3 String testStrF = testStrD + testStrE;

    字符串testStrD和testStrE都是字符串常量,所以他们在代码编译的时期就已经是确定好的了,

    但是对testStrF来说,他的值是testStrD和testStrE的引用,所以不会在编译时期确定,实际上

    testStrF类似于新建了一个对象出来,然后把所创建的对象的引用赋值给了testStrF。

    所以出现第三个结果也是情理之中的事情...

    ========================================================

    More reading,and english is important.

    I'm Hongten

     

    大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
    Hongten博客排名在100名以内。粉丝过千。
    Hongten出品,必是精品。

    E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

    ========================================================

  • 相关阅读:
    MySQL关于Table cache设置,看这一篇就够了
    常用的CSS小技巧
    解决layui动态追加的点击事件不起作用问题
    解决layui动态追加的点击事件不起作用问题
    解决layui动态追加的点击事件不起作用问题
    解决layui动态追加的点击事件不起作用问题
    git、github、gitlab之间的关系
    git、github、gitlab之间的关系
    git、github、gitlab之间的关系
    git、github、gitlab之间的关系
  • 原文地址:https://www.cnblogs.com/hongten/p/hongten_string_qubie.html
Copyright © 2011-2022 走看看