Java API中String类的用法 1

来源:互联网 发布:淘宝店铺页头装修 编辑:程序博客网 时间:2024/05/29 17:02

Java API中String类的用法 1

java API中String的定义是:

public final class String  extends Object implements Serializable, Comparable<String>, CharSequence
由此可知,String是一个类,它具有final 属性就证明它不能被继承。
String类代表字符串,String不是基本数据类型,所以它的大小不确定。字符串是常量,存在方法区的常量池中,它的值在创建后就不能更改。字符串缓冲区支持可变的字符串,因为String对象是不可变的,所以可以共享。
字符串创建时其实是以字符数组的形式接受再赋值给String :
String str = "abc";
 等价于: 
char data[] = {'a','b','c'};   
String str = new String(data);

String 的构造方法:

public String(byte[] bytes)  我们常用的String str = new String("hello world"); 就是这种情况。

String类型的存储:

创建String有两种常用方法:

一种是  String str = "abc";
一种是  String str =new String("abc") ;
这两种方法存在很大的区别:通过new 获得的String会在堆中开辟一个空间来存储索引,但是值还是存在方法区的常量池中。

下面就具体分析一下两种创建方法的过程:

String s1 = "java";
String s2 =new String("java") ;
第一种:通过字符串赋的方法:这种方法是先在栈空间中创建s1,然后直接到常量池中找,有没有这个字符串,如果有就不用创建了,把它的首地址赋值给s1,如果没有此字符串就新开辟一个空间存储这个字符串,然后把首地址赋值给s1。
第二种:通过new创建对象的方法:这种方法是先在栈空间中创建s2,然后在堆空间中创建一个对象,将地址赋值给,之后就跟直接赋值一样了,先在到常量池中找,有没有这个字符串,如果有就不用创建了,把它的首地址赋值给s2,如果没有此字符串就新开辟一个空间存储这个字符串,然后把首地址赋值给堆空间的对象。
为什么先找,没有再创建呢?   
之前说过,String是不可变的,所以它是共享的。
这个过程可以用下面的图说明:

String 类型可以用 + 来连接:
String s = 'hello';
s = s + "world";
这两个s已经不是同一个对象了,因为String自创建了就不会改变,用+ 连接它会另开辟一个空间来存储“helloworld”。

字符串的比较有两种方式"==" 和 equal():
"==" :比较的是地址是否相等,也就是是不是同一个对象;
equal() : 比较的是两个字符串是否相同;
下面举几个例子:
<span style="white-space:pre"></span>String s1 = "hello";String s2 = "world";String s3 = "helloworld";System.out.println(s3 ==(s1+ s2));System.out.println(s3.equals(s1+ s2));System.out.println(s3 == ("hello"+ "world"));System.out.println(s3.equals("hello"+ "world"));
 返回的结果分别是:false ,true , true, true

















0 0
原创粉丝点击