当前位置: 首页 > article >正文

java后端开发day15--字符串(一)

在这里插入图片描述
(以下内容全部来自上述课程)

1.API

(Application Programming Interface 应用程序编程接口)

1.简单理解

简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可。
Java API:指的就是JDK中提供的各种功能的Java类。
这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。

已经学习过的API:
Scanner 键盘录入
Random 随机数

2.API帮助文档

帮助开发人员更好的使用API和查询API的一个工具。
使用方法:

  1. 打开API帮助文档
  2. 点击显示,并找到索引下面的输入框
  3. 在输入框中输入类名并点击显示
  4. 查看类所在的包:java.util(比如),就需要导包
  5. 查看类的描述
  6. 查看构造方法
  7. 查看成员方法

2.字符串

1.String

java.lang(不需要导包).String类代表字符串,Java程序中的所有字符串文字(例如"abc")都为此类的对象。

注意点:
字符串的内容是不会发生改变的,它的对象在创建后不能被更改。
字符串拼接会产生一个新的字符串。

2.创建String对象的两种方式

1.直接赋值(常用)

String name = “尼古拉斯”;

2.new

public String() 创建空白字符串,不含任何内容
public String(String original) 根据传入的字符串,创建字符串对象
public String(char[ ] chs) 根据字符数组,创建字符串对象
public String(byte[ ] chs) 根据字节数组,创建字符串对象

package String;public class StringDemo1 {public static void main(String[] args) {//1.使用直接赋值的方式,创建一个字符串对象//"abc" 双引号引起来的内容,就是一个字符串String s1 = "abc";System.out.println(s1);//2.使用new的方式来获取一个字符串对象//空参构造:可以获取一个空白字符串对象,里面不含有任何内容String s2 = new String();System.out.println("@"+s2+"!");//传递一个字符串,根据传递的字符串,在堆内存中,创建一个字符串对象String s3 = new String("abc");System.out.println(s3);//传递一个字符数组,根据传递的字符数组,在堆内存中,创建一个字符串对象//需求:我要修改字符串的内容。 abc Qbc//abc--->>char[] chs = {'a','b','c'}--->{'Q','b','c'}---->>"Qbc"char[] chs = {'a','b','c'};String s4 = new String(chs);System.out.println(s4); //abc//传递一个字节数组,根据传递的字节数组,在堆内存中,创建一个字符串对象//应用场景:以后在网络当中传输的数据其实都是字节信息//我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了。byte[] bys = {97,98,99};String s5 = new String(bys);System.out.println(s5); //abc}
}

3.String的内存分析

1.串池

只存储直接赋值的字符串
在这里插入图片描述

2.直接赋值的内存图

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
不存在:创建新的。
存在:复用。

在这里插入图片描述

3.new的内存图

每new一次就在堆里开辟一块新的小空间。
代码不复用。
在这里插入图片描述

4.字符串的比较

1.==号比的到底是什么?

基本数据类型比较的是数据值。
引用数据类型比较的是地址值。
也就是字符串的比较,字符串内内容相同的情况下,俩赋值必相等,一赋值一new不相等,俩new也不相等。

2.比较方法
  • boolean equals方法(要比较的字符串) 完全一样的结果才是true。否则为false
  • boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较
package String;public class StringDemo2 {public static void main(String[] args) {//1.创建两个字符串对象String s1 = new String("abc");String s2 = "Abc";//2.==号比较//比较基本数据类型:比较的是具体的值//比较引用数据类型:比较的是对象地址值System.out.println(s1 == s2); //falseSystem.out.println("--------");//3.equals()方法//比较基本数据类型:比较的是具体的值//比较引用数据类型:比较的是对象地址值System.out.println(s1.equals(s2)); //falseSystem.out.println("--------");//4.equalsIgnoreCase()方法:忽略大小写//忽略大小写只能是英文状态下的a 和 A//比较基本数据类型:比较的是具体的值//比较引用数据类型:比较的是对象地址值System.out.println(s1.equalsIgnoreCase(s2)); //trueSystem.out.println("--------");}
}

小拓展:
键盘录入和直接赋值的也是不一样的。
键盘录入的本质就是new。

结论:以后只要是想比较字符串的内容,就必须要用String里面的方法。

3.练习

1.用户登录

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

package String;import java.util.Scanner;public class StringDemo3 {public static void main(String[] args) {//读题拆解法//1.定义两个变量记录正确的用户名和密码String username = "admin";String password = "123456";//4.给三次机会,让用户登录for (int i = 0; i < 3; i++) {//2.键盘录入用户名和密码Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String name = sc.next();System.out.println("请输入密码:");String pwd = sc.next();//3.比较//3.1先比较用户名//3.2再比较密码//3.3如果都正确,提示登录成功//3.4如果有一个错误,提示登录失败if (name.equals(username) && pwd.equals(password)) {System.out.println("登录成功");break;} else {if (i == 2) {System.out.println("您的账户已被锁定,请联系管理员");} else {System.out.println("登录失败,"+"您还剩"+(2-i)+"次机会");}}}}
}

2.遍历字符串

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

方法:

  • public char charAt(int index):根据索引返回字符
  • public int length():返回此字符串的长度
  • 数组的长度:数组名.length
  • 字符串的长度:字符串的对象.length()
package String;import java.util.Scanner;public class StringDemo4 {public static void main(String[] args) {//1.键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.next();//2.进行遍历for(int i = 0; i < s.length(); i++){//i 依次表示字符串的每一个索引char c = s.charAt(i);System.out.println(c);}}
}

3.统计字符次数

键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)

package String;import java.util.Scanner;public class StringDemo5 {public static void main(String[] args) {//1.键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.next();//2.统计大写字母、小写字母、数字字符个数int bigCount = 0;int smallCount = 0;int numberCount = 0;for (int i = 0; i < s.length(); i++) {//i 表示字符串中的每一个索引char c = s.charAt(i);if (c >= 'A' && c <= 'Z') {//char类型的变量在参与计算的时候自动类型提升为int,查询ASCII表bigCount++;}else if (c >= 'a' && c <= 'z') {smallCount++;}else if (c >= '0' && c <= '9') {numberCount++;}}//3.输出结果System.out.println("大写字母有"+bigCount+"个");System.out.println("小写字母有"+smallCount+"个");System.out.println("数字字符有"+numberCount+"个");}
}

4.拼接字符串

定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
例如:
数组为int[] arr = {1,2,3};
执行后的输出结果为:[1,2,3]

package String;public class StringDemo6 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};String s = arrayToString(arr);System.out.println(s);}//1.我要干嘛? 遍历数组并把数组拼接成字符串//2.需要什么? 数组//3.干完了需要返回么? 需要,返回一个拼接之后的字符串public static String arrayToString(int[] arr){if(arr == null){return null;}if(arr.length == 0){return "[]";}//当代码执行到这里表示什么?//表示数组不是mull,也不是长度为0的数组String s = "[";for(int i = 0; i < arr.length; i++){//i 索引 arr[i] 元素if(i == arr.length - 1){ //最后一个元素直接拼接s = s + arr[i];}else{s = s + arr[i] + ", ";  //不是最后一个元素拼接逗号}}s = s + "]";return s;}
}

5.反转

定义一个方法,实现字符串反转。
键盘录入一个字符串,调用该方法之后,在控制台输出结果。
例如:键盘录入abc,输出结果cba

package String;public class StringDemo7 {public static void main(String[] args) {String s = "abc";String s1 = reverse(s);System.out.println(s1);}//1.我要干嘛? 把字符串反转//2.需要什么? 字符串//3.干完了需要返回么? 需要,返回一个反转之后的字符串public static String reverse(String s) {//abcString result = "";for (int i = s.length()-1; i >= 0; i--) {//i 依次表示字符串的最后一个字符的索引,依次往前char c = s.charAt(i);result = result + c;}return result;}
}

6.金额转换(较难)

2135 (逆推)----->> 零佰零拾零万贰仟壹佰叁拾伍元---->>零零零贰壹叁伍------->>贰壹叁伍
查表法:
在这里插入图片描述
思路很重要!!!
在这里插入图片描述

package String;import java.util.Scanner;public class Cash {public static void main(String[] args) {//1.键盘输入一个金额Scanner sc = new Scanner(System.in);int money = sc.nextInt();while(true){//2.判断金额是否合法if(money >= 0 && money <= 9999999){break;} else{System.out.println("输入金额有误");}}//定义一个变量用来拼接最终的大写金额String result = "";//3.得到money里的每一位数字再转成中文while(true){//从右往左获取每一位数字int ge = money % 10;String s = digitToString(ge);//把转换之后的大写拼接到result中result = s + result;//去掉刚刚获取的这一位数字money = money / 10;//如果数字上的每一位都获取过了,那么money就为0了,此时循环结束if(money == 0){break;}}//4.在前面补全零int count = 7 - result.length();for(int i = 0; i < count; i++){result = "零" + result;} //零零零壹贰叁伍//5.插入单位//定义一个字符串数组表示单位String[] arr = {"佰", "拾", "万", "仟", "佰", "拾", "元"};//                零   零    零    贰    壹     叁    伍String result2 = "";//遍历result,依次得到每一位数字,然后跟单位拼接for(int i = 0; i < result.length() ; i++){char c = result.charAt(i);//把大写数字和单位拼接到一起result2 = result2+ c + arr[i];}//6.打印最终的结果System.out.println(result2);}//1.我要干嘛? 把金额转换为大写//2.需要什么? 金额//3.干完了需要返回么? 需要,返回一个大写的字符串public static String digitToString(int number) {//1.定义一个字符串数组表示大写金额的每一位String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};//2.返回对应的大写return arr[number];}}

7.手机号屏蔽

13112349468 ----->> 131 **** 9468

方法:
String substring(int beginIndex,int endIndex) 截取
注意:包头不包尾,包左不包右
只有返回值才是截取的小串

String substring(int beginIndex) 截取到末尾

package String;public class StringDemo8 {public static void main(String[] args) {//1.获取一个手机号String phone = "13112349468";//2.截取前三位String s = phone.substring(0,3);//3.截取后四位String s1 = phone.substring(7);//4.拼接String result = s + "****" + s1;System.out.println(result);}
}

8.身份证号码信息查看

7~14位:出生年、月、日
17位:性别(奇数男,偶数女)

输出:
出生年月日:XXXX年X年X日
性别为:男/女

package String;public class StringDemo9 {public static void main(String[] args) {//1.定义一个字符串记录身份证号码String id = "11010119900307001X";//2.获取出生年月日String year = id.substring(6,10);String month = id.substring(10,12);String day = id.substring(12,14);//3.拼接String date = year + "年" + month + "月" + day + "日";System.out.println(date);//4.获取性别char gender = id.charAt(16); //'3' ----> 3//字符转换为数字//利用ASCII码表//'0' ---> 48//'1' ---> 49//'2' ---> 50//'3' ---> 51//...//'9' ---> 57int num = gender - 48;//5.判断奇偶性if(num % 2 == 0){System.out.println("女");} else{System.out.println("男");}}
}

9.游戏骂人敏感词替换

方法:
String replace(旧值,新值) 替换
注意点:只有返回值才是替换之后的结果

package String;public class StringDemo10 {public static void main(String[] args) {//1.获取到说的话String s = "你玩的很好,以后不要再玩了,TMD";//2.定义一个敏感词库String[] arr = {"TMD", "CNM", "SB"};//3.遍历敏感词库,依次跟要说的话比较for(int i = 0; i < arr.length; i++){//arr[i] 敏感词if(s.contains(arr[i])){s = s.replace(arr[i], "***");}}//4.打印替换之后的结果System.out.println(s);}
}

相关文章:

java后端开发day15--字符串(一)

&#xff08;以下内容全部来自上述课程&#xff09; 1.API &#xff08;Application Programming Interface 应用程序编程接口&#xff09; 1.简单理解 简单理解&#xff1a;API就是别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接使用即可。 Java API&…...

vue项目 Axios创建拦截器

Axios 1. Axios 和 Ajax 简介2. Axios 和 Ajax 的区别3. 从 按钮 到 Axios请求后端接口的 大致顺序 1. Axios 和 Ajax 简介 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09; 不是一种技术&#xff0c;而是一个编程技术概念&#xff0c;核心是通过 XMLHttpReques…...

NLP面试之-激活函数

一、动机篇 1.1 为什么要有激活函数&#xff1f; 数据角度&#xff1a;由于数据是线性不可分的&#xff0c;如果采用线性化&#xff0c;那么需要复杂的线性组合去逼近问题&#xff0c;因此需要非线性变换对数据分布进行重新映射;线性模型的表达力问题&#xff1a;由于线性模型…...

深入探究 Go 语言中的 Fx 框架:依赖注入的强大工具

在软件开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是一种重要的设计模式&#xff0c;它可以帮助我们降低代码的耦合度&#xff0c;提高代码的可测试性和可维护性。Go 语言作为一门高效、简洁的编程语言&#xff0c;拥有许多优…...

Notepad++ 中删除所有以 “pdf“ 结尾的行

Notepad 中删除所有以 “pdf” 结尾的行 操作步骤 1.打开文件&#xff1a; 在 Notepad 中打开你需要处理的文本文件。 2.打开查找和替换对话框&#xff1a; 按快捷键 Ctrl F&#xff0c;打开“查找和替换”对话框。 3.启用正则表达式模式&#xff1a; 在对话框的底部&#xf…...

b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)

问题陈述 我们有两个多臂老虎机&#xff08;Multi-Armed Bandit&#xff09;&#xff0c;分别称为左边的老虎机和右边的老虎机。每个老虎机的奖励服从不同的正态分布&#xff1a; 左边的老虎机&#xff1a;奖励服从均值为 500&#xff0c;标准差为 50 的正态分布&#xff0c;即…...

数据结构与算法之排序算法-插入排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; &…...

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…...

【核心特性】从鸭子类型到Go的io.Writer设计哲学

在编程语言的设计中&#xff0c;鸭子类型和接口设计是两种非常重要的理念。它们都强调了对象的行为和能力&#xff0c;而非其具体的类型或继承关系。Go 语言的io.Writer 接口是这种设计理念的典型代表&#xff0c;它通过简洁的接口定义&#xff0c;实现了强大的功能和灵活性。 …...

InfiniBand与IP over InfiniBand(IPOIB):实现高性能网络通信的底层机制

在现代高性能计算(HPC)和数据中心环境中,网络通信的效率和性能至关重要。InfiniBand(IB)作为一种高性能的串行计算机总线架构,以其低延迟、高带宽和高可靠性而广泛应用于集群计算和数据中心。IP over InfiniBand(IPOIB)则是在InfiniBand网络上实现IP协议的一种方式,它…...

vue2和vue3插槽slot最通俗易懂的区别理解

在 Vue 的组件通信中&#xff0c;slot&#xff08;插槽&#xff09;的编译优化是一个重要的性能提升点。以下是 Vue2 和 Vue3 在 slot 处理上的差异及优化原理&#xff0c;用更直观的方式解释&#xff1a; Vue2 的 Slot 更新机制 想象一个父子组件场景&#xff1a; 父组件&am…...

在 Go 中实现事件溯源:构建高效且可扩展的系统

事件溯源&#xff08;Event Sourcing&#xff09;是一种强大的架构模式&#xff0c;它通过记录系统状态的变化&#xff08;事件&#xff09;来重建系统的历史状态。这种模式特别适合需要高可扩展性、可追溯性和解耦的系统。在 Go 语言中&#xff0c;事件溯源可以通过一些简单的…...

七、I2C通信读取LM75B温度

7.1 概述 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种同步、多主从、串行通信协议&#xff0c;由飞利浦公司开发&#xff0c;主要用于短距离通信&#xff0c;尤其在集成电路之间。 7.1.1 主要特点 两线制&#xff1a;仅需SDA&#xff08;数据线&#xff09;…...

Python 调用 Azure OpenAI API

在人工智能和机器学习快速发展的今天,Azure OpenAI 服务为开发者提供了强大的工具来集成先进的 AI 能力到他们的应用中。本文将指导您如何使用 Python 调用 Azure OpenAI API,特别是使用 GPT-4 模型进行对话生成。 准备工作 在开始之前,请确保您已经: 拥有一个 Azure 账户…...

Spring Boot 配置JPA数据库主从读写分离失败及解决办法

因为是老项目, Spring Boot 是1.4, 使用 AbstractRoutingDataSource 来做主从切换, 配置切面类在进入事务时切换成主库, 但实际运行起来却失败, 写操作路由到了从库 查了很多文章, 试了很多方法都无效, 包括修改注解 Transactional 的 propagation 属性, 清空主从标记等等 打…...

基于华为云镜像加速器的Docker环境搭建与项目部署指南

基于华为云镜像加速器的Docker环境搭建与项目部署指南 一、安装Docker1.1 更新系统包1.2 安装必要的依赖包1.3 移除原有的Docker仓库配置(如果存在)1.4 添加华为云Docker仓库1.5 安装Docker CE1.6 启动Docker服务1.7 验证Docker是否安装成功1.8 添加华为云镜像加速器地址二、…...

讲解下SpringBoot中MySql和MongoDB的配合使用

在Spring Boot中&#xff0c;MySQL和MongoDB可以配合使用&#xff0c;以充分发挥关系型数据库和非关系型数据库的优势。MySQL适合处理结构化数据&#xff0c;而MongoDB适合处理非结构化或半结构化数据。以下是如何在Spring Boot中同时使用MySQL和MongoDB的详细讲解。 1. 添加依…...

CSS 属性选择器详解与实战示例

CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器&#xff0c;它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中&#xff0c;属性选择器不仅可以提高代码的可维护性&#xff0c;而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例&#xff0c;从基础…...

2025 游戏试玩打码平台PHP源码

源码介绍 2025 游戏试玩打码平台PHP源码 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 源码程序采用yii框架phpMysql语言开发 功能完善&#xff0c;无后门 程序功能有: 1.游戏试玩功能 2.广告体验功能 3.打码功能 4.新人任务 5.开启宝箱功能 6.站长联盟功能 7.兑换商城功…...

【Matlab算法】基于人工势场的多机器人协同运动与避障算法研究(附MATLAB完整代码)

📚基于人工势场的多机器人协同运动与避障算法研究 摘要1. 引言2. 方法说明2.1 人工势场模型2.2 运动控制流程3. 核心函数解释3.1 主循环结构3.2 力计算函数4. 实验设计4.1 参数配置4.2 测试场景5. 结果分析5.1 典型运动轨迹5.2 性能指标6. 总结与建议成果总结改进方向附录:完…...

自动化办公|xlwings 数据类型和转换

xlwings 数据类型和转换&#xff1a;Python 与 Excel 的桥梁 在使用 xlwings 进行 Python 和 Excel 数据交互时&#xff0c;理解两者之间的数据类型对应关系至关重要。本篇将详细介绍 Python 数据类型与 Excel 数据类型的对应关系&#xff0c;以及如何进行数据类型转换。 一、…...

北斗导航 | 基于多假设解分离(MHSS)模型的双星故障监测算法(MATLAB代码实现——ARAIM)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 双星故障监测算法 一、多星故障MHSS模型流程1、数据预处理2、构建假设模…...

部署 ollama + deepseek + open-webui 遇到的常见问题与解决建议

前言 前面部署了 ollama deepseek open-webui 这里聊聊部署过程中遇到的一些问题和解决方案。 包含 ollama 容器部署 和 本地部署 中所遇问题和解决方案。 1. ollama proxy 网络代理问题 ollama 容器部署 用不了 http https 的 proxy 代理&#xff08;配全局都没用&#xf…...

sql难点

一、 假设你有一个查询&#xff0c;需要根据 id 是否为 null 来动态生成 SQL 条件&#xff1a; xml复制 <select id"getResources" resultType"Resource">SELECT * FROM resources<where><if test"id ! null">and id <!…...

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…...

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…...

elment-plus的表单的其中一项通过了验证再去走别的函数怎么写,不是全部内容通过验证

<template> <el-form ref"formRef" :model"formData" :rules"formRules"> <el-form-item label"身份证号" prop"idCard"> <el-input v-model"formData.idCard" blur"getDetail()"…...

蓝桥杯试题:归并排序

一、问题描述 在一个神秘的岛屿上&#xff0c;有一支探险队发现了一批宝藏&#xff0c;这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字&#xff0c;代表了其珍贵程度。然而&#xff0c;由于某种神奇的力量&#xff0c;这批宝藏的顺序被打乱了&#xff0c;探险队…...

Untiy3d 铰链、弹簧,特殊的物理关节

&#xff08;一&#xff09;铰链组件 1.创建一个立方体和角色胶囊 2.给角色胶囊挂在控制脚本和刚体 using System.Collections; using System.Collections.Generic; using UnityEngine;public class plyer : MonoBehaviour {// Start is called once before the first execut…...

Visual Studio 进行单元测试【入门】

摘要&#xff1a;在软件开发中&#xff0c;单元测试是一种重要的实践&#xff0c;通过验证代码的正确性&#xff0c;帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试&#xff0c;包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...