Java:String用法详解

String是java.lang包下的字符串类,由final修饰,不能被其它类继承。

public final class String

String的底层实现是一个char类型的数组

private final char value[];

因为数组有一个特点,数组一旦创建,长度不能再改变,字符串在创建后,也不能修改。

字符串在内存的保存方式:

字符串是引用类型数据,和一般引用类型数据不同,一般引用数据是保存在堆内存中的,而字符串保存在静态区的字符串常量池
(1)通过字面量直接赋值创建对象s1和s2

String s1 = "abc";
String s2 = "abc";

这种情况下,虚拟机会先去常量池中查看有没有值等于abc的字符串,假设一开始没有,会在常量池中新建一个字符串对象,s1指向该对象,在执行第二条语句时,因为常量池已经存在对象abc,不需要再次创建,s2保存对象地址即可。所以执行System.out.println(s1 == s2);也会正确,因为s1和s2,二者保存的地址是一样的。

(2)通过new关键字创建字符串对象

	String s5 = new String("123");
	String s6 = new String("123");

和第一种情况不同,s5和s6两个引用不再直接保存常量池中的对象地址,而是保存堆内存地址,有几个new关键字,堆内存就开辟几块空间,然后堆内存保存常量池的对象地址。
在执行第一条语句时,会在栈、堆、常量池各开辟一块空间,常量池中保存数据123,堆内存指向常量池中该对象的地址,栈内的引用s5保存堆地址。执行第二句时,堆内存开辟第二块空间,也指向常量中的保存123的对象,s6指向该堆。这种情况下,System.out.println(s5 == s6);是false,因为s5和s6保存的是不同的堆地址。

String类创建对象的方式(构造方法)

1、第一种,使用字面量,引用指向常量池对象

	String s1 = "abc";

2、利用public String(String original)构造方法,堆内存保存常量池中的对象地址,s2指向堆地址

	String s2 = new String("abc");

3、字节数组,利用public String(byte bytes[])构造方法`

	byte[] aaa = {
    
     97, 98, 99 };
	String s3 = new String(aaa);
	String s4 = new String(new byte[] {
    
     97, 98, 99 });

4、字节数组 , 截取一部分,调用public String(byte bytes[], int offset, int length)构造方法

	byte[] aaa = {
    
     97, 98, 99 };
	String s5 = new String(aaa, 1, 2);

5、字符数组,调用`public String(char value[])构造方法

	char[] chars = {
    
    'a','b','c','d'};
	String s6 = new String(chars);

6、截取一部分,调用public String(char value[], int offset, int count)

	char[] chars = {
    
    'a','b','c','d'};
	String s7 = new String(chars,2,2);

7、空参

	String s8 = new String();

字符串的拼接

//a和b都是字面量,需要在编译阶段说明临时空间,所以需要通过值确定类型
//在编译阶段,+号会被去掉
String s2 = "a" + "b";
//a和b是变量,编译阶段是不需要确定变量的值的
//在运行的时候,两个字符串变量相加,会自动创建一个StringBuffer对象,然后把两个变量拼接到一起,最终转换为String类型
//以return new String(value, 0, count); 所以s3指向堆内存
String a = "a";
String b = "b";
String s3 = a + b;

猜你喜欢

转载自blog.csdn.net/qq_41504815/article/details/112910016