对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢?
且看下面的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"关键字赋值,两种方式有什么区别?的更多相关文章
- JS对象转URL参数(原生JS和jQuery两种方式)
转自:点击打开链接 现在的js框架将ajax请求封装得非常简单,例如下面: $.ajax({ type: "POST", url: "some.php", da ...
- Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式
建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...
- Python与数据库 sqlalchemy 建立声明层表对象的两种方式
在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...
- Java中创建String的两种方式
1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...
- C#复杂XML反序列化为实体对象两种方式
前言 今天主要讲的是如何把通过接口获取到的Xml数据转换成(反序列化)我们想要的实体对象,当然Xml反序列化和Json反序列化的方式基本上都是大同小异.都是我们事先定义好对应的对应的Xml实体模型,不 ...
- java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))
Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0) 阅读目录 为什么要克隆? 如何实现克隆 浅克 ...
- JS中访问对象的两种方式区别
可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...
- Java中对象拷贝的两种方式
引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...
- Asp.net Web API 返回Json对象的两种方式
这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...
随机推荐
- [转]sql语句中出现笛卡尔乘积 SQL查询入门篇
本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个 ...
- ubuntu14.04安装chrome
到https://www.google.com/chrome/browser/desktop/index.html可下载指定版本的deb文件. 32bit: wget https://dl.googl ...
- 【Web】关于URL中文乱码问题
关于URL编码 一.问题的由来 URL就是网址,只要上网,就一定会用到. ...
- Remove Duplicates from Sorted List | & ||
Remove Duplicates from Sorted List I Given a sorted linked list, delete all duplicates such that eac ...
- Android Design 4.4中文版发布
“两年前的今天,我们发布了 Android Design 中文版(旧闻链接). 随着 Android 系统的发展,界面和设计语言都不断的发生变化.韶华易逝.光阴苒冉,Android 进化到了 4.4 ...
- CUDA学习笔记(二)——CUDA线程模型
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5b.html 一个grid中的所有线程执行相同的内核函数,通过坐标进行区分.这些线程有两级的坐标,bl ...
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...
- Android之jni入门
jni即java native interface,使用jni我们可以在JAVA中调用C代码,提高了效率,可以复用代码,可以灵活的应用于各种场景 怎么使用JNI 安装软件 1.NDK 用于将C代码编译 ...
- Java Hour 33 Weather ( 6 )
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 33 CURD 之 Create 首先是Eclipse 排序的功能找 ...
- ML 02、监督学习
机器学习算法原理.实现与实践——监督学习 机器学习包括监督学习.非监督学习.半监督学习及强化学习,这里先讨论监督学习. 监督学习的任务是学习一个模型,使模型能够对任意给定的输入,对其相应的输出做出一个 ...