java中的字符串(String)的秘密
2011-05-03 11:58
344 查看
java中的"=="的作用是用来判断两个数据是否相等,无论是8种原生数据类型还是引用类型,引用类型相等也就是指两个引用指向同一个对象,Object类中的equals()方法仅仅是反回(this == Object),所以Object的equals()方法仅仅是判断对象是不是同一个对象,而对于那些继承了Object类而又重写了equals()方法的类,比如说String类,那就要依据具体的equals()方法的实现来判断了.
String类特性与创建过程
1 String是常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容,对于java的String来说比软特殊,java中有一个String pool的概念,它是由String这个类单独在栈中维护。
2 采用literal(字面值)方式赋值时(如 Strng str = "strings"),java会查找String Pool(字符串池,由String这个类单独维护)中是否存在"String",如果不存在,则在String Pool中创建一个"strings"对象,然后将String Pool中的这个"strings"对象地址返回来,赋给引用变量str,这样str会指向String Pool中的这个"strings"字符串对象。
3 如果存在,则不创建任对象,直接将String Pool中这个"strings"对象地址返回来,赋给引用。
4 采用 String str = new String("strings")这个方式,首先在String Pool中查找有没有"strings"这个字符串对象,如果有,则不在String Pool中再去创建"strings"这个对象了,直接在heap(堆)中创建一个"strings"字符串对象,然后将堆中这个"strings"对象地址返回来,赋给str引用,导致str指向了堆中创建的这个"strings"字符串对象。
5 如果没有,则首先在String Pool中创建一个"strings"对象,然后再在heap中创建一个"strings"对象,然后将椎中这个"strings"对象的地址返回来,赋给str引用,导致str指向了堆中所创建的这个"strings"对象。参见java.lang.String.intern()方法。
了解了这些就来猜猜下面的例子吧
String类特性与创建过程
1 String是常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容,对于java的String来说比软特殊,java中有一个String pool的概念,它是由String这个类单独在栈中维护。
2 采用literal(字面值)方式赋值时(如 Strng str = "strings"),java会查找String Pool(字符串池,由String这个类单独维护)中是否存在"String",如果不存在,则在String Pool中创建一个"strings"对象,然后将String Pool中的这个"strings"对象地址返回来,赋给引用变量str,这样str会指向String Pool中的这个"strings"字符串对象。
3 如果存在,则不创建任对象,直接将String Pool中这个"strings"对象地址返回来,赋给引用。
4 采用 String str = new String("strings")这个方式,首先在String Pool中查找有没有"strings"这个字符串对象,如果有,则不在String Pool中再去创建"strings"这个对象了,直接在heap(堆)中创建一个"strings"字符串对象,然后将堆中这个"strings"对象地址返回来,赋给str引用,导致str指向了堆中创建的这个"strings"字符串对象。
5 如果没有,则首先在String Pool中创建一个"strings"对象,然后再在heap中创建一个"strings"对象,然后将椎中这个"strings"对象的地址返回来,赋给str引用,导致str指向了堆中所创建的这个"strings"对象。参见java.lang.String.intern()方法。
了解了这些就来猜猜下面的例子吧
public class StringTest { public static void main(String[] args) { String str3 = "abc"; //采的字面什的方式 String str4 = "abc"; //不会创建新的对象 System.out.println(str3 == str4); System.out.println(str3 == "abc".intern()); System.out.println("-----------------------------------"); String str = new String("java"); String str2 = new String("java"); //会创建新的对象 System.out.println(str == str2); System.out.println("-----------------------------------"); String str5 = new String("strings"); String str6 = "string"; System.out.println(str5 == str6); System.out.println("-----------------------------------"); //下面的一些是java语言规范,各种java虚拟机都要如此的实现 String s = "hello"; String s1 = "hel"; String s2 = "lo"; System.out.println(s == s1 + s2); System.out.println(s == "hel" + "lo"); System.out.println(s == s1 + "lo"); } }
相关文章推荐
- java读取InputStream输入流后输出String字符串
- 【java performance】对于常量字符串,用'String' 代替'StringBuffer'
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- java字符串格式化:String.format()方法的使用
- Java#字符串(String)方法
- java String.indexOf方法在一个字符串中查找另一个字符串的次数的简单应用
- java String 字符串只保留汉字
- [置顶] java工具类去掉字符串String中的.点。android开发java程序员常用工具类
- Java中String和String Buffer两种字符串类型之间的区别和联系
- JAVA字符串格式化-String.format()的使用
- Java String字符串补0或空格
- JAVA面试题解惑系列(六)——字符串(String)杂谈
- Java 字符串(String, StringBuffer, StringBuilder,StringTonkenizer)
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- JAVA字符串格式化-String.format()的使用
- JAVA字符串格式化-String.format()的使用
- 对java中的String采用+=连接字符串需要注意的一个问题
- java学习-关于字符串String
- JAVA——(1)基础补充之运算符、字符串、数组、内存分配(String,StringBuffer,StringBuilder的区别
- 深入研究java对String字符串对象的创建以及管理