String s=new String("abc")共生成几个对象?

非原创作品

如题;

回答:

生成了两个对象。

2个字符串对象,全部在堆中,只是创建时间不同。

一个叫inner String对象——对应于常量池中的字符串字面值,这个对象在第一次常量池解析的时候就已经创建,至于常量池解析在什么时候发生,不同的虚拟机实现不同,有的在类静态变量初始化之前,有的在执行方法指令时同时边解析边执行。常量池解析之后会存储指向这个堆中对象的引用

一个是new指令创建的String对象。在执行new指令的时候在堆中创建的。


String a="abc";      //创建了一个对象

String a="ab"+"cd";   //创建了三个对象
"ab"和"cd"分别创建了一个对象,它们经过“+”连接后又创建了一个对象"abcd",因此一共三个,并且它们都被保存在字符串池里了。 


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


测试:

public class StringObject {
	String str = new String("abc");
}


反编译类文件 : javap -c StringObject

Compiled from "StringObject.java"
public class com.unison.test.StringObject extends java.lang.Object{
java.lang.String str;

public com.unison.test.StringObject();
  Code:
   0:	aload_0
   1:	invokespecial	#10; //Method java/lang/Object."<init>":()V
   4:	aload_0
   5:	new	#12; //class java/lang/String
   8:	dup
   9:	ldc	#14; //String abc
   11:	invokespecial	#16; //Method java/lang/String."<init>":(Ljava/lang/String;)V
   14:	putfield	#19; //Field str:Ljava/lang/String;
   17:	return

}

附录

反汇编器-javap

  javap命令反汇编一个java字节代码文件, 返回有关可变部分和成员函数的信息,其命令行如下:

   C:\>javap options classname additionalClasses

  javap的标准输出是公有变量和类的成员函数。javap反汇编器的命令行选项如下表:

选项 功能
-h 此选项将建立能够放入C头文件中的信息
-p 此选项将使javap输出私有和公有的成员函数和变量
-c 此选项将使javap为各成员函数输出实际已编译过的字节代码
-classpath path 此选项将使得javap在路径path中寻找Java类
-v 输出所有的信息
-verify 运行校验器以验证并显示出调试信息
-version 输出javap的版本信息

 此段文字摘自:http://www.it315.org/articles/Java/java4.htm



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值