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

栈与堆,String和StringBuffer(一) <转>

    博客分类:
  • java
阅读更多
原文:[url]http://blog.csdn.net/MyDream83/archive/2007/04/15/1565463.aspx [/url]
最近读了一篇文章 -- 《提高String和StringBuffer性能的技巧》, 感觉不错,绝定记录一下顺便写点感受,既然是性能,一般都是内存方面的考虑,说到内存得先说说java中的栈与堆。

        java在内存中用来存放数据的分为栈(stack)和堆(heap),java自行管理,栈内存的特点是存取速度快,仅次于直接位于CPU中的寄存器,但栈中的数据大小与生存期必须是确定的,缺乏灵活性。而堆可以动态地分配内存大小,生命存期也不必事先声明,但正因为它动态分配内存的特性会使得存取速度慢。

        java中所有数据都是存放在栈与堆中,java基本数据类型共有8种,定义方式: int  a = 3; 这里a称为自动变量,自动变量里存放的是字面值,也就是说这里3是字面值,a指向3,字面值数据是大小可知,生命周期可知,所以它是存放在栈内存中的。

        栈中还有个特性就是数据共享,在栈中所有的数据都可被共享。int  a  = 3; int  b = 3; 这句代码会首先在栈中创建一个变量a,然后会先在栈内存中查找为3的字面值, 若找到 便将a指向它,若未找到则开辟一个内存区存放3,再将a指向它。所以这两句代码执行完后,会在栈内存中创建两个变量a和b,但只创建一个为3的字面值,a和b都指向它。

         java还有一种类型 -- 类类型,就拿int对应的封装类(Integer)来说,类类型使用前必须实例化,一般通过new()来显示的创建,准确的说类对象的创建是在运行时根据需要来动态创建的,特性是比较灵活,但要占用更多的时间,至于什么是运行时,在后面会有个介绍。在JDK 5.0中及以后的版本,都可以这样 Integer i = 3; 因为在后台编译器会转换成Integer  i = new Integer(3);

         值得一提的是:

         int  a  = 3;    int  b   =3 ;

         Integer  i  = new Integer(3);    Integer j  = new Integer(3);

        这两种的差别,刚才说了第一行的代码会在栈中创建两个变量a和b,创建一个字面值3,a和b指向3,下一行的代码会在栈中创建两个对象引用i和j,同时会在堆中创建两个对象(虽然),i和j分别指向这两个对象,可见堆内存中数据不是共享的。

         若是把Integer  i  = new Integer(3);    Integer j  = new Integer(3); 换成Integer i = new Integer(3); Integer j = i;  这种情况则是在栈中创建两个对象引用,在堆中创建一个对象new Integer(3),i和j同时指向这个对象,这种多个引用同时指向同一个内存地址的情况和上面的java基本类型的情况咋一看是相同的,但其实不然,看下面代码

        int  a = 3;  int  b  = 3;    这时a和b指向的是同一个3,若此时将a  = 4; b是不会改变值,将a的值改变成4,会在栈内存中重新查找字面值为4的地址,找到后将a指向4,若为找到则开辟一个内存区来存放4,所以刚开始a和b同时指向一个字面值,它与类类型不同,其中一个变量改变另一个不受影响。

        而类类型则不同,Integer这个类型不太好说明,比如说有个学生类class  Student,

       Student  s1 = new Student();

       Student  s2 =  s1 ;  这里s1和s2是指向同一个对象,可以说是同一个学生,若改变这个学生的任何一个属性,s1和s2都会发生改变。这就是类类型与基本类型不同的地方。

        String这个类型比较特殊,因为它可以通过String str = new String("abc"); 和 String str = "abc"; 两种方式来创建,String str = new String("abc"); 这句与上面说的类类型的是一样,而这句String str = "abc"; 则与基本类型是一样的,这里的"abc"会存放在栈中的唯一字符串池,所以从性能上说后者优于前者。

        在堆内存中也可以实现类似栈中的这种数据共享,String.intern() 这个方法的使用,

String str = new String("abc"); 这样一句话是在堆中创建一个"abc"的对象,它根本不用去管堆中是否有已经叫"abc"的对象,  若在后面加上一句String.intern();  则会先检查字符串对象是否存在,若存在则将引用指向它,不存在时才创建,有点像基本类型,那么下面那种的性能如何呢?

        String  str  =  "abc";    //栈中的读取速度最快,性能最佳

        String  str  = new Stirng("abc");  str = str.intern();    //检查了对象是否存在,避免了创建相同值的重复对象,但毕竟还在堆中操作,性能其次。

        String  str  = new String("abc");   //不多说了, 性能最次。

        先写到这。。。。
分享到:
评论

相关推荐

    AIC的Java课程1-6章

    第3版 机械工业出版社&lt;br&gt; 教学内容和要求&lt;br&gt;知识点 重要程度 使用频度 难度&lt;br&gt;Java 入门 高 中 易&lt;br&gt;变量和运算符 高 高 中&lt;br&gt;控制...&lt;br&gt;IO和串行化 高 中 难&lt;br&gt;知识点 重要程度 使用频度 难度&lt;br&gt;&lt;br&gt;第1章...

    Java中String和StringBuffer的区别.doc

    在Java编程语言中,String和StringBuffer是两个重要的类,它们在处理文本数据时有着显著的区别。String类代表不可变的字符序列,一旦创建,其值就不能改变。这意味着每次对String对象进行修改(如拼接操作)都会创建...

    区别Java中堆与栈区别Java中堆与栈

    Java 中堆与栈的区别 Java 中的堆和栈是两个不同的内存区域,分别用于存放不同类型的数据。堆是一个运行时数据区,类的对象从中分配空间,通过new、newarray、anewarray 和 multianewarray 等指令建立,垃圾回收器...

    Java堆和栈的区别

    "Java 堆和栈的区别" Java 堆和栈是 Java 中的两种内存管理机制,它们都是 Java 用来在 RAM 中存放数据的地方。但是,它们有很多不同之处。 Java 堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new、...

    浅谈java中String与StringBuffer的不同

    Java中的String和StringBuffer是两种常用的字符串处理类,它们各自有着独特的特性和适用场景。String在内存中存储于栈中,通常被视为不可变对象,这意味着一旦创建,其内容就不能更改,每次试图修改String对象时,...

    Java机制下的栈和堆.pdf

    Java编程语言中,内存管理是其核心特性之一,主要分为栈内存和堆内存两部分。栈内存主要存储基本类型变量(如int, double等)和对象的引用,而堆内存则用于存储由new关键字创建的对象和数组。 栈内存的工作原理类似...

    Java中堆和栈的区别

    Java中的堆和栈是两种不同的内存区域,它们在程序运行时承担着不同的职责。栈主要用于存储基本类型变量和对象的引用,而堆则用于存储对象实例。了解它们的区别对于优化程序性能至关重要。 栈(Stack): 1. 栈是...

    java内存分配和String类型的深度解析Java开发J

    Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。栈用于存储基本类型变量和对象引用,每个线程都有自己的独立栈空间。当创建一个方法时,栈会为该方法分配一块内存,用于存储局部变量。...

    String对象的内存分析

    本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...

    Java经典常识,绝对经典的常识,有堆栈问题,String。。。类,接口 算法。。。。

    1. **堆与栈**:在Java中,内存分为堆内存(Heap)和栈内存(Stack)。栈主要用于存储基本类型变量和对象引用,执行速度快,但容量有限。堆则用于存储对象实例,它的大小可动态扩展,但访问速度相对较慢。理解它们的...

    我们一起学Java之String

    Java中的String类是一个重要的数据类型,用于存储和操作字符串数据。String类的特点是不可变性,也就是说,一旦String对象被创建,其值就无法改变。这一特性对于Java内存管理有着重要影响,因为String对象会存储在...

    java中堆和栈的区别分析

    在Java编程语言中,堆和栈是两种主要的内存区域,它们各自有不同的功能和特点。了解它们的区别对于优化程序性能和避免内存泄漏至关重要。 **堆(Heap)** 堆是Java运行时数据区的一部分,主要用于存储对象实例。当...

    Java初级开发技术面试题.docx

    其面试题涵盖了多个方面,本文将从 String 和 StringBuffer、StringBuilder 的区别、Java 的堆、栈、方法区、==、toString 方法和 equals 方法、ArrayList 和 LinkedList 的区别、Http 协议与 TCP 协议的简单理解等...

    Java工程师必会100题

    方法区用于存储类信息,堆用于存储对象实例,虚拟机栈用于存储方法调用和局部变量,本地方法栈用于存储非Java方法信息,程序计数器用于记录当前线程执行的指令地址。 4. ==与equals的区别 ==是一个运算符,用于...

    Java 应届生面试题

    * 基本数据类型和引用类型的区别:基本数据类型是分配在栈上的,而引用类型是分配在堆上的。 二、面向对象的特征 * 封装:方便调用类库里面已经写好的函数。 * 继承:方便对已有函数的功能进行直接调用和扩展。 * ...

    面试-Java基本知识点1

    例如,ArrayList&lt;E&gt;中的E就是泛型参数。 6. 反射 反射允许程序在运行时动态地获取类的信息(如类名、方法名、属性等)并调用。它是Java强大功能的体现,但使用不当可能引发安全问题。 7. 代理 Java代理包括静态...

    Java面试题一站式全收录

    * new String("A"):如果常量池中没有 “A”,就会走上面相同的流程,先创建 “A”,然后在堆中创建一个 String 对象,它的值共享栈中已有的 char 值 “A”。 equals 和 == 的区别 equals 和 == 都是比较对象的...

Global site tag (gtag.js) - Google Analytics