1.字符串的创建
- 字符串内容永远不可变
- 因为字符串不可变,所以字符串是可以共享使用的
- 字符串效果上相当于char[]字符数组,但其底层原理是byte[]字节数组
三种构造方法:
- public String(); //创建一个空字符串,没有任何内容
- public String(char[] array); //根据字符数字内容创建字符串
- public String(bytw[] array); //根据字节数组内容创建字符串
直接创建:
- String str=“Hello World”
public class String1 {
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);//ABC
byte[] bytearray = {97, 98, 99};
String str3 = new String(bytearray);
System.out.println(str3);//abc
}
}
2.字符串常量池
程序中直接写上双引号的字符串,就在字符串常量池中
- 对于基本类型来说,==是进行数值的比较
- 对于引用类型来说,==是进行地址值的比较
public class String2 {
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
}
}
其大致原理为:双引号创建的字符串在常量池中,字符串的底层就是字节数组名叫value,所以字符串常量池中的对象,实质上保存的是byte字节数组的地址值,当创建str2时,常量池中已经有了字符串abc,所以会直接重复利用该地址值,所以其地址值相同。
而字符数组创建的字符串,由于数组本身是储存在堆中,使用时会将字符数组转化为字节数组,然后new一个String对象在堆中而不在池中。将字节数组的地址赋给String对象
3.字符串的比较
比较:public boolean equals(Object obj);
参数可以是任何对象,但只有当参数是一个字符串且内容相同时才会返回true,否则false
注意:
- 任何对象都能用Object进行接收
- equals方法具有对称性,即可表示为a.equals(b),也可表示为b.equals(a)
- 如果比较双方一个常量一个变量,推荐把常量字符串写在前面,因为当字符串为null作为参数时时会出现空指针异常
忽略大小写的比较:public boolean equalsIgnoreCase(String str);
public class String3 {
public static void main(String[] args) {
String str1="abcd";
String str2="abcd";
char[] array={'a','b','c','d'};
String str3=new String(array);
String str4="ABCD";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
//此时比较的是值而不是地址,所以返回true
System.out.println(str1.equals(str4));//false
System.out.println("abcd".equals(str1));//true
System.out.println(str1.equals("abcd"));//true
System.out.println(str1.equalsIgnoreCase(str4));//true
}
}
4.字符串获取相关方法
获取字符个数,字符串长度:public int length();
将当前字符串和参数字符串拼接为新字符串:public String concat(String str);
获取指定索引位置的字符:public char charAt(int index);
查找参数字符串在字符串当中首次出现的索引位置:public int indexOf(String str);
public class String4 {
public static void main(String[] args) {
String str1="abcde";
String str2="fghij";
//长度
System.out.println(str1.length());//5
//拼接
String str3=str1.concat(str2);
System.out.println(str3);//abcdefghij
//获取指定索引位置的字符
char ch=str1.charAt(3);
System.out.println(ch);//d
//查找参数字符串在字符串当中首次出现的索引位置
int i=str3.indexOf("cde");
System.out.println(i);//2
}
}
5.字符串截取
截取从参数位置一直到字符串末尾:public String subString(int index);
从begin开始,从end结束,包含begin,不包含end位置:public String substring(int begin, int end);
public class String5 {
public static void main(String[] args) {
String str1="abcdefghij";
String str2=str1.substring(3);
System.out.println(str2);
String str3=str1.substring(3,5);
System.out.println(str3);
}
}
6.字符串转换
将当前字符串拆分为字符数组作为返回值:public char[] toCharArray();
获取当前字符串底层的字符数组:public byte[] getBytes();
将出现的所有老字符串替换为新字符串:public String replace(CharSequence oldString, CharSequence newString);
public class String5 {
public static void main(String[] args) {
String str4="ABCD";
char[] array=str4.toCharArray();//转化为字符数组
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
byte[] array1=str4.getBytes();//转化为字节数组
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
String str5=str4.replace("BC","EF");//替换
System.out.println(str5);
}
}
6.字符串分割
按照参数规则,把字符串分为若干分:public String[] split(String regex);
注意:
- split方法参数其实是一个正则表达式
- 如果用"."(小数点)来切分,应表示为"\\."(因为”.“在正则表达式中有特殊含义)
public class String6 {
public static void main(String[] args) {
//分割
String str11="aaa,bbb,ccc";
String[] array2=str11.split(",");//以","切割字符串并存储在字符串数组中
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}
}