- 浏览: 79100 次
文章分类
最新评论
下面是几个常见例子的比较分析和理解:
通过上面4个例子可以得出得知:
这个就不一样了,最终结果等于:
String对象的intern方法理解和分析:
总结
栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容
堆中存放使用new关键字创建的对象.
字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
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关键字,存放在堆中。
发表评论
-
使用javamail组件-----邮件发送
2013-08-09 16:35 487public static void sendMessag ... -
利用快速排序算法快速的取出前一千条数据
2013-08-06 15:49 536实现代码如下:原理是利用了快速排序‘分治’思想,判断左边区域 ... -
java的JNI本地调用代码
2013-06-21 11:56 475Jni中C++和Java的参数传递 如何使用JNI的一些基 ... -
如何解决在window下高并发TCP请求端口被占用问题
2013-05-02 09:43 3090当客户端启动到服务器的 TCP/IP 套接字连接时,客户端通 ... -
Maven的简单使用
2013-04-26 11:44 714----------------准备工作---------- ... -
js 压缩工具使用
2013-04-19 11:40 735//测试代码 compiler("F:\\com ... -
解决加载相同的类
2013-04-19 09:38 627URLClassLoader classLoader1 = ... -
将长url转化为短url
2013-02-21 18:05 711public class ShortAddressUtil ... -
如何判断上传的图片是否是正真的图片 防止上传恶意的非图片文件
2013-02-19 17:03 1016final String JPG = "ffd ... -
ChartDirect使用<制作统计图的组件>
2012-11-30 11:39 1542//创建一个由X,Y轴 ... -
获取字符拼音首字母
2012-10-08 13:41 782/** * @date 2010-1-22 * @bu ... -
jetty嵌入式采用xml配置
2012-09-24 09:40 1029Server server = new Server(); ... -
生成验证码图片
2012-08-29 17:29 926Java生成验证码 为了防止用户恶意,或者使用软 ... -
WebService分布式应用实现
2012-08-28 17:30 1166WebService 是一种跨语言的系统间交互标准,对外提供功 ... -
利用MulticastSocket发送广播信息
2012-08-24 11:35 809多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D ... -
插件类的一种加载形式URLClassLoader
2012-08-22 10:11 791URL url = new URL("file ... -
部署RMI应用(服务器与RMI注册表分离方式)
2012-08-20 17:56 2152一般情况下,我们的部署RMI应用的时候是把服务器和RMI注册表 ... -
RMI远程调用
2012-08-03 17:42 771第一步:远程对象接口 WareHose.java pack ... -
使用JNDI获取DataSource对象
2012-08-03 14:24 836Tomcat的conf/context.xml在<Con ... -
获取摘要、加密、解密
2012-08-02 16:57 1228生成SHA或MD5摘要 MessageDigest sha ...
相关推荐
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
在Java编程语言中,字符串常量池(String Constant Pool)是一个重要的概念,它与程序的内存管理和性能优化密切相关。理解这个概念对于任何Java开发者来说都至关重要。字符串常量池是Java虚拟机(JVM)在运行时为...
字符串常量池是一个特殊的区域,位于Java虚拟机(JVM)的内存结构中的方法区或元空间。它存储了程序中所有的字符串字面量(即用双引号定义的字符串)。当一个字符串被创建时,JVM会首先检查池中是否存在相同的字符串...
字符串常量池是一个特殊的区域,它存储了程序中所有的字符串常量,避免了多次创建相同的字符串对象。本文将详细探讨字符串常量池的存储方式以及与字符串相关的内存管理策略。 首先,字符串常量池位于JVM的永久代...
String int 字符串常量池 包装类型 函数参数 值传递引用传递 的 内存分配例子——源码 public static void fun_ref (Ref_test ref_out){ Ref_test ref_in=new Ref_test(); ref_in.s1="in"; //ref_out.s1=...
Java中的字符串常量池是Java虚拟机(JVM)为了优化字符串对象的使用而设立的一个特殊区域,它存储了程序中所有的字符串字面量。在Java中,字符串是不可变的,这意味着一旦创建,就不能修改。这个特性使得字符串常量...
最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示...
不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);
它维护着一个表,总是为池中每个唯一的字符串对象维护一个引用,这意味着它们一直引用着字符串常量池中的对象,因此,在常量池中的这些字符串不会被垃圾收集器回收。 操作字符串常量池的方式有多种,例如使用 `...
系统在存储一个字符串常量时先给定一个起始地址,从该地址指定的存储单元开始,连续存放该字符串中的字符。这样,字符串常量实质上是一个指向该字符串首字符的指针常量。 字符串常量的定义 字符串常量可以使用以下...
292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串...
当程序中第一次出现一个字符串常量时,例如`"HelloWorld"`,CLR会在字符串常量池中查找是否存在该字符串。如果不存在,它会在池中创建一个唯一的实例,并将其保存在池中。后续的引用都将指向这个池中的相同实例,而...
如果没有冲突,它可能只是一个entry,如果有冲突,它可能是一个entry链表,然后Java再遍历entry链表,匹配引用对应的字符串,如果找得到字符串,返回引用,如果找不到字符串,会把字符串放到常量池中,并把引用保存...
基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符...
总之,"汉字字符串拼音排序-QT、C++"这个主题涵盖了C++的字符串操作、QT的QString类、Unicode支持以及中文字符串的拼音处理技术。对于开发涉及中文内容的应用来说,掌握这些知识点是非常有价值的。
当一个新字符串被创建时,JVM会检查常量池中是否存在相同的字符串,如果存在,就直接返回其引用,否则会在堆中创建一个新的实例并添加到常量池。 垃圾收集(Garbage Collection, GC)是JVM管理内存的重要机制。GC...
- **字符串字面量的处理**:当程序尝试创建一个新的字符串字面量时,JVM首先会检查字符串常量池中是否存在该字符串。如果存在,则返回已存在的字符串对象;如果不存在,则创建一个新的字符串对象并将其放入字符串...
在这个例子中,`"abc"` 首先被检查是否已经存在于字符串常量池中。如果不存在,则会在字符串常量池中创建一个新的 `"abc"` 字符串。之后,将在堆内存中创建一个新的字符串对象 `A`,并使用 `s1` 引用指向这个对象。 ...
在这个例子中,`display_char`函数将字符转换为七段码并输出,而`display_string`函数遍历整个字符串,调用`display_char`来显示每个字符。 需要注意的是,实际应用中还需要考虑硬件层面的细节,比如消隐时间、扫描...