首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >java《字符串基础篇》--字符串全套知识点总结及其配套习题逐语句分析(附带全套源代码)

java《字符串基础篇》--字符串全套知识点总结及其配套习题逐语句分析(附带全套源代码)

作者头像
@VON
发布于 2025-12-17 09:37:03
发布于 2025-12-17 09:37:03
4950
举报

一、前言

从今天开始就要学习字符串了,java中的字符串和其他编程语言的有些许不同,不过大家也不必担心,基本的原理都是相同的,只是代码的实现有些许差异,问题不大。对于字符串习题方面都是些最基础的题目,所以案例分析部分就不逐语句分析了,相信读者们都能够看懂的。温馨提示一下,源代码部分如果要cv的话,记得更改前几行的地址欧。

今天也是十分充实的一天,不知不觉又23点了。

不要放弃,坚持下去!!!

二、字符串简要概述

  1. 字符串一旦创建,就不能被修改。任何修改字符串的操作都会生成一个新的字符串对象。
  2. 这意味着,当你对字符串进行拼接、替换等操作时,实际上是创建了一个新的字符串对象,而原来的字符串对象保持不变。
  3. Java 中的字符串常量都保存在一个字符串池中。当你创建一个字符串常量时,JVM 会首先检查字符串池中是否已经有了这个字符串,如果有则直接返回其引用,如果没有则将其添加到池中。
  4. 字符串池可以节省内存,因为相同的字符串常量不会被重复创建。

字符串操作方法:

length():返回字符串的长度。 charAt(index):返回指定索引位置的字符。 substring(beginIndex) 和 substring(beginIndex, endIndex):返回从指定索引开始到结束的子字符串。 concat(str):将指定字符串连接到此字符串的末尾。 toUpperCase() 和 toLowerCase():将字符串转换为大写或小写。 trim():去除字符串两端的空白字符。 startsWith(prefix) 和 endsWith(suffix):判断字符串是否以指定前缀或后缀开头/结尾。 indexOf(str) 和 lastIndexOf(str):返回指定子字符串在原字符串中第一次出现的位置和最后一次出现的位置。

三、字符串的创建

字符串的创建方式

直接赋值法:

代码语言:javascript
复制
String s1 = "Hello World";

这种方式直接使用双引号创建字符串对象,它是Java中最常见和简单的字符串创建方式。

使用 new 关键字:

代码语言:javascript
复制
String s2 = new String("Hello World");

这种方式通过 new 关键字显式地创建了一个新的字符串对象。虽然效果上与直接赋值相同,但它会在堆内存中创建一个新的字符串对象。

使用字符数组创建字符串

字符数组创建字符串:

代码语言:javascript
复制
char[] c1 = {'V','O','N'};
String s3 = new String(c1);
System.out.println(s3);  // 输出:VON

这里使用字符数组 c1 创建了一个字符串对象 s3,内容为数组中的字符。

通过 ASCII 值创建字符数组:

代码语言:javascript
复制
char[] c2 = {97,98,99};
System.out.println(c2);  // 输出:abc

这种方式通过字符的 ASCII 值创建了字符数组 c2,然后直接打印字符数组对象,Java会将其转换为对应的字符串输出。

使用字节数组创建字符串

字节数组创建字符串:

代码语言:javascript
复制
byte[] b1 = {97,98,99};
String s4 = new String(b1);
System.out.println(s4);  // 输出:abc

这里使用字节数组 b1 创建了一个字符串对象 s4,内容也是根据字节数组中的 ASCII 值转换而来的字符。

直接赋值法创建字节数组:

代码语言:javascript
复制
byte[] b2 = {'V','O','N'};
String s5 = new String(b2);
System.out.println(s5);  // 输出:VON

这种方式和字符数组类似,直接使用字节数组 b2 创建了一个字符串对象 s5,其内容也是数组中的字符。

四、字符串的比较

字符串比较(使用 == 运算符)

直接赋值与 new 关键字创建的字符串比较:

代码语言:javascript
复制
String ss1 = "abc";
String ss2 = new String("abc");
System.out.println(ss1 == ss2);  // 输出:false

ss1 使用直接赋值方式创建,而 ss2 使用 new 关键字创建,它们分别位于字符串池和堆内存中的不同位置,因此 == 比较的结果为 false。

多次使用 new 关键字创建的字符串比较:

代码语言:javascript
复制
String ss3 = new String("abc");
String ss4 = new String("abc");
System.out.println(ss3 == ss4);  // 输出:false

ss3 和 ss4 都是使用 new 关键字创建的,它们指向不同的堆内存位置,因此 == 比较的结果为 false。

直接赋值创建的字符串比较:

代码语言:javascript
复制
String ss5 = "abc";
String ss6 = "abc";
System.out.println(ss5 == ss6);  // 输出:true

ss5 和 ss6 都是直接赋值方式创建的,它们都指向字符串池中相同的对象,因此 == 比较的结果为 true。

使用函数进行字符串比较

使用 equals() 方法比较是否相等:

代码语言:javascript
复制
String ss7 = "abc";
String ss8 = "Abc";
boolean result1 = ss7.equals(ss8);
System.out.println(result1);  // 输出:false

equals() 方法比较字符串的内容是否相同,区分大小写,因此 result1 的值为 false。

使用 equalsIgnoreCase() 方法比较忽略大小写:

代码语言:javascript
复制
boolean result2 = ss7.equalsIgnoreCase(ss8);
System.out.println(result2);  // 输出:true

equalsIgnoreCase() 方法忽略字符串的大小写,因此 result2 的值为 true。

思考部分

从用户输入获取字符串比较:

代码语言:javascript
复制
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. 用户登录

需求:

已知正确的用户名和密码,请用程序实现模拟用户登录。总共三次机会,登录之后给出相应的提示

代码语言:javascript
复制
//练习一:用户登录
        //需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共三次机会,登录之后给出相应的提示
        //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. 遍历字符串

需求:

输入一个字符串,在控制台遍历输出字符串

代码语言:javascript
复制
//练习二:遍历字符串
        //需求:输入一个字符串,在控制台遍历输出字符串
        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. 统计字符出现次数

需求:

输入一个字符串,统计大小写和数字的数量

代码语言:javascript
复制
//练习三:统计字符次数
        //需求:输入一个字符串,统计大小写和数字的数量
        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. 拼接字符串

代码语言:javascript
复制
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. 字符串反转

代码语言:javascript
复制
    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. 用户登录

代码语言:javascript
复制
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. 遍历字符串

代码语言:javascript
复制
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. 统计字符出现次数

代码语言:javascript
复制
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. 拼接字符串

代码语言:javascript
复制
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. 字符串反转

代码语言:javascript
复制
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);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、前言
  • 二、字符串简要概述
  • 三、字符串的创建
    • 字符串的创建方式
    • 使用字符数组创建字符串
    • 使用字节数组创建字符串
  • 四、字符串的比较
    • 字符串比较(使用 == 运算符)
    • 使用函数进行字符串比较
    • 思考部分
    • 总结
  • 五、练习题分析
    • 1. 用户登录
      • 需求:
      • 实现步骤:
    • 2. 遍历字符串
      • 需求:
      • 案例分析:
    • 3. 统计字符出现次数
      • 需求:
      • 统计逻辑:
    • 4. 拼接字符串
      • 拼接字符串逻辑:
    • 5. 字符串反转
      • 字符串反转逻辑:
  • 六、全套源代码展示
    • 1. 用户登录
    • 2. 遍历字符串
    • 3. 统计字符出现次数
    • 4. 拼接字符串
    • 5. 字符串反转
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档