Java 中 String 类的实现详解 及其 数据结构图

String类总述

参考JDK API 1.6 中文版,下载链接如下:

JDK API 1.6 中文版(博客下载)
JDK API 1.6 中文版(网盘下载)

包路径:java.lang.String
String类代表字符串。Java程序中的所有字符串字面值(如 “abc” )都作为此类的实列实现。字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串,因此String 对象是不可变的,所以可以共享。
例如:
String str = “abc”;
等效于:
char date[] = {‘a’, ‘b’, ‘c’};
String str = new String(date);

字符串的特点:
1、字符串的内容永不可变
2、正因为字符串的内容永不可变,所以字符串是可以共享的。
3、字符串效果上相当于字符数组,但是其底层原理是byte[ ]字节数组

常用三种构造方法:
public String(); 创建一个空白字符串,不包含任何内容。
public String(char[] array); 根据字符串的内容,来创建对应的字符串
public String(byte[] arrray); 根据字符串的内容,来创建对应的字符串

字符串常量池:
程序中直接写上的双引号字符串,就在字符串常量池中;
而 new 创建的字符串不在池中;

字符串构造举例

public class egString1{

	public static void main(String[] args){
		//使用空参构造
		String str1 = new String();
		System.out.println(str1);//空白字符串

		//根据字符数组创建字符串
		char[] charArray = { 'A', 'B', 'C'};
		String str2 = new String(charArray);
		System.out.println(str2);

		//根据字节数组创建字符串
		byte[] byteArray = { 97, 98, 99};
		String str3 = new String(byteArray);
		System.out.println(str3);

		//直接创建
		String str4 = "Hello World";
		System.out.println(str4);
	}
}

运行结果(第一行没有东西)


ABC
abc
Hello World

字符串常量池内存图解

public class egString2{

	public static void main(String[] args){
		String str1 = "abc";
		String str2 = "abc";

		char[] charArray = {'a', 'b', 'c'};
		String str3 = new String(charArray);

		System.out.println(str1 == str2);  //true
		System.out.println(str1 == str3);  //false
		System.out.println(str2 == str3);  //false
		//可见 str1 与 str2 地址相同,与 str3 不同
		//对于基本类型来说,==是进行数值的比较,
 		//对于引用类型来说,==是进行地址值的比较

}

程序中直接写上的双引号字符串,就在字符串常量池中; 而 new 创建的字符串不在池中;
常量池的内存图
如图,直接创建两个字符串内容相同的 String 对象 str1 和 str2 ,而字符串常量池中只创建了一个字符串,并给 str1 和 str2 赋上相同的地址值。
通过字符数组创建的字符串,是先创建字符数组,即在堆中创建一个字符数组,然后创建字符串对象 str3 ,通过String(char ch)方法赋值给 str3 ,此过程是先将堆中字符数组(char[ ])转换为底层字节数组(byte[ ]),字符串对象中保存字节数组的地址,str3 中保存字符串对象的地址。
通过字节数组创建同理。

String类中的常用方法

比较
public boolean equals(Object obj); 参数可以是任何对象,只有参数是一个字符串并且内容相同的才会返回true,否则返回false
注意事项:
1、任何对象都能用Object 进行接收
2、equals 方法具有对称性,也就是说 c = a.equals(b); 和 c = b.equals(a); 效果一样
3、如果比较双方一个常量一个变量,推荐把常量写在字符串前面,因为当变量字符串为 null 时,即为null.equals( obj ); 出现空指针异常!
public boolean equalsIgnoreCase(String str); 忽略大小写,进行内容的比较。
不同于“ == ”,以上两种方法是进行字符串内容的比较!

获取:
public int lenth(); 获取字符串中字符的个数
public String concat(String str); 拼接当前字符串和参数字符串
public char charAt(int index); 获取索引位置的单个字符
public int indexOf(String str); 查找参数字符串在本字符串中第一次出现的位置

截取:
public String substring(int index); 截取从参数位置一直到字符串末尾的字符,返回新字符串
public String substring(int begin, int end); 截取从begin开始,一直到end结束,中间的字符串,左闭右开
注意:String str1 = “abc”; str1 = “bcd”;不是字符串的内容发生改变,而是str1中保存的地址值发生改变,"abc"和"bcd"本身没变
所以当字符串的内容发发生改变时,必然是创建了新的字符串

转换:
public char[] toCharArray(); 将当前字符串拆分为字符数组组为返回值
public byte[] getBytes(); 获得当前字符串底层的字符数组
public String replace(CharSequence oldString, CharSequence newString); 将所有出现的老子服串替换称为新字符串,返回替换之后的结果新字符串

分割:
public String[] split(String regex); 按照参数规则(如逗号、空格等),将字符串切割分成若干部分。
参数是一个“正则表达式”,如果给定参数为一个 “.” 时,分割不成功,因为 “.” 有特定含义。如需按 “.” 切割,参数应为 “\\.” 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值