java中的String

 

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对象,应该也不错吧?)

它遵循以下规则:对于任意两个字符串 st,当且仅当 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

原文地址:https://www.cnblogs.com/meihao1989/p/3177157.html