- 浏览: 1376491 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (551)
- 计划 (4)
- java (115)
- oracle (60)
- ajax (3)
- javascript (64)
- 计算机操作技巧集 (11)
- 近期关注话题 (10)
- 随想 (13)
- html (6)
- struts (15)
- hibernate (16)
- spring (2)
- game (0)
- Eglish (10)
- DisplayTag (6)
- jsp (18)
- css (3)
- eclipse (3)
- 其他知识 (8)
- 备用1 (12)
- 备用2 (1)
- 笑话-放松心情 (9)
- 设计 (1)
- 设计模式 (1)
- 数据结构 (0)
- office办公软件 (5)
- webwork (0)
- tomcat (2)
- MySql (1)
- 我的链接资源 (5)
- xml (2)
- servlet (0)
- PHP (13)
- DOM (0)
- 网页画图vml,canvas (1)
- 协议 (2)
- 健康 (3)
- 书籍下载 (1)
- jbpm (1)
- EXT (1)
- 自考 (2)
- 报表 (4)
- 生活 (64)
- 操作系统基础知识 (2)
- 测试 (2)
- guice (1)
- google学习 (2)
- Erlang (1)
- LOG4J (2)
- wicket (1)
- 考研 (1)
- 法律 (1)
- 地震 (1)
- 易学-等等相关 (1)
- 音乐 (1)
- 建站 (4)
- 分享说 (3)
- 购物省钱 (0)
- linux (1)
最新评论
-
zenmshuo:
如果使用SpreadJS这一类的表格工具,应该能更好的实现这些 ...
js中excel的用法 -
hjhj2991708:
第一个已经使用不了
jar包查询网站 非常好用! -
jiangmeiwei:
...
中文乱码 我的总结 不断更新 -
gary_bu:
...
response.sendRedirect 中文乱码问题解决 -
hnez:
多谢指点,怎么调试也不通,原来我在<body>&l ...
ExtJs IE ownerDocument.createRange() 错误解决方案
原文:[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"); //不多说了, 性能最次。
先写到这。。。。
最近读了一篇文章 -- 《提高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"); //不多说了, 性能最次。
先写到这。。。。
发表评论
-
TilesRequestProcessor - Tiles definition factory found for request processor ''
2011-11-03 15:39 2511TilesRequestProcessor - T ... -
jar包查询网站 非常好用!
2009-12-28 11:47 13409java jar包查询 根据类查询所在的java包 http ... -
tomcat 启动错误 java.lang.UnsupportedClassVersionError: Bad version number in .class
2009-11-27 08:53 2267请访问http://ddgrow.com/bad-versio ... -
arrayToString
2009-04-07 09:01 1429原文:http://leepoint.net/notes-ja ... -
native2ascii
2009-04-02 12:00 1204D:\>native2ascii 中国 \u4e2d\u ... -
java swing 架构
2009-03-04 15:03 2354下面是偶尔找到的一篇 相当好的文章 ,针对 java swin ... -
红帽企业5序列号
2009-02-27 09:11 2558这是从[url]http://www.21codes.com/ ... -
中文乱码 我的总结 不断更新
2009-02-23 09:51 2315java中文乱码问题 1、jsp中文乱码 <0& ... -
websphere 数据库连接
2009-02-19 17:47 2146问个问题: 应用服务器: websphere 连接池:pr ... -
打开java控制台的方法
2009-02-10 17:10 3073D:\Program Files\Java\jre6\bin\ ... -
log4j weblogic 问题
2009-01-21 15:08 1962问题是这样的 最初在tomcat5.5下面开发,使用了log ... -
log4j weblogic 问题
2009-01-21 15:07 0问题是这样的 最初在tomcat5.5下面开发,使用了log ... -
java.lang.NoClassDefFoundError in quartz
2008-12-24 15:35 2937quartz-1.5.2.jar tomcat5.5 当使 ... -
java 得到运行时系统中的内存信息
2008-12-19 20:54 1542这个在tomcat下面使用过,在引记录下来,以后方便查找 Ru ... -
log4j
2008-12-13 11:32 909讲解了用xml配置,还有例子,以及对 levelmin lev ... -
servlet 2.3 规范
2008-12-02 20:55 0servlet 2.3 规范 http://www.orio ... -
session 问题
2008-11-26 16:41 1015问个问题,如下: 我要在一个A系统中,通过一个弹出窗口,超链接 ... -
java 反编译工具
2008-10-08 11:03 2006从哪找到的给忘了,用起来不错,放在这里,以后找起来方便 ,有需 ... -
thinking in java 读书笔记
2008-10-06 22:09 1353记录下来,以便以后查看 thinking in java 4t ... -
RSA 算法 java版本<转>
2008-09-23 18:28 2432原文地址:http://www.cs.princeton.ed ...
相关推荐
第3版 机械工业出版社<br> 教学内容和要求<br>知识点 重要程度 使用频度 难度<br>Java 入门 高 中 易<br>变量和运算符 高 高 中<br>控制...<br>IO和串行化 高 中 难<br>知识点 重要程度 使用频度 难度<br><br>第1章...
在Java编程语言中,String和StringBuffer是两个重要的类,它们在处理文本数据时有着显著的区别。String类代表不可变的字符序列,一旦创建,其值就不能改变。这意味着每次对String对象进行修改(如拼接操作)都会创建...
"Java 堆和栈的区别" Java 堆和栈是 Java 中的两种内存管理机制,它们都是 Java 用来在 RAM 中存放数据的地方。但是,它们有很多不同之处。 Java 堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new、...
Java 中堆与栈的区别 Java 中的堆和栈是两个不同的内存区域,分别用于存放不同类型的数据。堆是一个运行时数据区,类的对象从中分配空间,通过new、newarray、anewarray 和 multianewarray 等指令建立,垃圾回收器...
Java中的String和StringBuffer是两种常用的字符串处理类,它们各自有着独特的特性和适用场景。String在内存中存储于栈中,通常被视为不可变对象,这意味着一旦创建,其内容就不能更改,每次试图修改String对象时,...
Java编程语言中,内存管理是其核心特性之一,主要分为栈内存和堆内存两部分。栈内存主要存储基本类型变量(如int, double等)和对象的引用,而堆内存则用于存储由new关键字创建的对象和数组。 栈内存的工作原理类似...
Java中的堆和栈是两种不同的内存区域,它们在程序运行时承担着不同的职责。栈主要用于存储基本类型变量和对象的引用,而堆则用于存储对象实例。了解它们的区别对于优化程序性能至关重要。 栈(Stack): 1. 栈是...
Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。栈用于存储基本类型变量和对象引用,每个线程都有自己的独立栈空间。当创建一个方法时,栈会为该方法分配一块内存,用于存储局部变量。...
本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...
1. **堆与栈**:在Java中,内存分为堆内存(Heap)和栈内存(Stack)。栈主要用于存储基本类型变量和对象引用,执行速度快,但容量有限。堆则用于存储对象实例,它的大小可动态扩展,但访问速度相对较慢。理解它们的...
Java中的String类是一个重要的数据类型,用于存储和操作字符串数据。String类的特点是不可变性,也就是说,一旦String对象被创建,其值就无法改变。这一特性对于Java内存管理有着重要影响,因为String对象会存储在...
在Java编程语言中,堆和栈是两种主要的内存区域,它们各自有不同的功能和特点。了解它们的区别对于优化程序性能和避免内存泄漏至关重要。 **堆(Heap)** 堆是Java运行时数据区的一部分,主要用于存储对象实例。当...
其面试题涵盖了多个方面,本文将从 String 和 StringBuffer、StringBuilder 的区别、Java 的堆、栈、方法区、==、toString 方法和 equals 方法、ArrayList 和 LinkedList 的区别、Http 协议与 TCP 协议的简单理解等...
方法区用于存储类信息,堆用于存储对象实例,虚拟机栈用于存储方法调用和局部变量,本地方法栈用于存储非Java方法信息,程序计数器用于记录当前线程执行的指令地址。 4. ==与equals的区别 ==是一个运算符,用于...
* 基本数据类型和引用类型的区别:基本数据类型是分配在栈上的,而引用类型是分配在堆上的。 二、面向对象的特征 * 封装:方便调用类库里面已经写好的函数。 * 继承:方便对已有函数的功能进行直接调用和扩展。 * ...
例如,ArrayList<E>中的E就是泛型参数。 6. 反射 反射允许程序在运行时动态地获取类的信息(如类名、方法名、属性等)并调用。它是Java强大功能的体现,但使用不当可能引发安全问题。 7. 代理 Java代理包括静态...
* new String("A"):如果常量池中没有 “A”,就会走上面相同的流程,先创建 “A”,然后在堆中创建一个 String 对象,它的值共享栈中已有的 char 值 “A”。 equals 和 == 的区别 equals 和 == 都是比较对象的...