what?
why?
how?
主题一:
what: String与char分别是什么类型,这两种类型是怎么存储的。以及他们的区别与联系?
Ans:
(1)首先String不属于8种基本数据类型(int,byte,short,long,boolean,char,float,double),String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
(2)new String()和new String("")都是申明一个新的空字符串,是空串不是null;
(3)String str=”kvill”;
String str=new String (“kvill”);的区别:
在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
看例1:
1 String s0="kvill"; 2 3 String s1="kvill"; 4 5 String s2=new String("kvill"); 6 7 String s3="kv"+"ill"; 8 9 System.out.println(s0==s1); 10 11 System.out.println(s0==s2); 12 13 System.out.println(s0==s3);
结果为:
1 true 2 3 false 4 5 true
首先,我们要知结果为Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;
而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符
串常量,所以s3也同样在编译期就被解析为一个字符串常量,所以s3也是常量池中“kvill”的一个引用。
所以我们得出s0==s1==s3;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
s0和s1、s3在编译期就可以确定。他们是常量池中“kvill”的引用。 s2因为无法在编译期确定,所以是运行时创建的新对象“kvill”的引用,
看例子2:
1 String s0="kvill"; 2 String s1=new String("kvill"); 3 String s2="kv"+new String("ill"); 4 System.out.println(s0==s1); 5 System.out.println(s0==s2); 6 System.out.println(s1==s2);
结果为:
false false false
例子2中,s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;
这是因为每个字符串为一个对象,比较的是他们的引用地址,在堆分配的地址肯定是不一样的。 TT的思考:就是说s0,s1,s2比较的是对象的地址??o,不对,s0是一个常量。s1、s2是对象,比较的是他们的引用地址,
就是堆分配中的地址,每个字符串是一个独立的对象,堆地址肯定不是一个喽。
(4)String.intern():
java APIs官方版本对intern的介绍是:
intern
public String intern()
- 返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类
String
私有地维护。当调用 intern 方法时,如果池已经包含一个等于此
String
对象的字符串(用equals(Object)
方法确定),则返回池中的字符串。否则,将此String
对象添加到池中,并返回此String
对象的引用。(TT现在知道定义完String这个对象,String这个对象就是一个引用变量。当方法设置返回值是String类型时,设置的原来就是String对象的引用,其实说返回值是String对象,应该也不错吧?)
它遵循以下规则:对于任意两个字符串
s
和t
,当且仅当s.equals(t)
为true
时,s.intern() == t.intern()
才为true
。所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义
- 返回:
- 一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
- (TT的观点:咋现在又不是返回对象的引用,而是返回字符串了呢?前面还说返回对象的引用。是不是返回对象的引用,可以由对象的引用取得到对象。对象就是字符串呢?)
再补充一点:存在于.class
百度文库:
http://wenku.baidu.com/view/e7b9c32ded630b1c59eeb556.html
new String()
创建
null
,
所以
String
的默认值也是
null
;
但它又是一种特殊的对象,
有
主题二:String与char一般都用在什么地方?以及他们的相互转换要怎么转换?
1、java