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

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

 /**
*
*/
package com.b510.test; /**
* Problem:
* 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
* 也即:
* String testStrA = "abc";
* String testStrB = new String("abc");
*
* @author Jone Hongten
* @create date:2013-10-31
* @version 1.0
*/
public class StringTest { public static void main(String[] args) {
String testStrA = "abc";
String testStrB = new String("abc");
System.out.println("testStrA == testStrB ? " + (testStrA == testStrB ? true : false)); String testStrC = "abc";
System.out.println("testStrA == testStrC ? " + (testStrA == testStrC ? true : false)); String testStrD = "ab";
String testStrE = "c";
String testStrF = testStrD + testStrE;
System.out.println("testStrA == testStrF ? " + (testStrA == tsetStrF ? true : false));
}
}

运行效果:

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

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

首先我们要明白的是

 String testStrA = "abc";

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

实例池中存在字符串

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

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

实例池中不存在字符串

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

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

 String testStrB = new String("abc");

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

这样,对于第一个结果:

testStrA == testStrB ? false

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

而对于第二个结果:

testStrA == testStrC ? true

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

最后是第三个结果:

testStrA == testStrF ? false

这个要稍微难理解一些。

 String testStrD = "ab";
String testStrE = "c";
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

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

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

  1. JS对象转URL参数(原生JS和jQuery两种方式)

    转自:点击打开链接 现在的js框架将ajax请求封装得非常简单,例如下面: $.ajax({ type: "POST", url: "some.php", da ...

  2. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  3. Python与数据库 sqlalchemy 建立声明层表对象的两种方式

    在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...

  4. Java中创建String的两种方式

    1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...

  5. C#复杂XML反序列化为实体对象两种方式

    前言 今天主要讲的是如何把通过接口获取到的Xml数据转换成(反序列化)我们想要的实体对象,当然Xml反序列化和Json反序列化的方式基本上都是大同小异.都是我们事先定义好对应的对应的Xml实体模型,不 ...

  6. java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))

    Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克 ...

  7. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  8. Java中对象拷贝的两种方式

    引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...

  9. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

随机推荐

  1. js中的闭包之我理解

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  2. 【架构】docker环境搭建mysql主从

    序 本文主要研究怎么在docker上搭建mysql的主从.因为在单机搭建mysql多实例然后再配主从,感觉太痛苦了,环境各有不同,配置各不大相 同,从网上找搭建方法,试了半天也没成功,最后也没耐心调试 ...

  3. cocos2dx混合模式应用

    //Opacity 0完全透明 255完全不透明 //ALPHA 0完全透明 1完全不透明 CCRenderTexture* pRT = CCRenderTexture::create(480,320 ...

  4. canvas API ,通俗的canvas基础知识(二)

    上文我们讲到了画一条线,画矩形,写文字,总算是有了一个好的开头,如果还没有看的同学出门左转,先看看那篇,这里就不多做叙述了,接下来我们看比较复杂的一些属性和方法! 讲之前呢,我还是想温习一下,毕竟上文 ...

  5. 强制JSP页面刷新,防止被服务器缓存(可用于静态include强制刷新)

    对于jsp页面,为了防止页面被服务器缓存.始终返回同样的结果. 通常的做法是在客户端的url后面加上一个变化的参数,比如加一个当前时间. 我现在使用的方法是在jsp头部添加以下代码: <%    ...

  6. HTTP状态码和常用对照表

    http://tool.oschina.net/commons 响应码:“200” : OK: “302” : Found 暂时转移,用于重定向, Response.Redirect()会让浏览器再请 ...

  7. C++里的静态成员函数不能用const的原因

    From http://blog.csdn.net/freeboy1015/article/details/7634950     static在c++中的第五种含义:用static修饰不访问非静态数 ...

  8. jar包和war包的区别

    jar包和war包的区别: jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性了,这些jar包一般都会放在lib目录 ...

  9. SSH 超时断开连接解决办法

    配置服务器端: vi /etc/ssh/sshd.conf ClientAliveInterval 120 #以秒为单位(可以改大些) ClientAliveCountMax 0 #发现客户端没有相应 ...

  10. 8.桥接模式(Bridge Pattern)

    using System; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { // 创 ...