08_Java中的字符串
Java中的字符串
一、APl(注:Java的默认包是java.lang使用时不需要导包)
1、APl概述:
APl(Application Programming Interface):应用程序编程接口
Java APl:指的就是JDK中提供各种功能的Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些APL如何使用
2、如何使用帮助文档:
右键打开->在索引框中输入Random->查看这个类在那个包下->看类的描述->看构造方法->看成员方法(主要关注:返回值 方法名 参数)
3、APl使用练习
需求:按照帮助文档的使用步骤学习Scanner类的使用,并实现键盘录入一个字符串,最后输出在控制台
package com.itheima_01; /* Scanner: 用于获取键盘录入数据。(基本数据类型,字符串数据) public String nextLine(); 获取键盘录入字符串数据 */ //导包 import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { //创建对象 Scanner sc = new Scanner(System.in); //接收数据 System.out.println("请输入一个字符串数据:"); //快捷生成接收变量 Ctrl + Alt + v String line = sc.nextLine(); //输出结果 System.out.println("你从键盘输入的数据是:" + line); } }
注意:调用方法时,如果方法有明确的返回值,我们用变量接收,可以手动完成,也可以使用快捷键的方式完成(Ctrl + Alt + V)
二、String
1、string概述:
String类在java.lang包下,所以使用时候不需要导包
String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例
也就是说,Java程序中所有双引号字符串,都是String类的对象
字符串的特点:
字符串不可变,它们的值在创建后不能被更改
虽然String的值是不可变的,但是它们可以被共享
字符串相当于字符数组(char[] ),但是底层原理是字节数组(byt[] )
2、String构造方法:
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串数组对象 |
pbulic String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = "abc"; | 直接赋值的方式创建字符串对象,内容就是"abc" |
package com.itheima_02; /* 测试String的几种构造方法 推荐使用直接赋值的方式 */ public class StringDemo01 { public static void main(String[] args) { //public String(); 创建一个空白字符串对象,不含有任何内容 String s1 = new String(); System.out.println("s1:" + s1); //public String(char[] chs); 根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c', '\0'}; //貌似不需要'\0' String s2 = new String(chs); System.out.println("s2:" + s2); //public String(byte[] bys); 根据字节数组的内容,来创建字符串对象 byte[] bys = {97, 98, 99}; //通过对应输入的字节值的 ASCLL码值来生成字母 String s3 = new String(bys); System.out.println("s3:" + s3); //String s = "abc"; 直接赋值的方式创建字符串对象,内容就是abc String s4 = "abc"; System.out.println("s4:" + s4); } }
3、String对象的特点:
1、通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同
char[] chs = {'a', 'b', 'c'}; String s1 = new String(chs); String s2 = new String(chs);
上面代码中,JVM会首先创建一个字符串数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的
2、以 ”“ 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护
String s3 = "abc"; String s4 = "abc";
在上面的代码中,针对第一行代码,JVM会建立一个String对象放在字符串池中,并给s3参考;
第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上同一个对象
4、字符串比较:
使用 == 做比较
基本类型:比较的是数据值是否相同
引用类型:比较的是地址值是否相同
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()
public boolean eauals(Objec anObject); 将此字符串与指定对象进行比较由于我们比较的是字符串对像,所以参数直接传递一个字串
5、String案例:
1、模拟用户登录:
package com.itheima_03; /* 使用String类实现模拟用户登录 */ //导包 import java.util.Scanner; public class StringTest01 { public static void main(String[] args) { //创建对像 Scanner sc = new Scanner(System.in); String username = "张三"; String password = "123456"; //使用for循环实现三次机会 for(int i = 0; i < 3; i++){ //接收输入 System.out.println("请输入用户名:"); String u = sc.nextLine(); //用户名 System.out.println("请输入密码:"); String p= sc.nextLine(); //密码 if(username.equals(u) && password.equals(p)){ System.out.println("正在登录..."); break; } else{ if(i == 2){ System.out.println("你的账户被锁定,请与管理员联系"); } else{ //机会:2 1 0 //i: 0 1 2 System.out.println("你输入的用户名或者密码有误,登录失败!你还有" + (2 - i) + "次机会"); } } } } }
2、遍历字符串:
package com.itheima_03; /* 利用String中的charAt方法来实现字符串的遍历 char charAt(int index); 返回指定索引处的char值 int length(); 返回字符串长度 */ //导包 import java.util.Scanner; public class StringTest02 { public static void main(String[] args) { //创建对象 Scanner sc = new Scanner(System.in); //定义一个变量来接收字符串的传入 System.out.println("请输入一个字符串:"); String str = sc.nextLine(); //Scanner 对象方法nextLine() 用于接收字符串 //使用for循环来遍历字符串中的字符 for(int i = 0; i < str.length(); i++){ //使用charAt方法 System.out.println(str.charAt(i)); } } }
3、统计字符次数
package com.itheima_03; /* 统计字符 大小写,数字字符出现的次数 */ //导包 import java.util.Scanner; public class StringTest03 { public static void main(String[] args) { //定义三个变量统计个数 int x = 0, y = 0, z = 0; //定义一个变量控制语句输出 boolean flag = true; Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串(只含大小写字母、数字)"); String str = sc.nextLine(); //除了使用ASCLL码数字形式外 字符形式也行 'a' <= 字符 <= 'z' for (int i = 0; i < str.length(); i++) { //判断数字 if (str.charAt(i) >= 48 && str.charAt(i) <= 57) { x++; }//判断小写字母 else if (str.charAt(i) >= 97 && str.charAt(i) <= 122) { y++; }//判断大写字母 else if (str.charAt(i) >= 65 && str.charAt(i) <= 90) { z++; } else{ System.out.println("输入了非题目要求的字符!"); flag = false; break; } } //输出结果 if(flag){ System.out.println("数字个数:" + x + "\n" + "小写字母:" + y + "\n" + "大写字母:" + z); } } }
4、拼接字符串:
package com.itheima_03; /* 拼接字符串 需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法 并在控制台输出结果。例如,数组为int[] arr = {1, 2, 3}; ,执行方法后输出结果为:[1, 2, 3] */ public class StringTest04 { public static void main(String[] args){ //静态初始化一个整型数组 int[] arr = {1, 2, 3, 4}; //此方法可以修改数组长度并使用 String s = myToString(arr); System.out.println(s); } //明确 返回值类型 和 参数 public static String myToString (int[] arr){ //定义一个字符串变量用于接收数据并返回 String s = ""; s += "["; for(int i = 0; i < arr.length; i++){ s += arr[i]; //不是最后一个元素时 拼接,用于隔开数据 if(i < arr.length - 1){ s += ","; } } s += "]"; return s; } }
5、字符串反转:
package com.itheima_03; /* 字符串反转 定义一个方法,实现字符串反转 利用String中的提取字符方法:char charAT(int index); */ //导包 import java.util.Scanner; public class StringTest05 { public static void main(String[] args){ //定义一个变量接受从键盘录入的字符串变量 Scanner sc = new Scanner(System.in); System.out.println("请输入一串字符:"); String str = sc.nextLine(); //方法调用 System.out.println("逆序后为:"); inversionString(str); } public static void inversionString(String str){//无返回值的 若是需要返回就定义一个字符串变量依次拼接字符 //利用for逆序遍历字符串 注意格式 for(int i = str.length() - 1; i >= 0; i--){ if(i > 0){ System.out.print(str.charAt(i)); } else{ System.out.println(str.charAt(i)); } } } }
6、通过帮助文档查看String中的方法:
方法名 | 说明 |
---|---|
public boolean equals(Object anObject) | 比较字符串的内容,严格区分大小写(用户名和密码) |
public char charAt(int index) | 返回指定索引处的 char 值 |
public int length() | 返回此字符串的长度(String是类length时方法 与数组区分) |
7、StringBuilder:
由于字符串String追加是会在堆区添加多个字符常量,产生了空间浪费,所以产生StringBuilder来处理这个问题
1、StringBuilder概述:
是一个可变的字符串类,我们可以把它看作是一个容器
这里的可变指的StringBuilder对象中的内容是可以变的
String 和 StringBuilder的区别:
String:内容是不可变的
StringBuilder:内容是可变的
2、StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
package com.itheima_01; /* 测试StringBuilder构造方法: 在java.lang包内无需导包 public StringBuilder(); public StringBuilder(String str); */ public class StringBuilderDemo01 { public static void main(String[] args){ //使用StringBuilder(); 构造方法创建一个空白的可变字符串对象,不含任何内容 StringBuilder sb = new StringBuilder(); System.out.println("sb:" + sb); System.out.println("sb.length():" + sb.length()); //使用StringBuilder(String str); 构造方法创建String字符串内容的可变字符串对象,不含任何内容 StringBuilder sb2 = new StringBuilder("hello"); System.out.println("sb2:" + sb2); System.out.println("sb2.length():" + sb2.length()); } }
3、Stringbuilder的添加和反转方法:
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
package com.itheima_02; /* StringBuilder的添加和反转方法: public StringBuilder append(任意类型); 添加数据,并返回对象本身 public StringBuilder reverse(); 返回相反的字符序列 */ public class StringBuilderDemo01 { public static void main(String[] args) { //创建对象 StringBuilder sb = new StringBuilder(); // //1、使用append()方法添加数据并返回给对象本身 // StringBuilder sb2 = sb.append("hello"); // System.out.println("sb:" + sb); // System.out.println("sb2:" + sb2); // // //测试sb == sb2 比较的是地址值 String中的equals()比较的字符串 // System.out.println(sb == sb2); //由于添加后的返回值是对象本身 所以 == 对应的地址值相同 // sb.append("hello"); // sb.append("world"); // sb.append("java"); // sb.append(100); //因为返回的对象使其本身 即可以使用链式编程思想(调用函数后还是对象 仍然可以继续调用对象的方法) sb.append("hello").append("world").append("java").append(100); System.out.println("sb:" + sb); //2、使用reverse()方法返回相反的字符串序列 sb.reverse(); System.out.println("sb:" + sb ); } }
4、StingBuilder 和 String 相互转换:
4.1、StringBuilder转换为String
public String toString(); 通过toString就可以实现把StringBuilder转换为String
4.2、String转换为StringBuilder
public StringBuilder(String s); 通过构造方法就可以实现把String转换为StringBuilder
package com.itheima_02; /* 实现String和StringBuilder之间的相互转换 */ public class StringBuilderDemo02 { public static void main(String[] args){ //1、StringBuilder 转换为 String StringBuilder sb = new StringBuilder(); sb.append("hello"); //错误示范: //String str1 = sb; //正确示范:使用StringBuilder 中的toString方法 String str = sb.toString(); System.out.println(str); //1、String 转换为 StringBuilder String str2 = "hello"; //错误的方法 //StringBuilder sb2 = str2; //正确示范:使用StringBuilder的一个构造方法 StringBuilder sb3 = new StringBuilder(str2); System.out.println(sb3); } }
5、StringBuilder案例
1、拼接字符串:
package com.itheima_03; /* 使用StringBuilder来实现案例 拼接字符串 */ public class StringBuilderTest01 { public static void main(String[] args){ //使用静态方式定义一个数组 int[] arr = {1, 2, 3, 4}; //调用方法 String str = arrayToString(arr); System.out.println(str); } public static String arrayToString(int[] arr){ String str = ""; //定义一个空的StringBuilder类 StringBuilder sb = new StringBuilder(); sb.append("["); for(int i = 0; i < arr.length; i++){ if(i != arr.length - 1){ sb.append(arr[i]); sb.append(","); } else{ sb.append(arr[i]); } } sb.append("]"); //使用StringBuilder的成员方法 来实现 StringBuilder到String的转换 str = sb.toString(); return str; } }
2、字符串反转:
此处提到了匿名对象:new StringBuilder(str) 使用构造方法构建了匿名对象
//匿名对象 是在: 类名 对象名 = new 构造方法名(即类名)([参数]); //java 的基础上 去掉了等号与其左值: new 构造方法名(即类名)([参数]); //此时系统会自动创建一个临时对象来接收 并在当前语句执行后自动回收掉匿名对象
你可以将这一个理解为一个对象 所以它能够调用reverse() 方法
又因为reverse方法的返回值是对象本身 所以又可以理解为一个变量 又调用了toString方法(链式编程)
package com.itheima_03; /* 使用StringBuilder来实现字符串反转案例 */ //导包 import java.util.Scanner; public class StringBuilderTest02 { public static void main(String[] args) { //从键盘录入一串字符串 System.out.println("请输入一串字符串:"); Scanner sc = new Scanner(System.in); String line = sc.nextLine(); //调用方法 String str = myReverse(line); //输出结果 System.out.println("反转后字符串的结果为:"); System.out.println(str); } public static String myReverse(String str){ // //使用StringBuilder(String str) 构造方法来将String转换为StringBuilder格式 // StringBuilder sb = new StringBuilder(str); // // //使用reverse()方法来反转可变字符串 // sb.reverse(); // // String line = sb.toString(); // return line; //这里使用了 匿名对象 的方式 与上面的实现等价 return new StringBuilder(str).reverse().toString(); } }
8、通过帮助文档查看StringBuilder中的方法:
方法名 | 说明 |
---|---|
public StirngBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
本文作者:如此而已~~~
本文链接:https://www.cnblogs.com/fragmentary/p/16745653.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步