太多关于String的问题了,
窃以为关键在于字符串(string,字符组成的串)和java.lang.String的关系一些模糊。咱们讨论一下,它们是什么关系呢?(abstract)
窃以为关键在于字符串(string,字符组成的串)和java.lang.String的关系一些模糊。咱们讨论一下,它们是什么关系呢?(abstract)
解决方案 »
- HashMap同步问题~~急~~~请大家帮帮忙
- jar 命令 使用时问题
- EJB 调用的问题,很简单的,轻松得100分。
- System.out.println();
- 求一些关于cookie,上传文件,下载,的小代码????????
- 欢迎JAVA爱好都加群20072942共同学习讨论~~~
- JMF实现组播
- 关于javamail的,如何判断一个Message类型的message(邮件)是否有附件?哪个对,还是都不对?高手帮忙。
- Runtime.getRuntime().exec()函数,输入参数中的通配符(*)不能被UNIX解析,java的缺陷?
- 请教有关sessionListener的问题?
- ArrayList 数组排序 急急
- 请教一个Container中添加监听的问题,希望各位能给点建议,谢谢。
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例来实现
楼主:"字符串(string,字符组成的串)和java.lang.String的关系一些模糊。"
1)"汉字abc" 这是一个字符串的文字量(或:字面量,即:字符组成的序列),编译时放在class中的常量池部分.
2)java.lang.String类的一个对象,代表的是一个字符串(值不可更改).
那么:常量池中的字符串的文字量 与 java.lang.String类的一个对象 是什么关系?是一回事吗?
不是!
在class装入内存是,通常的过程是:经过(验证,准备,解析)三个阶段,在解析阶段,会对 指向 常量池中的字符串的文字量 的符号引用 解析成 真正的 java.lang.String类的一个对象的引用.
且保证:所有指向常量池中的同一个字符串的文字量的符号引用,都会解析成:指向同一个真正的 java.lang.String类的一个对象.
String s2=new String(“kvill”); System.out.println( s0==s1 ); System.out.println( “**********” ); s1.intern(); s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 System.out.println( s0==s1); System.out.println( s0==s1.intern() ); System.out.println( s0==s2 ); 结果为: false ********** false //虽然执行了s1.intern(),但它的返回值没有赋给s1 true //说明s1.intern()返回的是常量池中”kvill”的引用 true
最后我再破除一个错误的理解: 有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局String表中,如果具有相同值的Unicode字符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中“如果我把他说的这个全局的String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的字符串,则将自己的地址注册到表中”是错的: 看例4: String s1=new String("kvill"); String s2=s1.intern(); System.out.println( s1==s1.intern() ); System.out.println( s1+" "+s2 ); System.out.println( s2==s1.intern() ); 结果: false kvill kvill true 在这个类中我们没有声名一个”kvill”常量,所以常量池中一开始是没有”kvill”的,当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。 s1==s1.intern()为false说明原来的“kvill”仍然存在; s2现在为常量池中“kvill”的地址,所以有s2==s1.intern()为true。 5. 关于equals()和==: 这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。 6. 关于String是不可变的 这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。
这就是关键。
大量的String的困惑来源于此。********************
8楼的“ 4. String.intern(): ”中有误。