目录
一、认识String类及学会使用
1.三种构造方式
2.认识String类
3.String引用类型的比较
二、字符/串查找方法
1.charAt(int index)方法
2indexOf() 方法
3.lastIndexOf() 方法
三、字符串转换方法
1.数字转字符串方法
2.字符串转数字方法
3.大小写转换方法
4.字符串转数组
5.字符串格式化
四、字符串的替换、拆分与截取方法
1.字符串替换
2.字符串拆分
3.字符串截取
4.其他方法
五、String类的总结
1.字符串不可改变
2.不可修改的原因
六、StringBuilder和StringBuffer
1.StringBuilder与StringBuffer介绍
2.三者关系与区别
(1)直接使用常量构造
public static void main(String[] args) {
String str = "I love you";
System.out.println(str);
}
内存展示图:
(2)new一个String对象
public static void main(String[] args) {
String str2 = new String("love you too");
System.out.println(str2);
}
(3)使用数组进行构造
public static void main(String[] args) {
char[] arr = {'6','6','6'};
String str3 = new String(arr);
System.out.println(str3);
}
为什么String的内存布局是这样呢?就需要先往下了解String类
(1)String类
(2)String类的空间分配
String str = new String("abcd");
(1)比较字符串是否相等
public static void main(String[] args) {
String str1 = new String("abcd");
String str2 = new String("abcd");
System.out.println(str1==str2);
if(str1==str2) {
System.out.println("字符串str1==字符串str2");
}else {
System.out.println("字符串str1!=字符串str2");
}
}
错误原因:它们都属于引用类型,不能直接用等号(==)比较;而用等号比较则比较的是它们对象的地址
public static void main(String[] args) {
String str1 = new String("abcd");
String str2 = new String("abcd");
System.out.println(str1.equals(str2));
}
这是String类重写equals的原码:需要使用String类型的变量去调用才会使用该方法
Object(父类)的equals方法:
画图解析:
String类的equals方法
Object类的方法:如果没有去使用String变量去调用equals方法,而直接使用==号比较,本质会默认调用Object的equals方法
代码举例:
public static void main(String[] args) {
String str1 = new String("abcd");
String str2 = new String("ABCD");
System.out.println(str1.equalsIgnoreCase(str2));
}
(2)比较字符串大小
public static void main(String[] args) {
String str1 = new String("abcd");
String str2 = new String("abce");
String str3 = new String("abc");
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareTo(str3));
}
比较方式:
(1)一一对比它们的ASCII值,如a的ASCII值
(2)字符串长度不一,但是前面有的部分都相同时,长的字符串大;如:abc
返回值:
返回值的数字=它们之间的ASCII的差值;如:aa,则返回1
public static void main(String[] args) {
String str1 = new String("abcd");
String str2 = new String("ABCC");
System.out.println(str1.compareToIgnoreCase(str2));
}
前言:都需要使用String类型来调用
(1)方法认识
功能:返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常
(2)举例
public static void main(String[] args) {
String str = new String("abcdefg");
int index = str.charAt(3);
System.out.println(index);
System.out.println(str.charAt(0));
}
(1)int indexOf(int ch)方法
功能:返回ch第一次出现的位置,没有返回-1
举例:
public static void main(String[] args) {
String str = new String("aabbccdd");
int index = str.indexOf('b');//查找b
System.out.println(index);
System.out.println(str.indexOf('d'));//查找d
}
(2)int indexOf(int ch, int fromIndex)方法
public static void main(String[] args) {
String str = new String("aabbccdd");
System.out.println(str.indexOf('c',2));
}
直接从2位置(第一个b的位置)开始找;如果从d的位置,则会找不到
(3)int indexOf(String str) 方法
功能:返回str第一次出现的位置,没有返回-1
public static void main(String[] args) {
String str = new String("aabbccdd");
System.out.println(str.indexOf("ab"));
}
(4)int indexOf(String str, int fromIndex)方法
功能:从fromIndex位置开始找str第一次出现的位置,没有返回-1
public static void main(String[] args) {
String str = new String("aabbccdd");
System.out.println(str.indexOf("ab",2));
}
(1)int lastIndexOf(int ch) 方法
public static void main(String[] args) {
String str = new String("abcdef");
System.out.println(str.lastIndexOf('b'));
}
(2)int lastIndexOf(int ch, int fromIndex)方法
public static void main(String[] args) {
String str = new String("abcdef");
System.out.println(str.lastIndexOf('b',5));
}
(3)int lastIndexOf(String str) 方法
public static void main(String[] args) {
String str = new String("abcdef");
System.out.println(str.lastIndexOf("abc"));
}
(4)int lastIndexOf(String str, int fromIndex)方法
public static void main(String[] args) {
String str = new String("abcdef");
System.out.println(str.lastIndexOf("abc",2));
}
(1)认识valueOf()
(2)举例
public static void main(String[] args) {
String str = String.valueOf(1234);
System.out.println(str);
}
从数字1234变成字符串1234
一般用于转化数字字符串
(1)认识Integer.parseInt()
(2)举例
public static void main(String[] args) {
int tmp = Integer.parseInt("1234");
System.out.println(tmp);
}
字符串1234变成了数字1234
(1)小写转大写
public static void main(String[] args) {
String str = new String("abcd");
String tmp = str.toUpperCase();
System.out.println(tmp);
}
(2)大写转小写
public static void main(String[] args) {
String str = new String("ABCD");
String tmp = str.toLowerCase();
System.out.println(tmp);
}
(1)字符串转数字
public static void main(String[] args) {
String str = new String("abcde");
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
(2)数字转字符串
public static void main(String[] args) {
char[] ch = {'a','b','c'};
String s = new String(ch);
System.out.println(s);
}
public static void main(String[] args) {
String str = String.format("%d--%d--%d",1999,5,1);
System.out.println(str);
}
(1)替换所有的指定内容
public static void main(String[] args) {
String str = new String("aabbccdd");
String tmp= str.replaceAll("ab","xx");
System.out.println(tmp);
}
(2)只替换第一个指定内容
public static void main(String[] args) {
String str = new String("aabbccdd");
String tmp= str.replaceFirst("a","xx");
System.out.println(tmp);
}
(1)全部按指定拆分
public static void main(String[] args) {
String str = new String("abc def ghi");
String[] tmp = str.split(" ");//以空格作为拆分依据
for (String s:tmp) {
System.out.println(s);
}
}
(2)指定拆分n组
public static void main(String[] args) {
String str = new String("abc def ghi");
String[] tmp = str.split(" ",2);//拆成两组
for (String s:tmp) {
System.out.println(s);
}
}
(3)需要转义的拆分标志
public static void main(String[] args) {
String str = new String("aa.bb.cc");
String[] tmp = str.split("\\.");
for(String s:tmp) {
System.out.println(s);
}
}
public static void main(String[] args) {
String str = new String("aa\\bb\\cc");//两个\\表示一个\
String[] tmp = str.split("\\\\");//四个\表示一个\
for(String s:tmp) {
System.out.println(s);
}
}
public static void main(String[] args) {
String str = new String("aa+bb+cc");
String[] tmp = str.split("\\+");//2个\表示一个\
for(String s:tmp) {
System.out.println(s);
}
}
public static void main(String[] args) {
String str = new String("aa|bb|cc");
String[] tmp = str.split("\\|");//2个\表示一个\
for(String s:tmp) {
System.out.println(s);
}
}
public static void main(String[] args) {
String str = new String("aa*bb*cc");
String[] tmp = str.split("\\*");//2个\表示一个\
for(String s:tmp) {
System.out.println(s);
}
}
(4)拆分多标志
public static void main(String[] args) {
String str = new String("aa-bb cc");
String[] tmp = str.split("-| ");//以-和空格拆分
for(String s:tmp) {
System.out.println(s);
}
}
(1)从指定位置截取到末尾
public static void main(String[] args) {
String str = new String("0123456");
String tmp = str.substring(2);//从2下标开始截取
System.out.println(tmp);
}
(2)截取指定区间
public static void main(String[] args) {
String str = new String("0123456");
String tmp = str.substring(2,5);//截取[2,5)
System.out.println(tmp);
}
public static void main(String[] args) {
String str = new String(" I love you ");
System.out.println(str);//未去空格
System.out.println(str.trim());//去掉空格
}
(1)String类就是用来定义字符串的,而字符串中的内容不可修改
(2) 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
(3)简单认识String类
(1)原因1
String str = "abcd";
(2)原因2
如:
public static void main(String[] args) {
char[] value = {'a','b','c','d'};
value[1] = 'x';//修改数组内容
value = new char[10];//指向新的对象
}
加final前:
加了final后
public static void main(String[] args) {
char[] arr = {'a','b','c','d'};
arr[0] = 'x';
arr[1] = 'q';
String str = new String(arr);
System.out.println(str);
}
前言:SrtingBuilder和StringBuffer都是两个特殊的类,与String类似,都是字符串类型。
(1)StringBuilder
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("abcd");
System.out.println(stringBuilder);
}
public static void main(String[] args) {
StringBuilder stirngBuilder = new StringBuilder("abcd");
stirngBuilder.append("1234");//在字符串后面拼接1234
stirngBuilder.append("xxx").append("ppp");//可以多次拼接
System.out.println(stirngBuilder);//操作的都是同一个对象
}
public static void main(String[] args) {
StringBuilder stirngBuilder = new StringBuilder("abcd");
stirngBuilder.reverse();
System.out.println(stirngBuilder);
}
(2)StringBuffer
public static void main(String[] args) {
StringBuffer stringBuffer =new StringBuffer("abcd");
System.out.println(stringBuffer);
}
(1)StringBuffer与StringBuilder的区别
(2)StringBuilder与String的相互转化
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("abcd");
String str = stringBuilder.toString();
System.out.println(str);
}
public static void main(String[] args) {
String str = new String("abcd");
StringBuilder stringBuilder = new StringBuilder(str);//调用构造方法
System.out.println(stringBuilder);
}
public static void main(String[] args) {
String str = new String("abcd");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
System.out.println(stringBuilder);
}
(3)StringBuffer、StringBuilder和String的区别