- 浏览: 460395 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (538)
- C/C++ Primer (69)
- Objective-C Primer (102)
- Python Primer (19)
- JavaScript Primer (1)
- Java Primer (37)
- PHP Primer (17)
- 泛 Linux (37)
- Shell Script (21)
- APUE (21)
- UNP__1&2 (19)
- NetWork (7)
- Oracle周边 (38)
- Mysql里边 (6)
- Windows技 (9)
- 简单算法 & 数据结构 (14)
- 设计模式 (6)
- GTK历程 (12)
- 工具使用 (25)
- 杂事 (23)
- 一些概念 (17)
- Web方面 (10)
- myCodeTools (9)
- ^未 竟$ (13)
- 硬件通信 (2)
- Games (1)
最新评论
所谓多数文章皆是抄,在网上找一个Java 字符串池的文章,搜到N多条目,可看来看去也就两篇,总结如下:
首先看一段代码:
结果是true,false,false,true,true,true。
这里就涉及到字符串池。“字符串池”,是Java为了提高内存利用率而采用的措施:
当遇到String a = "Hello"; 这样的语句时,Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"Hello"对象,然后变量 a 指向这个地址;
然后遇到语句String b = "Hello",这时字符串池中已经有 "Hello"了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。
而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同,所以a == b返回 true。
那么String c = new String("Hello")又如何处理呢?如果是这种写法,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。
所以a == c返回false,c == d同样返回false。至于String的equals方法,因为它比较的不是对象的地址,而是对象的值,所以都返回true就不奇怪了。
Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。
字符串表达式总是指向字符串池中的一个对象。
使用new操作创建的字符串对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的字符串--使用equals方法确定,则直接返回池中的字符串,否则先将字符串添加到池中,再返回)。池中两个相等的字符串如果使用“==”来比较将返回真。
首先看一段代码:
String a = "Hello"; String b = "Hello"; String c = new String("Hello"); String d = new String("Hello"); System.out.println(a == b); System.out.println(b == c); System.out.println(c == d); System.out.println(a.equals(b)); System.out.println(b.equals(c)); System.out.println(c.equals(d));
结果是true,false,false,true,true,true。
这里就涉及到字符串池。“字符串池”,是Java为了提高内存利用率而采用的措施:
当遇到String a = "Hello"; 这样的语句时,Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"Hello"对象,然后变量 a 指向这个地址;
然后遇到语句String b = "Hello",这时字符串池中已经有 "Hello"了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。
而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同,所以a == b返回 true。
那么String c = new String("Hello")又如何处理呢?如果是这种写法,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。
所以a == c返回false,c == d同样返回false。至于String的equals方法,因为它比较的不是对象的地址,而是对象的值,所以都返回true就不奇怪了。
Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。
字符串表达式总是指向字符串池中的一个对象。
使用new操作创建的字符串对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的字符串--使用equals方法确定,则直接返回池中的字符串,否则先将字符串添加到池中,再返回)。池中两个相等的字符串如果使用“==”来比较将返回真。
发表评论
-
MD5
2011-03-10 17:43 0import java.security.Messag ... -
String.format
2011-03-10 14:32 591对应C中的snprintf(...); public st ... -
Android Activity(窗口)的一生
2010-12-28 14:43 824http://flysnow.iteye.com/blog/ ... -
Android 项目基础之XML
2010-12-28 11:43 664res.layout.main.xml <?x ... -
Android 开发环境搭建
2010-12-28 10:58 924http://7691432.blog.163.com/blo ... -
平台独立的换行符
2010-10-20 09:07 830http://java-admin.iteye.com/blo ... -
Swing JTable资料
2010-09-25 14:31 674http://www.cnblogs.com/keweixia ... -
Swing Buttion Image
2010-09-25 11:18 656http://www.blogjava.net/ruislan ... -
Swing TextField 加强
2010-09-25 11:18 587http://www.blogjava.net/ruislan ... -
Java获取系统信息
2010-09-15 16:07 1024http://mao1985.iteye.com/blog/1 ... -
Java call windows command
2010-09-15 14:33 800http://winter8.iteye.com/blog/4 ... -
Java Operate Excel
2010-09-15 10:12 949使用例子 http://www.iteye.com/topic ... -
Java关键字instanceof
2010-09-14 17:58 680对象比较 http://www.cnblogs.com/ro ... -
jar相关
2010-09-03 18:10 764test |--MANIFEST.MF |--com ... -
未竟IAdaptable
2010-09-02 11:00 642不知道是什么,纯属留脚印记录下。 -
Swing_JfreeChart资料
2010-08-31 16:30 613http://ltc603.iteye.com/blog/30 ... -
一些进阶类记录
2010-08-31 11:11 611java.util.Scanner 一个可以使用正则表达式来分 ... -
System类
2010-08-31 09:31 652System.getProperty()方法可以获取的值:(应 ... -
JNI简介
2010-08-30 14:42 505http://www.iteye.com/topic/2957 ... -
java读写文件大全
2010-08-30 11:37 700可惜啊!代码没有排版的。。。 http://blog.csdn ...
相关推荐
字符串池的主要目的是减少内存中的重复字符串实例,当创建一个新字符串时,.NET会首先检查字符串池中是否存在相同的字符串,如果存在,则直接返回池中的引用,而不是创建新的实例。这样避免了大量的内存分配和垃圾...
Java字符串池和字符对象是Java编程中的重要概念,主要涉及到String类的特性和内存管理。在Java中,String是一个不可变类,这意味着一旦创建了一个String对象,它的值就不能被修改。这种不变性使得String对象在多线程...
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
字符串的`intern()`方法会将字符串对象加入到字符串池中,如果字符串池中已有相同的字符串,则返回池中的引用。 10. **编码与解码**: 字符串与字节之间的转换涉及到编码问题,如`getBytes()`和`new String(byte...
这种机制称为字符串池的“复用”。 ### 字面量创建与`new`创建的区别 1. **字面量创建**:例如`String str1 = "hello"`。这种方式创建的字符串会直接或间接地进入字符串常量池。如果多次声明相同的字面量,JVM只会...
"Java 字符串池的深入理解" Java 字符串池是 Java 中的一种特性,旨在提高内存利用率。字符串池的工作机制是,当我们使用双引号声明一个字符串时,Java 会先在字符串池中寻找是否已经存在该字符串,如果没有,则...
当创建一个新的字符串时,如果字符串池中已经存在相同的字符串,则不会创建新的对象,而是直接引用已存在的字符串。 ```java String s1 = "abcd"; String s2 = "abcd"; // s1 和 s2 指向的是同一个对象 ``` ##...
7. **字符串池**:C#有内置的字符串池,可以优化短字符串的创建和销毁。但对长字符串或大量字符串,可能需要手动管理。 总结,生成和比较大量字符串涉及到字符串生成技巧、比较方法选择、性能优化策略以及内存管理...
7. **性能优化**:针对特定场景,可以优化字符串的内存管理,例如预分配空间以减少动态内存分配,或者使用字符串池来减少内存碎片。 8. **错误处理**:在封装过程中,应考虑异常安全性和错误处理,比如当操作失败时...
对于第二种方式,Java虚拟机(JVM)会在字符串池中检查是否已有相同值的`String`对象。如果有,就直接引用;如果没有,才会在堆中创建新对象并放入字符串池。 【字符串池】 字符串池是一种内存区域,存储了已创建的...
10. **字符串优化**:在处理大量字符串时,了解内存管理(如Python的字符串连接优化)和字符串池的概念能提高程序效率。 这些只是字符串处理的一部分基础概念,实际的"字符串习题总结"可能会涵盖更高级的主题,如...
10. **String对象的池化**:Java 1.5引入了字符串池,用于优化性能。字符串字面量和`String.intern()`方法都涉及到字符串池的概念。 本压缩包的“Chapter15”可能涵盖了以上部分或全部知识点,包括实例演示、上机...
同时,合理使用字符串池和内存分配策略可以提升程序效率。 总的来说,理解和熟练掌握字符串处理函数是每个程序员的基本功,无论是进行数据解析、日志记录,还是构建复杂的文本算法,这些函数都起着关键作用。通过...
字符串常量存储在字符串池中,通过`""`创建的字符串会被自动加入到池中。 **5.2.6 正则表达式** Java支持正则表达式,可以使用`Pattern`和`Matcher`类进行匹配、替换和查找操作。 总结,数组和字符串是Java编程的...
因此,合理使用字符串操作和内存管理技巧(如字符串池、引用计数等)对提高程序效率至关重要。 总的来说,字符串是编程中的基本元素,理解和掌握其特性和操作方法对于任何程序员来说都是必要的。通过深入学习和实践...
8. **字符串效率**:讨论如何优化字符串操作,例如避免不必要的拷贝,使用字符串池等。 9. **错误处理**:在实现字符串处理函数时,需要考虑边界条件、空字符串、越界访问等问题,并编写适当的错误处理代码。 10. ...
例如,`String s = new String("we are students")` 创建了一个新的`String`对象,而 `String s2 = "we are students"` 直接引用了字符串池中的对象。此外,还可以使用字符数组或其子序列创建字符串。 2. **引用...