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

news2024/11/13 9:48:42

一、前言

从今天开始就要学习字符串了,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):返回指定子字符串在原字符串中第一次出现的位置和最后一次出现的位置。

三、字符串的创建

字符串的创建方式

直接赋值法:

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

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

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

String ss5 = "abc";
String ss6 = "abc";
System.out.println(ss5 == ss6);  // 输出:true

ss5ss6 都是直接赋值方式创建的,它们都指向字符串池中相同的对象,因此 == 比较的结果为 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);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab结合ChatGPT—如何计算置信区间?

​前面分享了带置信区间的折线图和带置信区间的折线散点图的绘图教程&#xff1a; 很多人表示&#xff0c;昆哥&#xff0c;图是很好看啦&#xff0c;但咱不会求置信区间啊&#xff0c;咋办嘞&#xff1f; 说实话&#xff0c;这种事情属于数据处理&#xff0c;一般都是在画图前…

Hadoop3:HDFS-通过配置黑白名单对集群进行扩缩容,并实现数据均衡(实用)

一、集群情况介绍 我的本地虚拟机&#xff0c;一共有三个节点&#xff0c;hadoop102、hadoop103、hadoop104 二、白名单 创建白名单文件whitelist&#xff0c;通过白名单的配置&#xff0c;只允许集群包含102和103两台机器可以存储数据&#xff0c;104无法存储数据。 需求 …

CSS实现超链接标签:鼠标光标为手形、取消下划线、当鼠标悬停时显示下划线

1、鼠标光标为手形 cursor: pointer; 2、显示/取消下划线 text-decoration: none; /* 文本取消下划线 */ text-decoration: underline; /* 文本添加下划线 */ 3、伪类选择器 伪类选择器是 CSS 中已经定义好的选择器&#xff0c;因此程序员不能随意命令。伪类选择器…

深度学习DeepLearning二元分类 学习笔记

文章目录 类别区分变量与概念逻辑回归Sigmoid函数公式决策边逻辑损失函数和代价函数逻辑回归的梯度下降泛化过拟合的解决方案正则化 类别区分 变量与概念 决策边置信度阈值threshold过拟合欠拟合正则化高偏差lambda&#xff08;λ&#xff09; 线性回归受个别极端值影响&…

ElasticSearch 深度分页详解

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/667036768 1 前言 ElasticSearch 是一个实时的分布式搜索与分析引擎&#xff0c;常用于大量非结构化数据的存储和快速检索场景&#xff0c;具有很强的扩展性。纵使其有诸多优点&#xff0c;在搜索领域远超关系型数据库&…

pycharm 占满磁盘

磁盘里没装什么大文件&#xff0c;发现磁盘被占的越来越满&#xff0c;使用工具查看到底是哪个文件如此之大。 发现罪魁祸首是pycharm&#xff01;&#xff01;&#xff01; 根据工具的提示找到对应的路径文件&#xff1a;E:\pycharm\PyCharmCE2022.3\python_packages 发现pa…

五、 计算机网络(考点篇)

1 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。计算机网络的功能&#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标&#xff1a;速率、带宽(频带宽度或传送线路…

java Web学习笔记(三)

文章目录 1. 前置知识2. Vue使用vite构建项目SFC入门使用ref和.value体会响应式数据&#xff08;使用ES6和setup&#xff09; 3. Vue视图渲染技术及其语法模板语法&#xff1a;命令插值表达式渲染双标><中的文本&#xff08;还挺可爱&#xff09;属性渲染命令事件渲染命令…

php安装Imagick扩展 处理pdf为图片

这个方法是使用源码编译安装&#xff0c;适用于php编译安装和包安装。如果有pecl&#xff0c;直接安装就行&#xff0c;我这是因为多个环境怕直接使用pecl工具导致混乱。 由于浏览器显示大量pdf不方便&#xff0c;我这先将pdf转化为图片再显示 如果没有安装php&#xff0c;这是…

智能家居装修怎么布线?智能家居网络与开关插座布置

打造全屋智能家居。计划的智能家居方案以米家系列为主&#xff0c;智能家居联网方案以无线为主。装修前为了装备智能家居做了很多准备工作&#xff0c;本文深圳侨杰智能分享一个智能家居装修和布线方面的心得与实战知识。希望能对大家的装修有所帮助。 ​1.关于网络 如果房子比…

春招冲刺百题计划|堆

Java基础复习 Java数组的声明与初始化Java ArrayListJava HashMapJava String 类Java LinkedListJava Deque继承LinkedListJava SetJava 队列优先队列:第二题用到了 第一题&#xff1a;215. 数组中的第K个最大元素 可以直接使用Arrays.sort()快排&#xff0c;然后return nums…

数据库第六次

视图 salary decimal(10,2) not null default 0 comment ‘工资’, address varchar(200) not null default ‘’ comment ‘通讯地址’, dept_id int comment ‘部门编号’ ); create index idx_name on emp(emp_name); create index idx_birth on emp(birth); create index…

MySQL-日志-优化

目录 介绍一下mysql 的日志 redo log 和binlog 的区别及应用场景 redo log 和 binlog 在恢复数据库有什么区别? redo log 是怎么实现持久化的? redo log除了崩溃恢复还有什么其他作用? &#xff08;顺序写&#xff09; redo log 怎么刷入磁盘的知道吗&#xff1f; 两阶…

2024西安铁一中集训DAY2 ---- 模拟赛(最小生成树 + AC自动机 + 模拟 + rmq)

文章目录 比赛成绩题解A. 江桥的生成树&#xff08;MST&#xff09;B. 江桥的神秘密码&#xff08;AC自动机&#xff0c;ST表&#xff09;C. 江桥的字符距离D. 江桥的防御力测试&#xff08;rmq&#xff0c;乱搞&#xff09; 比赛成绩 估测&#xff1a;60 100 100 0 260 实…

FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

其实代码没有问题&#xff0c;但是我们忽略了一个问题&#xff0c;就是在正常的开发中&#xff0c;肯定是遇到过这样的情况&#xff0c;我们频繁的有客户端链接&#xff0c;断开连接&#xff0c;需要统一的管理这些链接&#xff0c;那么应该如何管理呢。其实可以声明一个类去管…

218.贪心算法:分发糖果(力扣)

核心思想 初始化每个学生的糖果数为1&#xff1a; 确保每个学生至少有一颗糖果。从左到右遍历&#xff1a; 如果当前学生的评分高于前一个学生&#xff0c;则当前学生的糖果数应比前一个学生多一颗。从右到左遍历&#xff1a; 如果当前学生的评分高于后一个学生&#xff0c;则…

01对话系统---文字渐出和停顿效果

实现代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using System.Text.RegularExpressions; using System;/// <summary> /// 增加文本时间停顿功能 /// 增加文字渐出&#xff0c;&#xff08;单个字符逐渐显现&a…

Unity免费领场景多人实时协作地编2人版局域网和LAN联机类似谷歌文档协同合作搭建场景同步资产设置编辑付费版支持10人甚至更多20240709

大家有没有用过谷歌文档、石墨文档、飞书文档等等之类的协同工具呢&#xff1f; Blender也有类似多人联机建模的插件&#xff0c; Unity也有类似的多人合作搭建场景的插件啦。 刚找到一款免费插件&#xff0c;可以支持2人局域网和LAN联机地编。 付费的版本支持组建更大的团队。…

从汇编层看64位程序运行——静态分析和动态分析入门

大纲 GDBIDA总结参考资料 之前一直谈各种相对宏观的工具怎么使用&#xff0c;比如Flink、RabbitMQ等。最近想聊聊比较微观的技术&#xff0c;用各种“显微镜”去看看运行在系统层的二进制码是什么样子。当然二进制码比较难以记忆&#xff0c;于是我会从二进制码的助记符——汇编…

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…