- 浏览: 203233 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (159)
- Android (5)
- Unix/Linux (29)
- WEB_Server (7)
- DB (9)
- JavaSE (28)
- Java设计模式 (1)
- WEB_Servlet (2)
- WEB_JSP (3)
- WEB_JS (12)
- WEB_CSS (5)
- WEB_HTML (4)
- Struts 2.x (4)
- Util (9)
- XML (5)
- JSTL (2)
- Flash (1)
- JQuery (1)
- Chart (1)
- Links (1)
- Excel (3)
- bat (2)
- Json (2)
- 博客收藏 (3)
- WEB_数据提取 (1)
- 版本控制 (1)
- HTTP (2)
- TCP/IP (1)
- awk (1)
- Redis (1)
- PHP (2)
最新评论
-
o竹林雨o:
谢啦,楼主,顶
tomcat server.xml 编码修改 -
test_lockxxx:
方法4: 缓冲整个文件 ?
为什么要缓存整个文件?
Buff ...
java io性能分析
String常量池问题的几个例子 下面是几个常见例子的比较分析和理解: String a = "a1"; String b = "a" + 1; System.out.println((a == b)); //result = true String a = "atrue"; String b = "a" + "true"; System.out.println((a == b)); //result = true String a = "a3.4"; String b = "a" + 3.4; System.out.println((a == b)); //result = true 分析:JVM对于字符串常量的"+"号连接,将程序编译期,JVM就将常量字符串的"+"连接优化为连接后的值,拿"a" + 1来说,经编译器优化后在class中就已经是a1。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。 String a = "ab"; String bb = "b"; String b = "a" + bb; System.out.println((a == b)); //result = false 分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。 String a = "ab"; final String bb = "b"; String b = "a" + bb; System.out.println((a == b)); //result = true 分析:和[3]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量 池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。 String a = "ab"; final String bb = getBB(); String b = "a" + bb; System.out.println((a == b)); //result = false private static String getBB() { return "b"; } 分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面 程序的结果为false。 通过上面4个例子可以得出得知: String s = "a" + "b" + "c"; 就等价于String s = "abc"; String a = "a"; String b = "b"; String c = "c"; String s = a + b + c; 这个就不一样了,最终结果等于: StringBuffer temp = new StringBuffer(); temp.append(a).append(b).append(c); String s = temp.toString(); 由上面的分析结果,可就不难推断出String 采用连接运算符(+)效率低下原因分析,形如这样的代码: public class Test { public static void main(String args[]) { String s = null; for(int i = 0; i < 100; i++) { s += "a"; } } } 每做一次 + 就产生个StringBuilder对象,然后append后就扔掉。下次循环再到达时重新产生个StringBuilder对象,然后 append 字符串,如此循环直至结束。如果我们直接采用 StringBuilder 对象进行 append 的话,我们可以节省 N - 1 次创建和销毁对象的时间。所以对于在循环中要进行字符串连接的应用,一般都是用StringBuffer或StringBulider对象来进行 append操作。 String对象的intern方法理解和分析: public class Test4 { private static String a = "ab"; public static void main(String[] args){ String s1 = "a"; String s2 = "b"; String s = s1 + s2; System.out.println(s == a);//false System.out.println(s.intern() == a);//true } } 这里用到Java里面是一个常量池的问题。对于s1+s2操作,其实是在堆里面重新创建了一个新的对象,s保存的是这个新对象在堆空间的的内容,所 以s与a的值是不相等的。而当调用s.intern()方法,却可以返回s在常量池中的地址值,因为a的值存储在常量池中,故s.intern和a的值相等。 总结 栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容 堆中存放使用new关键字创建的对象. 字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
转自:
http://caifu.zol.com.cn/195/1955990.html
发表评论
-
JVM启动参数
2012-03-05 10:46 1355官方文档见: http://docs.sun.c ... -
java mail
2012-01-09 11:56 657http://www.cnblogs.com/li ... -
java io性能分析
2011-09-28 19:03 4370摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些 ... -
Java中一些Map的性能测试
2011-09-26 17:01 1245Java中有一些Map包含:TreeMap,HashMa ... -
java 排序
2011-09-26 13:36 790http://blog.csdn.net/zuol ... -
JVM内存管理:深入垃圾收集器与内存分配策略
2011-09-26 13:35 753http://www.iteye.com/top ... -
java 转义
2011-09-16 11:08 1223转义序列 含义 \n 回车(\u000a) \t 水平制表 ... -
classpath 配置
2011-08-18 18:07 545配置jar包时,路径最后位置需到jar文件。 例 ... -
java -Xms -Xmx
2011-07-28 20:42 1260java -Xms 1024M -Xmx 1 ... -
javac 命令
2011-07-26 16:19 966目录结构: /src /build /src ... -
Unicode字符编码分布表
2011-07-21 17:32 814Unicode 字符编码分布表――语言文字类 ... -
java 字符串 字节 长度
2011-07-21 16:46 968java是以unicode编码的。字符串的字节的长度跟编码有关 ... -
书 编码 及解码
2011-07-07 18:35 799String s = "20070&q ... -
javadoc eclipse
2011-06-22 12:28 800在 Eclipse 中如何使用 davadoc 生 ... -
Runtime.getRuntime().exec()
2010-11-05 17:48 1084http://www.iteye.com/topi ... -
Java 读取远程主机中文件
2010-10-29 11:04 2191测试程序: File file = ... -
字符编码 Unicode/UTF-8/UTF-16/UCS/Endian/BMP/BOM
2010-10-22 20:16 838http://blog.csdn.net/zzcv ... -
Java 操作 File 八 删除文件
2010-09-29 12:43 973八.删除文件(目录) 1.删除文件 /** *//* ... -
Java 操作 File 七 创建文件
2010-09-29 12:41 974七.创建文件(文件夹) 1.创建文件夹 /** *//* ... -
Java 操作 File 六 读文件
2010-09-29 12:39 1014六.读文件 1.利用FileInputStream读取文件 ...
相关推荐
### Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用于企业级开发的语言,其内存管理和分配机制是其核心技术之一。本文旨在深入探讨Java内存分配的基本原理及其在不同内存区域的具体表现,帮助读者更好...
深入探讨Java核心:Java内存分配原理精讲 Java内存分配机制是Java编程语言的重要组成部分,它不仅直接影响着程序的性能,也是理解Java垃圾回收、内存泄漏等问题的关键。本文将聚焦于Java内存分配的核心概念,包括栈...
Java内存分配原理是Java编程中的重要一环,它关乎到程序的性能、稳定性和资源管理。深入理解这一主题,能够帮助开发者编写出更高效、更稳定的代码。在Java中,内存分为堆内存、栈内存、方法区(在Java 8之后被元空间...
### 深入Java核心:Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用的编程语言,其内存管理和分配机制是开发者必须掌握的重要知识点之一。本文将深入探讨Java内存分配的基本概念、不同内存区域的作用...
深入理解Java核心:Java内存分配原理精讲 Java内存分配是理解Java运行机制的关键部分,尤其对于初学者而言,掌握这一原理能显著提升编程效率和代码质量。Java内存分配涉及多个区域,包括栈、堆、常量池等,每个区域...
Java内存分配原理主要涉及到以下几个关键区域:寄存器、栈、堆、静态域、常量池和非RAM存储。下面将详细阐述这些区域的作用和Java内存管理的核心概念。 1. 寄存器:这是计算机硬件层面的一个概念,用于存储运算过程...
Java内存分配原理主要涉及几个关键区域,包括栈、堆、静态域、常量池和非RAM存储。在Java编程中,理解这些区域的功能和交互至关重要,因为它们直接影响程序的性能和资源管理。 1. **栈(Stack)**: 栈主要用于存储...
这些文档如"Java内存模型.docx"、"Java内存模型2.docx"、"深入Java核心 Java内存分配原理精讲.docx"、"java内存模型.pdf"将深入探讨这些概念,帮助开发者更深入地理解Java内存模型及其在实际编程中的应用。...
Java内存管理是Java编程中的核心概念,它涉及到程序运行时如何高效地使用和管理内存。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),在Java虚拟机(JVM)中扮演着不同的角色。 1. **...
C语言各数据类型内存分配精讲,深入剖析各数据类型的内存分配
Java程序设计精讲课件是一套全面讲解Java编程的教育资源,主要涵盖了泛型、集合类、Java输入输出以及反射等核心概念。这套课程旨在帮助初学者深入理解和熟练掌握Java编程技术,同时也适合有一定基础的开发者进行知识...
MOS管电路工作原理精讲PPT
│ │ 【课程资料】Java并发编程原理精讲.exe │ │ │ └─01 原子操作 │ 01 原子操作的基本概念.mp4 │ 02 原子操作的实现原理.mp4 │ 03 演示非原子操作的效果及解决方案.mp4 │ 04 AtomicInteger的原子...
│ │ 【课程资料】Java并发编程原理精讲.exe │ │ │ └─01 原子操作 │ 01 原子操作的基本概念.mp4 │ 02 原子操作的实现原理.mp4 │ 03 演示非原子操作的效果及解决方案.mp4 │ 04 AtomicInteger的原子...
│ │ 【课程资料】Java并发编程原理精讲.exe │ │ │ └─01 原子操作 │ 01 原子操作的基本概念.mp4 │ 02 原子操作的实现原理.mp4 │ 03 演示非原子操作的效果及解决方案.mp4 │ 04 AtomicInteger的原子...