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); 按照参数规则(如逗号、空格等),将字符串切割分成若干部分。
参数是一个“正则表达式”,如果给定参数为一个 “.” 时,分割不成功,因为 “.” 有特定含义。如需按 “.” 切割,参数应为 “\\.” 。