package test;
import org.junit.Test;
public class String_ {
/**
* String:字符串,使用一对""来表示
* String声明为final,表明是不可变的
* String实现了Serializable接口:表示字符串是支持序列化的
* 实现Comparable接口:表示可以比较大小
* String内部定义了final char[] value用于存储字符串数据
* String代表不可变的字符序列
*
*/
@Test
public void test() {
String string = "abc";//字面量的定义方式,此实abc是在方法区的字符串常量池(区别于new方式)字符串常量池是不会存储相同的字符串常量
String string2 = "abc";
System.out.println(string==string2);//返回的是true,因为是字符串常量池同一个字符串
string = "hello";//这是并不会改变abc因为value是final的,这时候会重新在字符串常量新建一个hell字符串常量
System.out.println(string2);//此时输出的还是abc,
System.out.println("*****************************************************");
String string3 = "abc";//此时string3和string2引用的同一个字符串常量
string3 = string3 + "de";//此时的string3又在字符串常量池新建了一个字符串常量,
System.out.println(string3==string2);//此时返回false
String string4 = "abc";
System.out.println(string4);
System.out.println(string4.replace("a","m"));//调用rplace方法时,此时又是在字符串常量池新建一个
}
//
@Test
public void test2() {
/**
* String的实例化方式
* 1.通过字面量定义
*
* 2.通过new关键字
*
* String string = new String("abc")创建了两个对象
* 一个是堆空间中new的结构,另一个是字符串常量池的数据“abc"
*/
String s1 = "abc";
String s2 = "abc";
//此时s3,s4的地址保存在堆空间中
String s3 = new String("abc");
String s4 = new String("abc");
//s3,s4地址相同吗?
System.out.println(s3==s4);
//s1,s4地址相同吗
System.out.println(s1==s4);
}
}