Java提供了丰富的API给使用者方便其快捷高效的进行开发工作,本篇博客将介绍常用类中字符串相关类的具体使用方法,包括String、StringBuffer、StringBuilder。
目录:
☍ String类
▴ String的特性
String类:代表 字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。
☄ String是一个final类,代表不可变的字符序列(String的不可变性),不可被继承。
☄ 字符串是常量,用双引号""引起来表示。它们的值在创建之后不能更改,即调用方法对原字符串的操作使字符串改变会创建新的字符串而不会影响到原字符串本身。
☄ String对象的字符内容底层是存储在一个字符数组final char value[]中的。
☄ String实现了Serializable接口:表示字符串是支持序列化的。
☄ String实现了Comparable接口:表示字符串可以比较大小。
☄ 过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中;通过new String()方式创建字符串,此时内容存储在堆空间中。
☄ 过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中;通过new String()方式创建字符串,此时内容存储在堆空间中。
String底层代码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
....
}
▴ String对象的创建
字面量的方式赋值
说明:此时字符串数据声明在方法区中的字符串常量池中
创建对象的方式赋值(调用不同String的构造器)
说明:此时字符串变量保存的是地址值,是数据在堆空间开辟内存空间后对应的地址值
☃ 空参构造器new String(); ---- 本质上为:this.value = new char[0];
☃ String字符串参数构造器new String(String original); ---- 本质上为:this.value = original.value;
☃ char字符数组参数构造器new String(String original); ---- 本质上为:this.value = Arrays.copyOf(value, value.length);
…
public void testString2(){
//1、字面量的方式赋值
String st1 = "hello world";
//2、创建对象的方式赋值(不同String的构造器)
/*2-1:空参构造器new String();
本质上为this.value = new char[0]; 定义长度为0的字符数组
*/
String st2 = new String();
System.out.println("new String():" + st2 + "length:" + st2.length()); //new String():length:0
/*2-2:String字符串参数构造器new String(String original);
本质上为this.value = original.value
*/
String st3 = new String("serializable"); //
System.out.println("new String(String original):" + st3 + " length:"+ st3.length()); //new String(String original):serializable length:12
/*2-3:char字符数组参数构造器new String(String original);
* 本质上为this.value = Arrays.copyOf(value,value.length);
*/
String st4 = new String(new char[]{
's', 'y', 'n', 'c', 'h', 'r', 'o', 'n', 'i', 'z', 'e', 'd'});
System.out.println("new String(String original):" + st4 + " length:"+ st4.length()); //new String(String original):synchronized length:12
//对比字面量赋值方式和String构造器方式实例化String的不同
String t1 = "Java";
String t2 = "Java";
String t3 = new String("Java");
String t4 = new String("Java"); //
System.out.println("t1 == t2:" + (t1 == t2)); //true
System.out.println("t3 == t4:" + (t3 == t4)); //false
System.out.println("t1 == t3:" + (t1 == t3)); //false
Person p1 = new Person(11,"Tom");
Person p2 = new Person(11,"Tom");
System.out.println("p1==p2:" + (p1 == p2)); //false 对象存储在堆中,开辟的内存空间地址不同
System.out.println("p1.name==p2.name:" + (p1.name == p2.name)); //true,Person对象中name是以字面量的方式定义的,所以存储在方法区的字符串常量池中
}
class Person{
int age;
String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}