云端飘 String s=new String(abc)创建了几个对象?
转自:http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
————————————————————————————————————————
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的构造器:
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):用于存储对象
转载于:https://www.cnblogs.com/kaikailele/p/3931053.html
云端飘 String s=new String(abc)创建了几个对象?相关推荐
- String str = new String(abc)创建了几个对象?结合源码解析
String str = new String("abc")创建了几个对象?结合源码解析 首先,我们看一下jdk源码: 1 /** 2 * Initializes a newly ...
- String s=new String(abc)创建了2个对象的原因
问题:String str=new String("abc"); 这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个. 接下来我们就从这 ...
- new string(abc)创建了几个对象_面试题系列第2篇:new String()创建几个对象?有你不知道的...
Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注[程序新视界].本篇为面试题系列第2篇. 常见面试问题 下面代码中创建了 ...
- Java:面试题:String s=new String(abc)创建了几个对象?
String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...
- string s = new string(“xyz“);创建了几个对象_「005」-JavaSE面试题(五):String类
第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [005] - JavaSE面试题(五):String类 第1问:String.StringBuf ...
- 创建和编辑AutoCAD对象(VBApython)
创建python与CAD的连接 import win32com.client import pythoncomacad = win32com.client.Dispatch("AutoCAD ...
- java中字符串的创建_【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- String str =new String(“abc“)和 String str = “abc“的比较
String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...
- 请别再拿“String s = new String(xyz);创建了多少个String实例”来面试了吧---转
http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太 ...
最新文章
- JavaScript 同时建立多个websocket连接
- 设置 mock_【学习】接口测试-使用mock生产随机数据
- mysql职业要求_为什么面试的每一家都要求掌握MySQL?
- DigSci科学数据挖掘大赛:如何在3天内拿下DigSci亚军
- mq多个消费者消费一个消息_一个普通消费者的米家产品使用感受
- 垃圾分类毕设java程序_垃圾“拍一拍”,分类不用愁!生活垃圾分类查询小程序上线啦...
- jQuery迷你帮助查找功能
- SQL Server 阻塞原因分析
- java使用poi读取存储excel表格,包括xls和xlsx格式
- net configuration assistant 没反应_@尾款人:错过这条推送,7000多块就没了……
- HPZ420 工作站主板图
- uni-app通过canvas将两张图片合成一张图片
- 原win7系统迁移到SSD固态硬盘
- WIN2003 R2安装EPSON6200L打印机问题解决
- 无人机测量在房地一体项目中的应用
- 我读《格鲁夫给经理人的第一课》
- 苹果和android充电线一根,非常实用!一根充电线,同时搞定苹果、安卓、Type-c,出门带它就够了...
- vmware虚拟机安装win7_vmware虚拟机中安装mac Catalina10.15
- 孩子立刻就不玩游戏了,因为他找到更好玩的东西!
- Windows 10, version 22H2 (updated March 2023) 简体中文版、英文版下载
热门文章
- 大龄屌丝自学笔记--Java零基础到菜鸟--001
- CABasicAnimation 动画组合
- java.lang.IllegalArgumentException: Path index does not start with a / character
- DELPHI第三方控件及组件大全(安装方法与使用)
- Castle.ActiveRecord的嵌套事务处理
- 几u产品结构计算机什么意思,计算机u系统组成.ppt
- jquery easyui datagrid 分页 详解
- DPDK pmd驱动初始化(十九)
- html 流动效果,html5 canvas流动的海浪特效
- 常见算子使用_spark快速入门(二)spark粗略流程简述及常见名词解释