首页 | 互联网 | IT动态 | Cisco | Windows | Linux | Java | .Net | Oracle | 华为 | 存储世界 | 服务器 | 网络设备 | IDC | 安全 | 求职招聘
IT培训 | 数字网校 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 解决方案 | 直播室 | 虚拟考场 | 搜索 | 博客 | 沙龙 | 论坛
中国IT实验室Linux频道
中国IT教育
 
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 新手入门 >> 基础入门 >> 文章正文

Java堆和栈与StringBuilder效率探究

文章来源中国IT实验室收集整理 作者佚名 更新时间2008-5-12 保存本文保存本文 推荐给好友推荐给好友 收藏本页收藏本页

对象的创建(即内存的分配 )

Thinking in Java中详细介绍了当程序运行的时候,具体的内存分配。

可以分为寄存器、堆栈、堆、常量存储、非RAM存储

下面具体分析一下java中的堆和栈

1、两者比较

1). 栈(stack)与堆(heap)都是Java用来在RAM中存放数据的地方。

栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。

2). Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.

2、String处理

String str = "abc";和String str = new String("abc");和char[] c = {'a','b','c'};String str=new String(c);都采用堆存储

String str = "abc";在栈中如果没有存放值为"abc"的地址,等同于:
String temp=new String("abc");
String str=temp;

1). 关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:先定义一个名为str的对String类的对象引用变量:String str;

2). 在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符 串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。

3). 将str指向对象o的地址。

使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

char[] c = {'a','b','c'};String str=new String(c);
等同于

String str = new String('a'+'b'+'c'); 

1、

class Test {
public static void main(String[] args) {
String s = "123";
}

}


Runtime Heap Summary: Test
==========================

Runtime Instance List
---------------------

Packag    Class              Count      Cumulative     Count      Memory  Cumulative     Memory

Total                2 (100.0%)       2 (100.0%)        48 (100.0%)       48 (100.0%)
String      1  (50.0%)       1  (50.0%)        24  (50.0%)       24  (50.0%)
char[ ]      1  (50.0%)       1  (50.0%)       24  (50.0%)       24  (50.0%)

 

结论:String s = "123",会创建一个"123"字符数组和一个String对象。

2、

class Test {
public static void main(String[] args) {
String s = new String("123");

}

}


Runtime Heap Summary: Test
==========================

Runtime Instance List
---------------------

Package      Class       Count       Cumulative Count      Memory       Cumulative Memory
-------      -----       -----       ----------------      ------       -----------------
Total      3 (100.0%)       3 (100.0%)       72 (100.0%)       72 (100.0%)
java.lang    String     2  (66.7%)       2  (66.7%)       48  (66.7%)       48  (66.7%)
char[ ]    1  (33.3%)       1  (33.3%)       24  (33.3%)       24  (33.3%)

结论:String s = new String("123");根据上面的测试可以看出,"123"创建了一个数组,一个String对象,而new String()又根据"123"对象作为参数,重新生成了一个新的String对象,此对象被s变量引用。

[1] [2] [3] 下一页  

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题
 ·展现C#世界 C#程序设计专题
 ·Java入门 Tomcat的配置技巧精华专题
 ·Oracle RMAN物理备份技术详解
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航