`
azvf
  • 浏览: 144428 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String那点事儿1--创建了几个对象

阅读更多

本文大部分内容来源于《深入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个对象,可是我真的不知道该回答几个

 

String那点事儿1--创建了几个对象

String那点事儿2--占了多少空间

String那点事儿3--溢出、陷阱、效率、优化 

  • 大小: 64.1 KB
  • 大小: 53.9 KB
  • 大小: 41.7 KB
1
1
分享到:
评论
5 楼 azvf 2013-12-05  
joaboo 写道
LZ不错,先赞个..
不过还可以看下这个帖子,撒加大神说的貌似更详细一点..
http://www.iteye.com/topic/774673


那个帖子很NB。我最痛恨那些搞底层的,写的那么高深,搞得我看完之后感觉自己啥都不懂
4 楼 azvf 2013-12-05  
humsh 写道
实例就不是对象了,楼主还是弄明白再说。



呃,我查了查:对象是类的实例。对象在构造时以类为蓝本,创建对象的过程叫做实例化。感谢。不过,文中就是开个玩笑,弄个噱头,赚点点击率
3 楼 humsh 2013-12-05  
实例就不是对象了,楼主还是弄明白再说。
2 楼 joaboo 2013-12-05  
LZ不错,先赞个..
不过还可以看下这个帖子,撒加大神说的貌似更详细一点..
http://www.iteye.com/topic/774673
1 楼 azvf 2013-12-05  
这么好的帖子,我勒个去,自己up一下

相关推荐

    新版Android开发教程.rar

    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...

    JavaScript笔记

    14.Function:js中一切都是对象,连方法都是1个对象!! 笔试题:js中方法定义集中方式: A:function compare(a,b){return a-b;}---*可以任意地方声明方法* B:var compare=function(a,b){return a-b;} ---| --...

    java面试宝典

    创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中...

    如何编写批处理文件批处理文件批处理文件

    以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。 sample2: 利用For命令来实现对一台目标Win2k主机的暴力密码破解。 我们用net use \ipipc$ "password" /u:"administrator"来尝试这...

    二十三种设计模式【PDF版】

    下去,浓淡几个叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面这些描述其实都是一种模式,创建模式的人是大师,但是拘泥于模式的人永远是工匠. 再回到传统建筑中,中国的传统建筑是过分...

    千方百计笔试题大全

    创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中...

    java面试题

    创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。 数组有没有length()这个方法?String呢? 答:数组里面没有length()方法,而是length属性。String有length()这个方法...

    java基础题 很全面

    创建了几个String Object? 10 23. Java有没有goto? 10 24. 启动一个线程是用run()还是start()? 10 25. 给我一个你最常见到的runtime exception。 10 26. 接口是否可继承接口? 抽象类是否可实现(implements)接口? ...

    C# for CSDN 乱七八糟的看不懂

    // =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, ...

    《你必须知道的495个C语言问题》

    5.9 如果NULL和0作为空指针常量是等价的,那我到底该用哪一个呢? 58 5.10 但是如果NULL的值改变了,比如在使用非零内部空指针的机器上,用NULL(而不是0) 不是更好吗? 58  5.11 我曾经使用过一个编译器,不...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    my2 为我们新建对话框类的另一个对象,但是my2 我们还没有定义,所以 在widget.h 文件中添加相应代码,如下,先加入头文件,再加入my2 的定义语 句,这里我们将其放到private 里,因为一般的函数都放在public 里,而...

    java设计模式CatalogDAOFactory是典型的工厂方法

    如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2. 这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类Sample2A和SampleB2 ...

    c#学习笔记.txt

    例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。结构可以声明构造函数,但它们必须带参数。声明结构的默认(无参数)构造函数是错误的。总是提供默认构造函数以将结构成员初始化为...

    代码语法错误分析工具pclint8.0

    2.将c:\pclint\lnt 下的3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt拷贝至c:\pclint下, 再在安装目录下创建std.lnt和options.lnt两个文件,其中std.lnt的内容如下 // contents of std.lnt c:\pclint\co-msc60...

    C语言程序设计标准教程

    [例10.1]读入文件e10-1.c,在屏幕上输出。 #include main() { FILE *fp; char ch; if((fp=fopen("e10_1.c","rt"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } ch=fgetc(fp); ...

    最新名企标准通用C++面试题,

    缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 优点:循环的效率高 缺点:程序不简洁 4、有关内存的思考题 void GetMemory(char *p) { p = ...

    LINGO软件的学习

    LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。...一个对象列中至多有一个集名,而属性...

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。 ...

    你必须知道的495个C语言问题

    int*array=&realarray[-1];我就可以把“array”当作下标从1 开始的数组。 函数和多维数组 6.18 当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。 6.19 我怎样编写接受编译时宽度未知的二维...

Global site tag (gtag.js) - Google Analytics