前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?

对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?

作者头像
Hongten
发布2018-09-13 11:30:20
6810
发布2018-09-13 11:30:20
举报
文章被收录于专栏:HongtenHongten

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

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

代码语言:javascript
复制
 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 }

运行效果:

代码语言:javascript
复制
testStrA == testStrB ? false
testStrA == testStrC ? true
testStrA == testStrF ? false

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

首先我们要明白的是

代码语言:javascript
复制
1 String testStrA = "abc";

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

实例池中存在字符串

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

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

实例池中不存在字符串

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

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

代码语言:javascript
复制
1 String testStrB = new String("abc");

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

这样,对于第一个结果:

代码语言:javascript
复制
testStrA == testStrB ? false

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

而对于第二个结果:

代码语言:javascript
复制
testStrA == testStrC ? true

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

最后是第三个结果:

代码语言:javascript
复制
testStrA == testStrF ? false

这个要稍微难理解一些。

代码语言:javascript
复制
1 String testStrD = "ab";
2 String testStrE = "c";
3 String testStrF = testStrD + testStrE;

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-11-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档