本文大部分内容来源于《深入JAVA虚拟机》
java笔试题中,出现频率较高的一道题:String str = new String("str");String str2 = "str";产生了几个对象?我告诉你有0个,你信么?这道题解释起来比较费劲,咱们从根源说起先。
1、虚拟机内存模型
人们常说jvm分为堆区和栈区,这是比较粗的分发,实际的情况参照上图。和本道面试题有关的区域有:虚机栈、堆区、方法区、运行时常量池。
虚拟机栈:
这就是大家常说的栈区,是线程私有的,生命周期和线程相同。虚拟机栈描述的是java方法执行的内存模型:方法执行时同时创建一个栈帧(stack frame)用于存储局部变量表、操作栈、动态链接、方法出口。方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈道出栈的过程。
堆区:
此区域的唯一功能就是存放对象实例。几乎所有的对象实例都是在这里分配的。虚拟机规范中的描述:所有的对象实例和数组都要在堆上分配。但是随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术导致了一些微妙的变化,所有的对象都分配在堆上也逐渐变得不是那么“绝对”的了。
方法区:
存储已被jvm加载的类信息、常量、静态变量、即时编译器编译后的代码数据
运行时常量池:
运行时常量池(Runtime Constant Pool)是方法区的一部分
2、到底产生几个对象
看String str = new String("str"),String str这部分将反映到java栈的本地变量表中作为一个reference,而new String("str")将会在堆区分配内存,同时检查该实例的值("str")是否存在于运行时常量池,不存在则在运行时常量池创建该字串值。
再看接下来的这句String str2 = "str",String str2在栈区创建一个refrence,没有new,也就是没有对象实例在堆区分配,而在运行时常量池中存在"str",则无需创建新的值
返回来再看这两句到底创建的多少东西,在栈区2个 reference、堆区1个String的实例、方法区内运行时常量池中1个字串值"str"。很遗憾,这些东西里面没有一样是称作为“对象”的,因为在堆区的那个叫String对象的实例,所以说这两句共创建了0个对象。卧槽,0个对象是啥意思,意思就是说:出笔试题的人太挫了,基本概念都搞不懂,瞎出题,害的做题人看不懂题。
哈,开个玩笑,真的做题的时候,可别写0个对象,可是我真的不知道该回答几个
相关推荐
在某次讨论会上,开发团队正围绕着打怪功能中的一个特定功能点展开讨论。 ##### 1.2 实习生小李的实现方式 小李是一名热衷于游戏开发的实习生。他认为可以通过将武器设置为角色的一个属性成员来实现不同的攻击效果...
开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...
14.Function:js中一切都是对象,连方法都是1个对象!! 笔试题:js中方法定义集中方式: A:function compare(a,b){return a-b;}---*可以任意地方声明方法* B:var compare=function(a,b){return a-b;} ---| --...
面向对象设计中有几个重要的原则,旨在帮助开发者编写更高质量的代码: 1. **单一职责原则**:一个类应该只有一个引起它改变的原因。这有助于降低类之间的耦合度,提高代码的可维护性。 2. **开放封闭原则**:软件...
创建了几个String Object? - 在这段代码中,实际上创建了两个`String`对象: - 第一个是在字符串常量池中创建的字符串"xyz"。 - 第二个是通过`new String("xyz")`显式创建的新对象。 #### 十、Math.round(11.5)...
第二十九,两个对象值相同(x.equals(y) == true),但hash code可以不同,因为不同的对象可能有相同的值,但哈希码不一定相同。 第三十,对象作为参数传递时,Java总是按值传递。但对象的引用是按值传递的,这意味...
创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中...
这里没有创建新的`String`对象,而是两个引用变量`string`和`s`共同指向同一个对象。 #### 问题二:“==”与`equals`方法的区别 在Java中,“==”操作符用于比较两个变量的值是否相等。对于基本数据类型,如`int`...
以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。 sample2: 利用For命令来实现对一台目标Win2k主机的暴力密码破解。 我们用net use \ipipc$ "password" /u:"administrator"来尝试这...
下去,浓淡几个叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面这些描述其实都是一种模式,创建模式的人是大师,但是拘泥于模式的人永远是工匠. 再回到传统建筑中,中国的传统建筑是过分...
根据给定文件的信息,我们可以总结出以下几个重要的知识点: ### 1. 事件触发顺序 - **知识点**: 在创建和加载窗体时,首先被触发的事件是`Load`事件。 - **解释**: 当应用程序加载窗体时,系统首先会触发`Load`...
根据提供的文档内容,我们可以总结和扩展出以下几个关键的IT知识点: ### 1. 文件传输协议(FTP) **知识点概述:** FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的应用层协议。它允许用户在一个...
- **示例**: 提供几个使用tmake的示例。 **The progen Utility** - **概述**: progen工具的功能和用途。 - **使用**: 如何使用progen来生成.tmk文件。 **高级主题** - **条件设置**: 如何根据不同的条件生成不同的...
根据提供的文档内容,我们可以归纳总结出以下几个重要的知识点: ### 1. 数据库备份命令 - **mysqldump**:这是MySQL中用于备份数据库的命令。它可以用来导出整个数据库或者部分表的数据到一个SQL文件中,便于日后...
创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。 数组有没有length()这个方法?String呢? 答:数组里面没有length()方法,而是length属性。String有length()这个方法...
1. 创建了一个SparkSession,这是Spark 2.0之后的入口点,包含了Hive的功能。 2. 设置了应用名称和Master地址。`local[*]`表示在本地模式运行,所有任务都在当前JVM中执行。 3. 使用隐式转换将DataFrame操作导入,...
#### 28、Redis事务相关的命令有哪几个? - `MULTI`:开启一个事务块。 - `EXEC`:执行所有事务块内的命令。 - `DISCARD`:取消当前事务块。 - `WATCH`:监视一个或多个键。 #### 29、Rediskey的过期时间和永久...
这通常涉及以下几个方面: 1. **数据库配置**:确保MySQL数据库和表的字符集支持中文,例如设置为`utf8`或`utf8mb4`。可以在创建数据库和表时指定,或者事后更改。 2. **连接字符串**:在连接URL中加入字符集参数...
// =1 // =-1 // =0.6 // =-1.2 经常用模数运算符来判断整数为奇数(=1)或偶数(=0) 。 循环 无条件循环 int sum,x; sum=0; for(x=1;x;x++) { sum+=x; } 有条件循环 private void button1_Click(object sender, ...
这个对象将被用来处理输入输出操作。 6. **输出标题**:`io.outln("Ϊ˷");` - 使用`io.outln`方法输出了一行文字“Ϊ˷”。这可能是作者的占位符或者是为了美观而添加的。 7. **外层循环**:`for (int i = 1; i ...