一、前言
从今天开始就要学习字符串了,java中的字符串和其他编程语言的有些许不同,不过大家也不必担心,基本的原理都是相同的,只是代码的实现有些许差异,问题不大。对于字符串习题方面都是些最基础的题目,所以案例分析部分就不逐语句分析了,相信读者们都能够看懂的。温馨提示一下,源代码部分如果要cv的话,记得更改前几行的地址欧。
今天也是十分充实的一天,不知不觉又23点了。
不要放弃,坚持下去!!!
二、字符串简要概述
- 字符串一旦创建,就不能被修改。任何修改字符串的操作都会生成一个新的字符串对象。
- 这意味着,当你对字符串进行拼接、替换等操作时,实际上是创建了一个新的字符串对象,而原来的字符串对象保持不变。
- Java 中的字符串常量都保存在一个字符串池中。当你创建一个字符串常量时,JVM 会首先检查字符串池中是否已经有了这个字符串,如果有则直接返回其引用,如果没有则将其添加到池中。
- 字符串池可以节省内存,因为相同的字符串常量不会被重复创建。
字符串操作方法:
length()
:返回字符串的长度。
charAt(index)
:返回指定索引位置的字符。
substring(beginIndex)
和substring(beginIndex, endIndex)
:返回从指定索引开始到结束的子字符串。
concat(str)
:将指定字符串连接到此字符串的末尾。
toUpperCase()
和toLowerCase()
:将字符串转换为大写或小写。
trim()
:去除字符串两端的空白字符。
startsWith(prefix)
和endsWith(suffix)
:判断字符串是否以指定前缀或后缀开头/结尾。
indexOf(str)
和lastIndexOf(str)
:返回指定子字符串在原字符串中第一次出现的位置和最后一次出现的位置。
三、字符串的创建
字符串的创建方式
直接赋值法:
String s1 = "Hello World";
这种方式直接使用双引号创建字符串对象,它是Java中最常见和简单的字符串创建方式。
使用 new
关键字:
String s2 = new String("Hello World");
这种方式通过 new
关键字显式地创建了一个新的字符串对象。虽然效果上与直接赋值相同,但它会在堆内存中创建一个新的字符串对象。
使用字符数组创建字符串
字符数组创建字符串:
char[] c1 = {'V','O','N'};
String s3 = new String(c1);
System.out.println(s3); // 输出:VON
这里使用字符数组 c1
创建了一个字符串对象 s3
,内容为数组中的字符。
通过 ASCII 值创建字符数组:
char[] c2 = {97,98,99};
System.out.println(c2); // 输出:abc
这种方式通过字符的 ASCII 值创建了字符数组 c2
,然后直接打印字符数组对象,Java会将其转换为对应的字符串输出。
使用字节数组创建字符串
字节数组创建字符串:
byte[] b1 = {97,98,99};
String s4 = new String(b1);
System.out.println(s4); // 输出:abc
这里使用字节数组 b1
创建了一个字符串对象 s4
,内容也是根据字节数组中的 ASCII 值转换而来的字符。
直接赋值法创建字节数组:
byte[] b2 = {'V','O','N'};
String s5 = new String(b2);
System.out.println(s5); // 输出:VON
这种方式和字符数组类似,直接使用字节数组 b2
创建了一个字符串对象 s5
,其内容也是数组中的字符。
四、字符串的比较
字符串比较(使用 ==
运算符)
直接赋值与 new
关键字创建的字符串比较:
String ss1 = "abc";
String ss2 = new String("abc");
System.out.println(ss1 == ss2); // 输出:false
ss1
使用直接赋值方式创建,而ss2
使用new
关键字创建,它们分别位于字符串池和堆内存中的不同位置,因此==
比较的结果为false
。
多次使用 new
关键字创建的字符串比较:
String ss3 = new String("abc");
String ss4 = new String("abc");
System.out.println(ss3 == ss4); // 输出:false
ss3
和ss4
都是使用new
关键字创建的,它们指向不同的堆内存位置,因此==
比较的结果为false
。
直接赋值创建的字符串比较:
String ss5 = "abc";
String ss6 = "abc";
System.out.println(ss5 == ss6); // 输出:true
ss5
和ss6
都是直接赋值方式创建的,它们都指向字符串池中相同的对象,因此==
比较的结果为true
。
使用函数进行字符串比较
使用 equals()
方法比较是否相等:
String ss7 = "abc";
String ss8 = "Abc";
boolean result1 = ss7.equals(ss8);
System.out.println(result1); // 输出:false
equals()
方法比较字符串的内容是否相同,区分大小写,因此result1
的值为false
。
使用 equalsIgnoreCase()
方法比较忽略大小写:
boolean result2 = ss7.equalsIgnoreCase(ss8);
System.out.println(result2); // 输出:true
equalsIgnoreCase()
方法忽略字符串的大小写,因此result2
的值为true
。
思考部分
从用户输入获取字符串比较:
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = "abc";
System.out.println(str1 == str2); // 输出:false
用户输入的字符串
str1
和直接赋值的字符串str2
在内存中的位置不同,因此==
比较的结果为false
。
总结
- 使用
==
运算符比较的是引用的地址,即比较对象是否为同一个实例。- 使用
equals()
方法比较的是字符串的内容是否相同。- 使用
equalsIgnoreCase()
方法可以在忽略大小写的情况下比较字符串内容。- 字符串直接赋值时,如果内容相同,会存储在字符串池中,而使用
new
关键字则会在堆内存中创建新的对象。
五、练习题分析
1. 用户登录
需求:
已知正确的用户名和密码,请用程序实现模拟用户登录。总共三次机会,登录之后给出相应的提示
//练习一:用户登录
//需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共三次机会,登录之后给出相应的提示
//1.定义正确的用户名和密码
String User = "VON";
String Password = "123456";
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
//2.键盘录入用户名和密码
System.out.println("请输入用户名:");
String user = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
//3.比较
if(user.equals(User) && password.equals(Password)){
System.out.println("登录成功");
break;
}else{
if(i==2){
System.out.println("账号"+user+"被锁定");
}else{
System.out.println("用户名或密码有误,您还剩下"+(3-i-1)+"次机会");
}
}
}
实现步骤:
使用 Scanner
对象 sc
来读取用户输入。
通过 for
循环控制用户最多可以尝试三次登录(for (int i = 0; i < 3; i++)
)。
在每次循环中:
提示用户输入用户名和密码。
将输入的用户名和密码与预先定义的正确用户名和密码进行比较。
如果用户名和密码匹配,则输出 "登录成功" 并使用 break
结束循环。
如果用户名或密码不匹配,则根据当前循环次数(即剩余尝试次数)输出相应的提示信息:
若当前为第三次尝试且仍不匹配,则输出 "账号被锁定"。
否则输出 "用户名或密码有误,您还剩下 X 次机会"。
2. 遍历字符串
需求:
输入一个字符串,在控制台遍历输出字符串
//练习二:遍历字符串
//需求:输入一个字符串,在控制台遍历输出字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next();
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
案例分析:
创建一个 Scanner
对象 sc
,用于接收用户的输入。
提示用户输入一个字符串,并使用 sc.next()
方法获取用户输入的字符串。
使用 for
循环遍历字符串 str
:
str.length()
返回字符串的长度,循环条件为 i < str.length()
。
在循环中,使用 str.charAt(i)
获取字符串在位置 i
处的字符。
System.out.println(str.charAt(i))
将获取的字符输出到控制台,每个字符占一行。
3. 统计字符出现次数
需求:
输入一个字符串,统计大小写和数字的数量
//练习三:统计字符次数
//需求:输入一个字符串,统计大小写和数字的数量
int count1=0;
int count2=0;
int count3=0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
//利用ascii比较
/*
for(int i=0;i<s.length();i++){
if(48<=(int)s.charAt(i) && (int)s.charAt(i)<=57){
count1+=1;
}else if(65<=(int)s.charAt(i) && (int)s.charAt(i)<=90){
count2+=1;
}else if(97<=(int)s.charAt(i) && (int)s.charAt(i)<=122){
count3+=1;
}
}*/
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if('0'<=c && c<='9'){
count1++;
}else if('A'<=c && c<='Z'){
count2++;
}else if('a'<=c && c<='z'){
count3++;
}
}
System.out.println("大写字母有"+count2+"个,"+"小写字母有"+count3+"个,"+"数字有"+count1+"个");
统计逻辑:
使用 for
循环遍历字符串 s
中的每个字符。
对于每个字符 c
,通过比较字符的 ASCII 值来判断它属于哪个类别:
如果 c
是数字(即 '0'
到 '9'
之间的字符),则将 count1
自增。
如果 c
是大写字母(即 'A'
到 'Z'
之间的字符),则将 count2
自增。
如果 c
是小写字母(即 'a'
到 'z'
之间的字符),则将 count3
自增。
注:此次注释部分是对ascii进行的比较但是实际上,Java 中的字符可以直接用字符字面值进行比较,这样更简洁和易读。
4. 拼接字符串
public static void main(String[] args) {
//练习四:拼接字符串
int[] arr = {1, 2, 3};
System.out.println(arrToString(arr));
}
public static String arrToString(int[] arr) {
if (arr.length == 0) {
return "[]";
}
if (arr == null) {
return "";
}
String begin = "[";
for (int i = 0; i < arr.length; i++) {
if(i!=arr.length-1){
begin = begin + arr[i] + ", ";
}else{
begin = begin + arr[i];
}
}
begin = begin + "]";
return begin;
}
拼接字符串逻辑:
创建一个初始字符串 begin
,初始化为 "["
,表示数组的开始。
使用 for
循环遍历数组 arr
:
如果当前元素不是数组的最后一个元素(即 i != arr.length - 1
),则将当前元素和逗号加空格 ", "
添加到 begin
中。
如果是数组的最后一个元素,则直接将当前元素添加到 begin
中。
最后,将 "]"
加到 begin
的末尾,形成完整的数组字符串。
5. 字符串反转
public static void main(String[] args) {
//练习五:字符串反转
Scanner sc = new Scanner(System.in);
String str = sc.next();
String result="";
for (int i = 0; i < str.length(); i++) {
result += str.charAt(str.length() - i - 1);
}
System.out.println(result);
}
字符串反转逻辑:
创建一个空字符串 result
,用于存储反转后的结果。
使用 for
循环遍历字符串 str
:
str.charAt(str.length() - i - 1)
表达式获取 str
中倒数第 i+1
个字符(Java 字符串索引从 0 开始)。
将获取的字符依次添加到 result
字符串的末尾,实现字符串的反转。
六、全套源代码展示
1. 用户登录
package com.von.day6;
import java.util.Scanner;
public class text3 {
public static void main(String[]arg){
//练习一:用户登录
//需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共三次机会,登录之后给出相应的提示
//1.定义正确的用户名和密码
String User = "VON";
String Password = "123456";
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
//2.键盘录入用户名和密码
System.out.println("请输入用户名:");
String user = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
//3.比较
if(user.equals(User) && password.equals(Password)){
System.out.println("登录成功");
break;
}else{
if(i==2){
System.out.println("账号"+user+"被锁定");
}else{
System.out.println("用户名或密码有误,您还剩下"+(3-i-1)+"次机会");
}
}
}
}
}
2. 遍历字符串
package com.von.day6;
import java.util.Scanner;
public class text4 {
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++) {
System.out.println(str.charAt(i));
}
}
}
3. 统计字符出现次数
package com.von.day6;
import java.util.Scanner;
public class text5 {
public static void main(String[] args) {
//练习三:统计字符次数
//需求:输入一个字符串,统计大小写和数字的数量
int count1=0;
int count2=0;
int count3=0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
//利用ascii比较
/*
for(int i=0;i<s.length();i++){
if(48<=(int)s.charAt(i) && (int)s.charAt(i)<=57){
count1+=1;
}else if(65<=(int)s.charAt(i) && (int)s.charAt(i)<=90){
count2+=1;
}else if(97<=(int)s.charAt(i) && (int)s.charAt(i)<=122){
count3+=1;
}
}*/
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if('0'<=c && c<='9'){
count1++;
}else if('A'<=c && c<='Z'){
count2++;
}else if('a'<=c && c<='z'){
count3++;
}
}
System.out.println("大写字母有"+count2+"个,"+"小写字母有"+count3+"个,"+"数字有"+count1+"个");
}
}
4. 拼接字符串
package com.von.day6;
public class text6 {
public static void main(String[] args) {
//练习四:拼接字符串
int[] arr = {1, 2, 3};
System.out.println(arrToString(arr));
}
public static String arrToString(int[] arr) {
if (arr.length == 0) {
return "[]";
}
if (arr == null) {
return "";
}
String begin = "[";
for (int i = 0; i < arr.length; i++) {
if(i!=arr.length-1){
begin = begin + arr[i] + ", ";
}else{
begin = begin + arr[i];
}
}
begin = begin + "]";
return begin;
}
}
5. 字符串反转
package com.von.day6;
import java.util.Scanner;
public class text7 {
public static void main(String[] args) {
//练习五:字符串反转
Scanner sc = new Scanner(System.in);
String str = sc.next();
String result="";
for (int i = 0; i < str.length(); i++) {
result += str.charAt(str.length() - i - 1);
}
System.out.println(result);
}
}