== equals new String("abc")

经典问题:String s1 = "abc" 与 String s2 = new String("abc")的区别 这是以前刚学Java那会经常被问到的问题,并且也会经常出现在面试中。这个问题不仅仅只局限于Java,可以适用于其他大部分语言,正好最近有个小朋友在学编程,特此整理一下。 String s1 = "abc" ; String s2 = new String("abc"); 首先,我们先看看以上两句分别做了什么? String s1 = “abc” 做了什么 在栈中创建了一个名为 s1 的变量... 阅读详情

一:==和equals

值类型存储在内存中的堆栈(以后简称栈)中,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量地址是否相同,即栈中的内容是否相同。

 equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

二:String str=new String("abc")创建了几个对象

String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?

接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。  

我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?

我们来看一下被我们调用了的String的构造器:  

public String(String original) {  //other code ...  }   大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:

一、使用new创建对象。 

二、调用Class类的newInstance方法,利用反射机制创建对象。

我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。

 

这种方式是String特有的,并且它与new的方式存在很大区别。  

String str="abc";  

毫无疑问,这行代码创建了一个String对象。  

String a="abc";  String b="abc";   那这里呢?

答案还是一个。  

String a="ab"+"cd";   再看看这里呢?

答案是三个。

说到这里,我们就需要引入对字符串池相关知识的回顾了。  

在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。  

我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。

 

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,对此我们不再赘述。因此我们提倡大家用引号包含文本的方式来创建String对象以提高效率,实际上这也是我们在编程中常采用的。

 

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。 

堆(heap):用于存储对象


大模型新闻摘要生成质量评估工具 大模型新闻摘要生成质量评估工具 关键词:大模型、新闻摘要、质量评估、自然语言处理、算法 摘要:本文将探讨大模型新闻摘要生成质量评估工具的设计与应用。首先介绍大模型新闻摘要生成的背景和问题,然后深入分析质量评估的难点和重要性,接着介绍大模型的 阅读详情

相关推荐

【Clickhouse从入门到精通】第60篇:ClickHouse生态总结与未来展望

ClickHouse系列收官总结 本文作为《ClickHouse从入门到精通》系列的第60篇收官之作,系统回顾了整个系列的知识体系。文章从基础概念到高级应用,全面梳理了ClickHouse的核心技术: 知识体系:完整回顾了60篇文章的知识图谱,包括列式存储原理、MergeTree引擎家族、分布式架构等核心内容 生态工具:详细盘点了ClickHouse的企业版工具、运维监控、数据集成和可视化方案 版本演进:分析了从21.x到24.x的主要版本特性升级 未来趋势:展望了向量化引擎、湖仓一体、AI集成等发展方向

xyghehehehe的专栏 439

String与new String()的区别和==与equals的区别以及拼接的区别?

比较String与new String()的区别 String str1="123"; String str2=new String("456"); String str3=new String("456"); 这两种声明变量是有区别的 1.str1会创建一个对象或者不会创建一个对象,其中出现了一个字符串实例池的概念,实例池中存放许多字符串,当声明的字符串已经存在实例池中,该语句就不会创建对象而...

weixin_44477207的博客 999

从零开始用TS开发babylonjs - 本机环境搭建

babylonjs,初始化本地安装,web3d引擎

han3527638的专栏 793

黑马程序员----String对象的创建的扩展

String对象的创建的扩展 ----------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------- String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个。 接下来我们就

a6669852的专栏 508

保姆级教程:在Windows/Mac上从零部署清华Kronos股票预测模型(含Qlib数据更新避坑指南)

本文提供了一份详细的指南,帮助用户在Windows和Mac系统上从零部署清华Kronos股票预测模型,包括环境配置、模型权重获取、Qlib数据更新避坑等关键步骤。特别针对国内用户遇到的网络问题和数据更新不及时提供了解决方案,适合量化投资和金融科技爱好者快速上手。

weixin_29053577的博客 623

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 437

new String和String中的equlas VS. ==

在JAVA中,String的使用: 1.String a = "abc"; 2.String b = "abc"; 3.String c = new String("abc"); 以上的区别: 1中只会创建一个对象"abd",并把"abc"存放在字符常量池中,当2又要赋值"abc"时,则会从字符常量池中搜索看是否已存在,如果存在,则直接指向"abc"。

sxszwwzgy的博客 191

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

linq 中on new和equals new的用法

http://blog.csdn.net/whw6263989/article/details/7877285

TianGaojie123abc的专栏 1671

华为OD机试 - 物流仓储多维度成本利润综合查询系统 - 二维数组(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。某物流企业在全国多个仓库开展仓储业务,需要对不同仓库、不同时段的入库成本、出库收入和库存损耗进行综合统计分析,用于生成 日报、周报和月报。字段说明及取值范围如下:warehouses: int[] 扁平化数组 [w0d0in, w0d0out,

学Java,找哪吒 308

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB使用贝叶斯bnt网络工具箱:使用手册详解

WW、forever的博客 2676

==、equals和new、直接赋值

==、equals和new、直接赋值 我们通过如下实例来说明,先看一个简单的代码: public class Practice1 { public static void main(String[] args) { String str1=new String("hello"); String str2=new String("hello"); String str3="hello"; String str4="hello"; //结果为true System.out

weixin_45759791的博客 475

【零基础入门unity游戏开发——2D篇】大大简化了地形创建流程,减少Rule Tile的使用 —— AutoTile自动平铺瓦片的使用介绍

Unity 2D游戏开发中的AutoTile技术详解 摘要:本文详细介绍了Unity 2D游戏开发中的AutoTile技术,这是一种智能瓦片系统,能够自动处理地形和场景拼接。文章首先讲解了AutoTile的基本概念和优势,然后分步骤指导读者如何安装2D Tilemap Extras包、创建AutoTile、设置参数和绘制遮罩。通过实际案例演示了AutoTile的使用方法,并比较了AutoTile与Rule Tile的适用场景。最后指出AutoTile虽然使用方便,但对素材要求较高,开发者应根据项目需求选择合

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 728

怎么做到new String("abc") == new String("abc")双等号为true呢?不是使用equals哦

正常情况如果按照正常情况,你面试的时候,看到这个代码,你肯定会说:结果是false。如果我要他们是true,应该怎么做呢?有什么方法吗?Stringstr4=newStrin...

qq_18244417的博客 2693

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

==和equals的区别 以及String比较 hashCode和equals方法比较 new String(“abc“)到底创建了几个对象?

==和equals的区别 == 比较的是值 比较基本的数据类型,比较的是数值; 比较引用类型:比较引用指向的值(地址) equals默认比较也是地址,因为这个方法的最初定义在Object上,默认的实现就是比较地址 自定义的类,如果需要比较的是内容,那么就要学String,重写equals方法 String s1 = new String("zs"); String s2 = new String("zs"); System.out.println(s1 == s2); //f

zwb的博客 190

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

每日八股day1

使用 equals () 方法,String类已经重写了Object的equals()方法,不是比较地址而改为逐个比较字符内容,==比较的是变量保存的内存地址不是字符串内容,对于基本类型 (int char....)比较的值,对于引用类型(对象 String...)==比较的是内存地址如果使用==会出现即时两个字符串内容相同仍然出现false现象,本质上是因为两个对象的地址不相同,==无法实现比较字符串内容,故使用equals()方法。

wry2152413030的博客 477

二十年来一直没搞清楚的一个问题

大家看到后不许笑话我! ─────────── 女生小便要用卫生纸吗? ─────────── 谢绝转载! Aviva ...

weixin_30312659的博客 73

java中String s=“abc“及String s=new String(“abc“)详解

String s =new String()分析堆与栈,是先定义S,还是先new string()步骤:1) 栈中开辟一块空间存放引用str1;2) String池中开辟一块空间,存放String常量"abc";3) 引用str1指向池中String常量"abc";4) str1所指代的地址即常量"abc"所在地址,输出为true;步骤:1) 栈中开辟一块空间存放引用str2;2) 堆中开辟一块空间存放一个新建的String对象"abc";

weixin_50687701的博客 1882

Java中 String str1=“abc“; String str2=new String(“abc“); 有什么区别?

Java中 String str1="abc"; String str2=new String("abc"); 有什么区别? https://blog.csdn.net/thedays_withyou/article/details/65448243 关于 “==” 和 equals()的区别: https://www.cnblogs.com/qianguyihao/p/3929585.html

Move on 405

经典String str = new String("abc")创建了几个对象?(转)

String str1="abc";  String str2=new String("abc");  有啥区别   Java把内存划分成两种:一种是栈内存,一种是堆内存。            在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。            当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Jav

DAO的博客 1756

黑马程序员——Java基础---equals和"=="的区别

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一."=="和equals的实质             在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。基本数据类型在"栈"中存的是其内容值,而对象类在"栈"中 存的是地址,这些地址指向"堆"中的对象。 java.lang包中的Object类

qq_27480907的专栏 355

Java中的String str="abc"; String str=new String("abc");和String str = new String();的区别以及==与equals()的不同。

Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新

上班搞IT,下班搞ITF。 1946

String s=“abc“ 和 String s1=new String(“abc“)和String s2=new String(“abc“)之间的关系

这篇文章针对困扰新手初学java基础时常遇到的难以理解的一个问题!!! 初学java时常常会碰到String s="abc" 和 String s1=new String("abc"),String s1=new String("abc")和String s2=new String("abc"),然后就让我们比较他们其中的关系,比如s==s1是true or false、s1==s2是true or false、s1.equals(s2),这些个问题常常会让刚接触java的同学们一头雾水,我深有感触呀!

小明的博客 3092

String a="abc"和String b=new String("abc")的区别及String相关常用操作

在讨论两者区别之前我们先明确.equals()和==的区别   String a = "abc";   String b = new String("abc");   String c = "abc";   String d = new String("abc");   System.out.println(a==b);   System.out.println(a==c);

qq_24558789的博客 6399

关于String a="abc" ;和String b= new String("abc")的区别

今天又遇到了关于String a=“abc”,String a = new String(“abc”)类型的题目 public class StringTest { public static void main(String[] args) { String a = "test"; String b = "test"; String c...

weixin_44692028的博客 626

String s1 = new String("abc"); String s2 = ("abc");

String s1 = "abc"; String s2 = "abc"; System.out.println(s1==s2);             //true System.out.println(s1.equals(s2)); //true   System.out.println("============================"); String s

你只管努力, 7878

java中String s="abc"及String s=new String("abc")详解

java中String s="abc"及String s=new String("abc")详解 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据...

zhupengqq的博客 480
上一篇: 基本数据结构:链表(list)
下一篇: log4j2的配置使用
JJ_wang
博客等级 码龄14年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值