文章目录
- 九.String 字符串类型
- 9.0 String概述
- 9.1 字符串常用方法
- 9.2 String内存图
- 9.2.1直接赋值
- 9.2.2new出来
- 9.3字符串比较
- 9.4 字符串遍历
- 9.4.1 统计字符串大小写及数字
- 9.4.2 拼接字符串
- 9.4.3字符串反转
- 9.5 StringBuilder类
- 9.5.1StringBuilder 构造方法
- 9.5.2StringBuilder常用方法
- 9.5.3 StringBuilder练习
- 9.5.3.1对称字符串
- 9.5.3.2拼接字符串
- 9.6 StringJoiner类
九.String 字符串类型
String:引用数据类型
9.0 String概述
java.lang.String 类代表字符串,java程序中的所有字符串文字(如“abc”)都为此类对象。
- 注意点:字符串内容是不会发生改变的,它的对象在创建后不能被更改
String name1 = "小孔";
String name2 = "你好";System.out.print(name1 + name2);//产生一个新的字符串"小孔你好"
String name3 = "大聪明";name3 = "小聪明";上面为两个字符串
//2.使用new的方式来获取一个字符串对象//空参构造:可以获取一个空白的字符串对象String s2 = new String();System.out.println("@" + s2 + "!");//""//传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象String s3 = new String("abc");System.out.println(s3);//传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象//需求:我要修改字符串的内容。 abc Qbc//abc --> {'a','b','c'} --> {'Q','b','c'} --> "Qbc"char[] chs = {'a', 'b', 'c', 'd'};String s4 = new String(chs);System.out.println(s4);//abcd//传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象//应用场景:以后在网络当中传输的数据其实都是字节信息//我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了。byte[] bytes = {97, 98, 99, 100};String s5 = new String(bytes);System.out.println(s5);//abcd}
9.1 字符串常用方法
方法名 | 说明 |
---|---|
public int indexOf(int ch) | 搜索第一个出现的字符ch(或字符串value),如果没有找到,返回-1 |
public int indexOf(String value) | |
public int lastIndexOf(int ch) | 搜索最后一个出现的字符ch(或字符串value),如果没有找到,返回-1 |
public int lastIndexOf(String value) | |
public String substring(int index) | 提取从位置索引开始的字符串部分 |
public String substring(int begin, int end) | 提取beginindex和endindex之间的字符串部分 |
public String trim() | 返回一个前后不含任何空格的调用字符串的副本, |
Boolean equalsIgnoreCase() | 忽略大小写比较 |
String toLowerCase() | 将字符串转成小写 |
String toUpperCase() | 将字符串装成大写 |
String concat(String) | 拼接字符串,返回拼接后的字符串 |
String replace(被替换字符串 ,新字符串) | 替换字符串,全部替换 |
String replaceAll(正则表达式,新字符串) | 替换字符串,全部替换 |
String[] split(分隔符号) | 分割字符串,返回字符串数组 |
char 字符串.charAt(索引) | 根据字符串索引返回单个字符 |
Boolean endsWith(字符串) | 判断尾部是否包含该字符串 |
Boolean startsWith(字符串) | 判断头部是否包含该字符串 |
public char[] toCharArray() 将字符串中的字符转换为字符数组public char charAt(int index) 索引范围从0 到 length-1.
返回指定索引处的字符。public String[] split(String regex)
public String[] split(String regex, int limit)
用于根据指定的分隔符将字符串分割为子字符串数组
regex:正则表达式,用于匹配分隔符。
limit:分割的最大次数。如果为负数,则表示不限制分割次数。
public class Note02 {public static void main(String[] args) {String str2 = "Hello";String str1 = "hello";// 返回字符串长度System.out.println(str1.length());//5//字符串比较System.out.println(str1.equals(str2));//false// 忽略大小写比较boolean b = str1.equalsIgnoreCase(str2);System.out.println(b);//true// 字符串转换成小写String s = str2.toLowerCase();System.out.println(s);//hello// 转换成大写System.out.println(str1.toUpperCase());//HELLO// 返回第一次出现 l 的索引,从左往右找int index = str1.indexOf("l");System.out.println(index);//2int index1 = str1.indexOf(1);System.out.println(index1);//-1// 返回最后出现 l 的索引,从右往左找int index2 = str1.lastIndexOf("l");System.out.println(index2);//3// 从3索引提取元素,默认到末尾String substring = str1.substring(3);System.out.println(substring);//lo// 从3索引提取元素,到末尾String substring1 = str1.substring(3, str1.length());System.out.println(substring1);//lo// 提取1到3索引的元素,包左不包右String substring2 = str1.substring(1, 3);System.out.println(substring2);//el// 返回前后不含空格的字符串,中间的不算String str3 = " ni hao ";String trim = str3.trim();System.out.println(trim);//ni hao// concat拼接字符串String concat = str1.concat(str2);System.out.println(concat);//helloHello// 截取邮箱后缀String email = "666@qq.c.om";//先找到最后一个.出现的位置,再加一int index5 = email.lastIndexOf(".") + 1;String substring3 = email.substring(index5);System.out.println(substring3);//om// replace(被替换字符串 ,字符串):替换字符串String str4 = "今天天气很好,天气万里无云";String str5 = str4.replace("天气", "**");System.out.println(str5);//今天**很好,**万里无云// replaceAll(正则表达式/字符串,字符串): 全部替换String str6 = "今天1天气2很好3";String newStr6 = str6.replaceAll("\\d", "\\$");System.out.println(newStr6);//今天$天气$很好$// split(分隔符号)String str7 = "张三,小明,李四";String[] splits = str7.split(",");System.out.println(Arrays.toString(splits));//[张三, 小明, 李四]// charAt(索引):字符串根据索引转成 单个字符char c = str7.charAt(0);System.out.println(c);//张// toCharArray():将字符串中的字符转换为字符数组char[] chars = str7.toCharArray();System.out.println(Arrays.toString(chars));//[张, 三, ,, 小, 明, ,, 李, 四]// endsWith(字符串):判断尾部是否包含该字符串String str8 = "11.png";boolean png = str8.endsWith("png");System.out.println(png);//true// startsWith(字符串):判断头部是否包含该字符串boolean b1 = str8.startsWith("1");System.out.println(b1);//true}
}
9.2 String内存图
9.2.1直接赋值
-
字符串存在堆内存里的字符串常量池(即 串池)并且有内存地址,通过等号将内存地址值赋给等号左边,如下图所示,s1和s2通过 地址值匹配对应的字符串。
-
当执行到
String s2 = "abc"
时,会去串池里检查是否有"abc",如果有,会复用此时"abc"的地址值。此时s1和s2指向同一个地址值。 -
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。如果不存在会创建新的地址空间,如果存在则复用。
-
String= " ";表示在堆中开辟了一块空间,来存储空字符串
-
String=null;表示没有在堆中开辟开辟空间
9.2.2new出来
- 每new 一次会会在堆中开辟一小块空间
- s1 和s2记录的是地址值
9.3字符串比较
== 比的是什么?
-
基本数据类型比较的是具体的数据值
-
引用数据类型比较的是地址值
//基本数据类型比较的是具体的数据值,如:
int a = 10;
int b = 20;
System.out.print(a==b);// false========================================================//引用数据类型比较的是地址值,如:String s1 = new String("abc");String s2 = new String("abc");
System.out.print(s1==s2);// false
String s1 = "abc";String s2 = "abc";
//s1 和s2指向同一块内存地址空间。
System.out.print(s1==s2);// true============================================================
String s1 = new String("abc");//记录堆里面的地址值String s2 = "abc";// 记录串池中的地址值
System.out.print(s1==s2);// false
-
equals:比较内容完全一样
比较对象的内容是否相同。
equals()方法存在于Object类中,而Object类是所有类的父类。在Object类中定义了equals方法
-
equalsIgnoreCase:忽略大小写
public static void main(String[] args) {//1.创建两个字符串对象String s1 = new String("abc");String s2 = "Abc";//2.==号比较//基本数据类型:比的是数据值//引用数据类型:比的是地址值System.out.println(s1 == s2);//false//3.比较字符串对象中的内容是否相等boolean result1 = s1.equals(s2);System.out.println(result1);// false//4.比较字符串对象中的内容是否相等,忽略大小写//1 一 壹 这不行//忽略大小写只能是英文状态下的a Aboolean result2 = s1.equalsIgnoreCase(s2);System.out.println(result2);//true
}
9.4 字符串遍历
字符串的长度:字符串对象.length( );
public static void main(String[] args) {// 键盘录入一个字符串,遍历该字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String str = sc.next();for (int i = 0; i < str.length(); i++) {// i 索引 // 字符串str调用charAt方法char c = str.charAt(i);System.out.println(c);// a b c}
9.4.1 统计字符串大小写及数字
-
键盘录入一个字符串,
统计该字符串中的大写字母、小写字母、数字字符的出现次数
public static void main(String[] args) {// 键盘录入Scanner sc =new Scanner(System.in);System.out.print("请输入一个字符串:");String str = sc.next();// 统计变量int bigCount = 0;int smallCount = 0;int numCount= 0;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);//char类型的变量在参与计算的时候自动类型提升为int 查询ascii码表if(c >= 'a' && c<= 'z'){smallCount++;} else if (c >= 'A' && c<= 'z') {bigCount++;} else if (c >= '0' && c <= '9') {// 或者c >= 48 && c <= 57numCount++;}}System.out.println("大写字母有:"+bigCount);System.out.println("小写字母有:"+smallCount);System.out.println("数字有:"+numCount);}
9.4.2 拼接字符串
- 定义一个方法,把int数组中的数据按照指定格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
例如:数组为 int[] arr = {1,2,3}
执行方法后的输出结果为:[1,2,3]
package demo8;public class Test08_04 {public static void main(String[] args) {int[] arr = {1,2,3};String s = arrToStr(arr);System.out.println(s);}//定义方法public static String arrToStr(int[] arr){if (arr == null){return "";}if (arr.length == 0){return "[]";}String res = "[";for (int i = 0; i < arr.length; i++) {if (i == arr.length-1){res = res + arr[i];}else {res = res + arr[i]+",";}}res = res +"]";return res;}
}
9.4.3字符串反转
定义一个方法,实现字符串反转
键盘录入一个字符串,调用该方法后,在控制台输出结果
例如:录入abc 输出cba
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String strr = sc.next();String result = fanzhun(strr);System.out.println(result);}public static String fanzhun(String str){String res = "";//倒着输出for (int i = str.length()-1; i >= 0; i--) {char c = str.charAt(i);res = res + c;}return res;}
}
9.5 StringBuilder类
使用场景:字符串拼接、字符串反转
概述:StringBuilder 可以看成一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率。
StringBuilder类的对象可以看成一个容器,通过自有的方法调用给容器添加数据。
9.5.1StringBuilder 构造方法
方法名 | 说明 | |
---|---|---|
无参构造 | public StringBuder() | 创建一个空白可变的字符串对象,不含有任何内容 |
有参构造 | public StringBuder( String str) | 根据字符串内容,来创建可变字符串对象 |
//调用无参构造StringBuilder sb = new StringBuilder();//调用有参构造
StringBuilder sb = new StringBuilder("abc");
9.5.2StringBuilder常用方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public in length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以把StringBuilder 转换为String |
如下案例:
public static void main(String[] args) {// 创建对象,调用有参StringBuilder sb = new StringBuilder("张三");System.out.println(sb);//张三}
public static void main(String[] args) {// 创建对象StringBuilder sb = new StringBuilder();//2.添加元素sb.append(1);sb.append(2.3);sb.append(true);System.out.println(sb);//12.3true//反转//打印//因为StringBuilder是Java已经写好的类//java在底层对他做了一些特殊处理。打印对象不是地址值而是属性值。sb.reverse();System.out.println(sb);//eurt3.21//获取长度int len = sb.length();System.out.println(len);//8}
public static void main(String[] args) {// 创建对象StringBuilder sb = new StringBuilder();//2.添加字符串sb.append("aaa").append("bbb").append("ccc").append("ddd");System.out.println(sb);//aaabbbcccddd//3.再把StringBuilder变回字符串String str = sb.toString();System.out.println(str);//aaabbbcccddd}
9.5.3 StringBuilder练习
9.5.3.1对称字符串
键盘接受一个字符串,判断是否是对称字符串。
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();// StringBuilder sb= new StringBuilder();// sb.append(str);// sb.reverse();// sb.toString();String res = new StringBuilder().append(str).reverse().toString();if (str.equals(res)){System.out.println("是对称字符串");}else {System.out.println("不是对称字符串");}}
9.5.3.2拼接字符串
定义方法,把int数组中的数据按照指定格式拼接成一个字符串返回,
调用方法,并在控制台输出
如:int[] arr = {1,2,3} 执行方法后为 : [1,2,3]
public static void main(String[] args) {int[] arr = {1,2,3};String res = toGetString(arr);System.out.println(res);}public static String toGetString(int[] arr){StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i < arr.length; i++) {if (i == arr.length-1){sb.append(arr[i]);}else {sb.append(arr[i]+",");}}sb.append("]");// String s = sb.toString();// return s;return sb.toString();}
9.6 StringJoiner类
StringJoiner跟StringBuilder一样,可以看成一个容器,创建以后里面的内容是可变的。
作用:提高字符串的操作效率,
JDK8出现的
StringJoiner的构造方法
方法名 | 说明 |
---|---|
public StringJoiner(间隔符号) | 创建一个StringJoiner对象,指定拼接的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个StringJoiner对象,指定拼接的间隔符号、开始符号、结束符号 |
StringJoiner的成员方法
方法名 | 说明 |
---|---|
public StringJoiner add(添加内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 返回字符串 |
import java.util.StringJoiner;
public class Note {public static void main(String[] args) {StringJoiner sj = new StringJoiner("---");//2.添加元素sj.add("aaa").add("bbb").add("ccc");//3.打印结果System.out.println(sj);//aaa---bbb---ccc}
}
import java.util.StringJoiner;
public class Note {public static void main(String[] args) {StringJoiner sj = new StringJoiner(", ","[","]");//2.添加元素sj.add("aaa").add("bbb").add("ccc");int len = sj.length();System.out.println(len);//15//3.打印System.out.println(sj);//[aaa, bbb, ccc]String str = sj.toString();System.out.println(str);//[aaa, bbb, ccc]}
}