设为首页收藏本站language 语言切换
查看: 1371|回复: 0
收起左侧

全面解析Java中的String对象数据类型

[复制链接]
发表于 2010-2-20 13:49:47 | 显示全部楼层 |阅读模式
<p ><p >1. 首先String不属于8种基本数据类型,String是一个对象。 <p ><p >因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。 <p ><p >2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null; <p ><p >3. String str=”kvill”; <p ><p >String str=new String (“kvill”);的区别: <p ><p >在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。 <p ><p >常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 <p ><p >看例1: <p ><p >String s0=”kvill”; <p ><p >String s1=”kvill”; <p ><p >String s2=”kv” + “ill”; <p ><p >System.out.println( s0==s1 ); <p ><p >System.out.println( s0==s2 );  <p ><p ><p >结果为: <p ><p >true <p ><p >true  <p ><p ><p >首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。 <p ><p >因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。 <p ><p >所以我们得出s0==s1==s2; <p ><p >用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。 <p ><p >看例2: <p ><p >String s0=”kvill”; <p ><p >String s1=new String(”kvill”); <p ><p >String s2=”kv” + new String(“ill”); <p ><p >System.out.println( s0==s1 ); <p ><p >System.out.println( s0==s2 ); <p ><p >System.out.println( s1==s2 );  <p >结果为: <p ><p >false <p ><p >false <p ><p >false  <p ><p ><p >例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。                                 <p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-6 15:48 , Processed in 0.725886 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表