- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA面試题解惑系列(二)到底创建了几个String对象-JAVA程序员JAVA工程师面试必看
-JAVA程序员JAVA工程师面试必看
JAVA面试题解惑系列(二)——到底创建了几个String对象?
关键字: java 面试题 string 创建几个对象
作者:臧圩人(zangweiren) 网址: 转载请注明出处! 我们首先来看一段代码:
Java代码
String?str=new?String(abc);??
String str=new String(abc);
紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。 我们可以把上面这行代码分成String str、=、abc和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String(abc)了。那么,new String(abc)为什么又能被看成abc和new String()呢?我们来看一下被我们调用了的String的构造器:
Java代码
public?String(String?original)?{ ??
????//other?code?... ??
}??
public String(String original) {
//other code ...
}
大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:
使用new创建对象。
调用Class类的newInstance方法,利用反射机制创建对象。
我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是abc。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。 这种方式是String特有的,并且它与new的方式存在很大区别。
Java代码
String?str=abc;??
String str=abc;
毫无疑问,这行代码创建了一个String对象。
Java代码
String?a=abc; ??
String?b=abc;??
String a=abc;
String b=abc;
那这里呢?答案还是一个。
Java代码
String?a=ab+cd;??
String a=ab+cd;
再看看这里呢?答案仍是一个。有点奇怪吗?说到这里,我们就需要引入对字符串池相关知识的回顾了。 在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。 我们再回头看看String a=abc;,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为abc的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。 对于第三个例子:
Java代码
String?a=ab+cd;??
String a=ab+cd;
由于常量的值在编译的时候就被确定了。在这里,ab和cd都是常量,因此变量a的值在编译时就可以确定。这行代码编译后的效果等同于:
Java代码
String?a=abcd;??
String a=abcd;
因此这里只创建了一个对象abcd,并且它被保存在字符串池里了。 现在问题又来了,是不是所有经过“+”连接后得到的字符串都会被添加到字符串池中呢?我们都知道“==”可以用来比较两个变量,它有以下两种情况:
如果比较的是两个基本类型(char,byte,short,int,long,float,double,boolean),则是判断它们的值是否相等。
如果表较的是两个对象变量,则是判断它们的引用是否指向同一个对象。
下面我们就用“==”来做几个测试。为了便于说明,我们把指向字符串池中已经存在的对象也视为该对象被加入了字符串池:
Java代码
public?class?StringTest?{
您可能关注的文档
- ISO9000族標准及质量管理体系知识问答.doc
- ISO9000認证标准表格2010版.doc
- ISO9000質量体系培训教材.doc
- ISO9001-2008審核员考试题库.doc
- ISO90012000基礎知识培训.doc
- ISO9001培訓教材.doc
- ISO9001標准在路桥管理组织质量管理中的应用.doc
- ISO9001物管部工作手冊.doc
- ISOTS16949國际汽车工业质量体系技规范介绍.doc
- ISOTS16949管理體系在公司运行情况总结.doc
- 贵州贵州省建设投资集团有限公司招聘考试真题附答案详解(研优卷).docx
- 河南南阳师范学院2021年招聘25名硕士研究生冲刺卷一(附答案与详解)及答案详解(名校卷).docx
- 陕西延长石油 (集团) 有限责任公司 所属单位招聘笔试题库及答案详解(必刷).docx
- 贵州民航产业集团有限公司招聘笔试题库含答案详解(基础题).docx
- 广汉市2025年公开招聘社区专职工作者(125人)考试备考题库含答案详解(考试直接用).docx
- 邢台市水务发展集团有限公司招聘真题附答案详解(实用).docx
- 新华保险总部人力资源部(党委组织部)招聘笔试题库含答案详解(预热题).docx
- 贵州苔茶产业发展集团有限公司招聘笔试题库含答案详解(b卷).docx
- 广汉市2025年公开招聘社区专职工作者(125人)考试备考题库附答案详解(综合题).docx
- 贵州城乡产业发展集团有限公司招聘笔试题库附答案详解(实用).docx
最近下载
- 《研学旅行指导师实务》课件——第2章 研学旅行指导师职业道德与素质.pptx VIP
- 工业特种设备安全 作者 蒋军成 第二章 锅炉.pptx VIP
- 《研学旅行指导师实务》课件——第7章 研学旅行安全管理.pptx VIP
- 【人教版】2025-2026学年三年级数学上册教学计划(及进度表).docx VIP
- 《研学旅行指导师实务》课件——第4章 研学旅行操作流程.pptx VIP
- 2024-2025学年新七年级英语上册Unit1《This+is+me!+》课本笔记(译林版).pdf VIP
- 2024废品收购合同范本.docx VIP
- 《研学旅行指导师实务》课件——第3章 研学旅行课程设计.pptx VIP
- 登高作业安全事故的应急预案.docx VIP
- 《研学旅行指导师实务》课件——第6章 基(营)地研学课程操作.pptx VIP
文档评论(0)