java s1=abc s2=abc s1==s2_经典问题:String s1 = abc 与 String s2 = new String(abc)的区别...

这是以前刚学Java那会经常被问到的问题,并且也会经常出现在面试中。这个问题不仅仅只局限于Java,可以适用于其他大部分语言,正好最近有个小朋友在学编程,特此整理一下。

String s1 = "abc" ;

String s2 = new String("abc");

首先,我们先看看以上两句分别做了什么?

String s1 = "abc" 做了什么

在栈中创建了一个名为 s1 的变量(引用)

如果 String池 中没有 "abc" 存在,则在常量池中创建一个 String 类型的 "abc" 对象,有就不创建

将 "abc" 的地址赋给 s1

所以,此句到底创建了几个对象,根据 "abc" 的情况而定,"abc" 之前存在就是一个,否则就没有创建。

String s2 = new String("abc") 做了什么

创建了一个名为 s2 的变量(引用)

如果 String池 中没有 "abc" 存在,则在 String池 中创建一个 String 类型的 "abc" ,有就不创建

使用 new关键字 在堆中创建了一个 String 对象

将用 new 创建的 String 对象的地址赋给 s2

所以,此句到底创建了几个对象,根据 "abc" 的情况而定,"abc" 之前存在就是1个,不存在就是2个。

栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆:存放用 new 产生的数据

s1 == s2 与 s1.equals(s2)

s1 与 s2 看着都是内容为 "abc" 的字符串,但是使用 == 和 equals() 来判断它们是否相等时会发现,结果并不一样。

s1 == s2

结果为false,根据上述内容我们可以知道,两者虽然内容一致,但是其实两者的指向的内存地址并不一致,而 == 会检查两者的内存地址是否一致,一致为true,不一致为false

s1.equals(s2)

结果为true,因为 equals() 在检查地址不相等后,还会检查两者的内容,两者内容相等,则仍然返回true,毫无疑问,两者的内容是一致的。

关于 String s3 = "abc" + "xyz";

还有一个与上述问题类似的问题,就是 String s3 = "abc" + "xyz"; 到底创建了几个对象?

关于 "abc" 与 "xyz" 在上述中已经提到,如果之前存在就不用创建,不存在则创建。我们更需要关心的是这两个字符串的拼接。

使用 "+" 拼接字符串,实际是创建了一个新字符串 "abcxyz"(使用 + 号,会在底层做 new StringBuilder().append("abc").append("xyz") 操作),所以至少会创建一个对象,如果 "abc" 与 "xyz" 之前都不存在,则就是创建3个对象,如果两个中只有一个存在,则是2个。

关于 = 符号的小拓展

对于 "=" 我们并不陌生,但是编程语言中的 "=" 我们不能单纯的当做数学中的等号,我们更习惯理解为赋值号,主要赋值的东西是内存地址,而不是内容本身。

我们可以这样粗暴的理解:当一个对象被创建出来时,它可以简单的分成两部份,地址与内容。当我们使用a = 对象时,a 得到的并不是对象的内容,而是对象的地址,在我们操作 a 的时候,程序会通过 a(即对象的地址)来在内存中找到对象所表示的内容,并对其操作。

下面,我们来看一个小例子:

String a = "xyz";

String b = a;

System.out.println(" a = " + a);

System.out.println(" b = " + b);

a = "qwe";

System.out.println(" a = " + a);

System.out.println(" b = " + b);

打印结果:

a = xyz

b = xyz

a = qwe

b = xyz

那么在这过程中发生了什么?

a 获取了 "xyz" 的内存地址

a 将 "xyz" 的内存地址给了 b,此时 a 与 b的内存地址都是指向 "xyz"

"qwe" 将它的地址赋给了 a,此时 a 的地址就指向 "qwe",但是 b 仍然指向 "xyz",所以 b 打印出来的值为 xyz。

推荐文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NAS、CIFS、NFS之间的关系

经常会听到或看到有人将NAS和CIFS/NFS相提并论,其实是对存储的理解有误。 NAS,网络附加存储,中心词“存储”,是的,它是一个存储设备。比如我装个openfiler或freenas系统,再加几块硬盘,对外提供…

线程池简单实现java_简单实现java线程池

package com.ty.thread;importjava.util.HashSet;importjava.util.Set;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.LinkedBlockingQueue;/***authorTaoyong* date 2018年5月17日* 天下没有难敲的代码!*/public classThreadPoolExecutor …

【转】abp vNext微服务框架分析

abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究。我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.net人员来说几乎是看不懂的,所以研究一番后再…

java线程的创建与执行_Java多线程的创建和运行

1.多线程的好处多线程是一个很有用的东西,它使的系统可以同时运行多个任务,提高程序的执行效率。大家平时可能没有注意到,其实我们电脑能同时执行多个程序的基本原理就是多线程。每一个程序都是一个进程,而线程则是进程下独立的执…

SQL SERVER data tier application 的作用及如何使用SSDT进行SQL数据库的自动化部署到生产环境和版本控制

这个是管理员用来发布数据库所有的脚本用的,自SQL2008以后,微软开始将数据库的开发整合到VS2010上,用户可以将数据所有的相关对象打包成一个DAC包,让管理通过extract data-tier application发布到服务器上。就好像你把代码变成dll…

bitcount java_Java.math.BigInteger.bitCount()方法实例

全屏Java.math.BigInteger.bitCount()方法实例java.math.BigInteger.bitCount()返回此BigInteger的二进制补码表示的位,从它的符号位不同的数字。实现位向量样式集上BigIntegers的时候,此方法很有用。声明以下是java.math.BigInteger.bitCount()方法的声…

java character是什么意思_Java Character 类

利用Character提取字符串中的大写字母和小写字母:public class UpperLowerCase {/** 利用Character类提取字符串中的大写字母和小写字母* auther Anthony-Z*/public static void main(String[] args) {String sr1 "I Like JAVA ! I learn Java everyday."…

php 和jsp,jsp和php哪个好?jsp和php的简单比较

jsp和php这两个Web开发技术哪个好?这个问题应该会有很多人问,但是每种开发技术都有各自的优缺点,所谓的哪个好,不过是看你更擅长使用哪一种技术,所以今天我们来对比一下jsp和php,介绍jsp和php之间有什么区别…

jQuery Ajax 如何设置Timeout

$.get()与$.post()方法是$.ajax的高级封装 全局属性 $.ajaxSetup({timeout:5000}); $.ajax方法有timeout属性可设置,单位也是毫秒。 Azure App Service MVC下,全局属性才起作用,不知为何

php调用sql数据库代码怎么写,PHP读取SQL文件并导入数据库(示例)

/*** 读取 sql 文件并写入数据库* version 1.01 demo.php* author xingshaocheng* edit: www.jbxue.com*/class DBManager{var $dbHost ;var $dbUser ;var $dbPassword ;var $dbSchema ;function __construct($host,$user,$password,$schema){$this->dbHost $host;$thi…

如何修改SharePoint服务器场管理员帐户和密码

最近需要修改MOSS服务器场的管理员帐户,用 "%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o updatefarmcredentials -userlogin [username] -password [password] 这条命令去修改发现没有修改成功,这个…

php中sisson用法,thinkPHP中session()方法用法详解

本文实例讲述了thinkPHP中session()方法用法。分享给大家供大家参考,具体如下:系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成。用法session(name,name,value)参数name(必须):如果传入数组 则…

【转】SharePoint 2010 Search Service -- 管理中心配置

今天配置了一下SharePoint Search,怕忘,赶紧记下来。 我参考了国外的一篇文章:Search Configuration in SharePoint 2010 首先,要查看以下User Profile Service, User Profile Synchronization Service是否运行正常,然…

PHP获取表单数据的方法有几种,如何实现PHP获取表单数据与HTML嵌入PHP脚本

如何实现PHP获取表单数据与HTML嵌入PHP脚本导语:如何实现PHP获取表单数据与HTML嵌入PHP脚本,下面是小编给大家提供的操作讲解,大家可以参考阅读,更多详情请关注应届毕业生考试网。常用的自动全局变量如下所示:1、GET方…

【转】SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)

前段时间工作很忙,好久没更新博客了,趁国庆休假期间,整理了两个之前积累很实用的企业集成组件,并在真正的大型项目中经受住了考验:.Net版SAP RFC适配器组件和SharePoint 2013修改AD域用户密码的WebPart。目前无法在网上…

php base64尺寸,PHP base64编码的图像显示不正确

我试图使用base64编码将图像(任何大小)发送到我创建的API。编码后的字符串会作为URL中的参数访问我的API。使用PHP构建的API。PHP base64编码的图像显示不正确一旦请求命中我的API,我想将图像存储到我的服务器上,并将文件名保存在数据库中。这是工作&…

软件测试之-测试用例写作规范

通用测试用例写作规范 软件测试用例得出软件测试用例的内容,其次,按照软件测试写作方法,落实到文档中,两者是形式和内容的关系,好的测试用例不仅方便自己和别人查看,而且能帮助设计的时候考虑的更周。 一…

php后静态绑定,详解PHP后期静态绑定分析与应用

基础知识1. 范围解析操作符 (::)可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。parent用于调用父类中被覆盖的属性或方法(出现在哪…

Windows电脑SMB共享设置方法

SMB简介: SMB(Server Message Block)(*nix平台和Win NT4.0又称CIFS)协议是Windows平台标准文件共享协议,Linux平台通过samba来支持。SMB最新版本v3.0,在v2.0基础上针对WAN和分布式有改进。 建议使用原版wind…

php个人扫码支付,PHP个人发卡网源码,支持MA支付对接,扫码自动发货

PHP个人发卡网源码,支持MA支付对接,扫码自动发货。源码介绍个人发卡网源码,支持码支付对接,扫码自动发货.自适应网页,可为商品设置优惠套餐,后台管理功能丰富。前台发卡页面有点粗糙,已开源的可…