java后端开发day16--字符串(二)

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

1.StringBuilder

因为StringBuilder是Java已经写好的类。
java在底层对他进行了一些特殊处理。
打印对象不是地址值而是属性值。

1.概述

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串操作的效率。

2.构造方法

  • public StringBuilder() 创建一个空白可变字符串的对象,不含有任何内容
  • public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象

3.成员方法

  • public StringBuilder append(任意类型) 添加数据,并返回对象本身
  • public StringBuilder reverse() 反转容器中的内容
  • public int length() 返回长度(字符出现的个数)
  • public String toString() 通过toString()就可以实现把StringBuilder转换成String
package StringBuilder;public class StringBuilderDemo1{public static void main(String[] args) {//1.创建对象StringBuilder sb = new StringBuilder("abc"); //abc//2.添加元素sb.append(1);sb.append(2.3);sb.append(true); //abc12.3true//3.反转sb.reverse();  //eurt3.21cba//4.长度int len = sb.length();System.out.println(len);  //11//5.把StringBuilder变回字符串String str = sb.toString();System.out.println(str);  //eurt3.21cba//System.out.println(sb);}
}

4.链式编程

当我们在调用一个方法的时候,不需要用变量接受他的结果,可以继续调用其他的方法。
举个例子(格式不完全):

int len = getString().substring(1).replace("A","Q").length();
System.out.println(len);   //2public ststic String getString(){Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();return str;   //abc
}

5.简化代码

初始:

sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");

简化后:

sb.append("aaa").append("bbb").append("ccc").append("ddd");

小总结:使用StringBuilder的场景:

  1. 字符串的拼接
  2. 字符串的反转

2.StringJoiner

1.概述

StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
JDK8出现的。

2.构造方法

  • public StringJoiner(间隔符号) 创建一个StringJoiner对象,指定拼接时的间隔符号。
  • public StringJoiner(间隔符号,开始符号,结束符号) 创建一个StringJoiner对象,指定拼接式的三个符号。

3.成员方法

  • public StringJoiner add(添加的内容) 添加数据,并返回对象本身
  • public int length() 返回长度(字符出现的个数)
  • public String toString() 返回一个字符串(该字符串就是拼接之后的结果)
package sj;import java.util.StringJoiner;public class StringJoinerDemo {public static void main(String[] args) {//1.创建对象StringJoiner sj = new StringJoiner(",","[","]");//2.添加元素sj.add("hello");sj.add("world");sj.add("java");int len = sj.length();System.out.println("len:"+len); //18:字符个数//3.打印结果System.out.println(sj); //[hello,world,java]String str = sj.toString();System.out.println(str);  //[hello,world,java]}
}

3.字符串原理

1.字符串存储的内存原理

  • 直接赋值会服用字符串常量池中的
  • new出来的不会复用,而是开辟一个新的空间

2.==号比较的到底是什么?

  • 基本数据类型比较数据值
  • 引用数据类型比较地址值

3.字符串拼接的底层原理

1.等号右边没有变量

拼接的时候没有变量,都是字符串。
触发字符串的优化机制。
在编译的时候就已经是最终的结果了,
复用串池中的字符串。
在这里插入图片描述

2.等号右边有变量

JDK8以前底层会使用StringBuilder:
系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。
拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象。

JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。

小拓展:想查看任何类(String Builder)的源码可以在IDEA里用快捷键ctrl+N
继续查找相关的继承成员(toString)可以用快捷键ctrl+F12
在这里插入图片描述
结论:如果有很多字符串变量进行拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能。

4.StringBuilder提高效率原理图

StringBuilder是一个内容可变的容器。
在这里插入图片描述

5.StringBuilder源码分析

默认创建一个长度为16的字节数组。
添加的内容长度小于16,直接存。
添加的内容大于16会扩容(原来的容量*2+2)
如果扩容之后还不够,以实际长度为准。

快捷键:ctrl+alt+t 快速生成循环代码

4.练习

1.转换罗马数字

键盘录入一个字符串
要求1:长度为小于等于9
要求2:只能是数字
将内容变成罗马数字
下面是阿拉伯数字跟罗马数字的对比关系:
I->1,II->2,III->3,IV->4,V->5,VI->6,VII->7,VIII->8,IX->9
注意点:
罗马数字里面是没有0的,
如果键盘录入的数字包含0,可以变成" "(长度为0的字符串)

方法1(数组):

package String;import java.util.Scanner;public class Test1 {public static void main(String[] args) {/*  键盘录入一个字符串要求1:长度为小于等于9要求2:只能是数字将内容变成罗马数字下面是阿拉伯数字跟罗马数字的对比关系:I->1,II->2,III->3,IV->4,V->5,VI->6,VII->7,VIII->8,IX->9注意点:罗马数字里面是没有0的,如果键盘录入的数字包含0,可以变成" "(长度为0的字符串)*///1.键盘录入一个字符串Scanner sc = new Scanner(System.in);String str = sc.next();while(true){System.out.println("请输入一个字符串:");//2.判断是否符合要求boolean flag = checkStr(str);if(flag){break;} else {System.out.println("当前字符串不符合要求,请重新录入");continue;}}//3.将内容变成罗马数字StringBuilder sb = new StringBuilder();for(int i = 0; i < str.length(); i++){char c = str.charAt(i);int number = c - 48;  //字符0~9对应的数字是48~57String s = toRomanNumerals(number);sb.append(s);}System.out.println(sb);}public static String toRomanNumerals(int number){//1.定义一个字符串数组,用来存储罗马数字String[] arr = {" ","I","II","III","IV","V","VI","VII","VIII","IX"};return arr[number];}public static boolean checkStr(String str){//1.长度是否小于等于9if(str.length() > 9){return false;}//2.只能是数字for(int i = 0; i < str.length(); i++){char c = str.charAt(i);if(c < '0' || c > '9'){return false;}}return true;}
}

方法2(switch):

package String;import java.util.Scanner;public class Test1Case2 {public static void main(String[] args) {/*  键盘录入一个字符串要求1:长度为小于等于9要求2:只能是数字将内容变成罗马数字下面是阿拉伯数字跟罗马数字的对比关系:I->1,II->2,III->3,IV->4,V->5,VI->6,VII->7,VIII->8,IX->9注意点:罗马数字里面是没有0的,如果键盘录入的数字包含0,可以变成" "(长度为0的字符串)*///1.键盘录入一个字符串Scanner sc = new Scanner(System.in);String str = sc.next();while(true){System.out.println("请输入一个字符串:");//2.判断是否符合要求boolean flag = checkStr(str);if(flag){break;} else {System.out.println("当前字符串不符合要求,请重新录入");continue;}}//3.将内容变成罗马数字StringBuilder sb = new StringBuilder();for(int i = 0; i < str.length(); i++){char c = str.charAt(i);String s = changeLuoMa(c);sb.append(s);}System.out.println(sb);}public static String changeLuoMa(char number){String str =switch (number){case '1'-> "I";case '2'->"II";case '3'-> "III";case '4'-> "IV";case '5'-> "V";case '6'-> "VI";case '7'-> "VII";case '8'-> "VIII";case '9'-> "IX";default-> " ";};return str;}public static boolean checkStr(String str){//1.长度是否小于等于9if(str.length() > 9){return false;}//2.只能是数字for(int i = 0; i < str.length(); i++){char c = str.charAt(i);if(c < '0' || c > '9'){return false;}}return true;}
}

2.调整字符串的内容并比较

给定两个字符串,A和B。
A的旋转操作就是将A最左边的字符移动到最右边。
例如,若A=‘abcde’,在移动一次之后结果就是’bcdea’。
如果在若干次调整操作之后,A能变成B,那么返回True。
如果不能匹配成功,则返回false。

方法1(截取):

package String;public class Test2 {public static void main(String[] args) {/*给定两个字符串,A和B。A的旋转操作就是将A最左边的字符移动到最右边。例如,若A='abcde',在移动一次之后结果就是'bcdea'。如果在若干次调整操作之后,A能变成B,那么返回True。如果不能匹配成功,则返回false。*///1.定义两个字符串String A = "abcde";String B = "cdeab";//2.旋转字符串String rotateStr = rotateString(A);System.out.println(rotateStr);//3.旋转并进行比较boolean flag = compare(A,B);//4.输出结果System.out.println(flag);}public static boolean compare(String A,String B){for(int i = 0; i < A.length(); i++){A = rotateString(A);if(A.equals(B)){return true;}}return false;}//作用:旋转字符串,把最左边的字符移动到最右边//形参:旋转前的字符串//返回值:旋转后的字符串public static String rotateString(String str){//套路://如果我们看到要修改字符串的内容//可以有两种办法://1.用substring进行截取,把左边的字符截取出来拼接到右边//2.把字符串变成字符数组,然后把字符数组中的元素进行位置交换,最后再把字符数组变成字符串//第一种:截取思路//获取最左边的字符char c = str.charAt(0);//获取剩余的字符String left = str.substring(1);//把左边的字符拼接到右边String result = left + c;return result;}}

方法2(数组):

package String;public class Test2Case2 {public static void main(String[] args) {/*给定两个字符串,A和B。A的旋转操作就是将A最左边的字符移动到最右边。例如,若A='abcde',在移动一次之后结果就是'bcdea'。如果在若干次调整操作之后,A能变成B,那么返回True。如果不能匹配成功,则返回false。*///1.定义两个字符串String A = "abcde";String B = "cdeab";//2.旋转字符串String rotateStr = rotateString(A);System.out.println(rotateStr);//3.旋转并进行比较boolean flag = compare(A,B);//4.输出结果System.out.println(flag);}public static boolean compare(String A,String B){for(int i = 0; i < A.length(); i++){A = rotateString(A);if(A.equals(B)){return true;}}return false;}//作用:旋转字符串,把最左边的字符移动到最右边//形参:旋转前的字符串//返回值:旋转后的字符串public static String rotateString(String str){//套路://如果我们看到要修改字符串的内容//可以有两种办法://1.用substring进行截取,把左边的字符截取出来拼接到右边//2.把字符串变成字符数组,然后把字符数组中的元素进行位置交换,最后再把字符数组变成字符串//第二种://1.把字符串变成字符数组char[] arr = str.toCharArray();//2.把字符数组中的元素进行位置交换//把最左边的字符移动到最右边,其实就是把字符数组中的第一个元素移动到最后一个位置//定义一个临时变量,临时存储第一个元素char temp = arr[0];//把剩余的元素往前挪一个位置for(int i = 1; i < arr.length; i++){arr[i-1] = arr[i];}//把临时变量存储的元素,赋值给最后一个位置arr[arr.length-1] = temp;//3.把字符数组变成字符串String result = new String(arr);return result;}}

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

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

相关文章

C++效率掌握之STL库:vector函数全解

文章目录 1.为什么要学习vector&#xff1f;什么是vector&#xff1f;2.vector类对象的常见构造3.vector类对象的容量操作4.vector类对象的迭代器5.vector类对象的元素修改6.vector类对象的元素访问7.vector迭代器失效问题希望读者们多多三连支持小编会继续更新你们的鼓励就是我…

人工智障的软件开发-容器化编码环境就绪-java-env

指令接收&#xff1a;「需要万能开发环境」 系统警报&#xff1a;检测到主人即将陷入"环境配置地狱" 启动救赎协议&#xff1a;构建量子化开发容器 终极目标&#xff1a;让"在我机器上能跑"成为历史文物 需求分析&#xff1a;碳基生物的先天缺陷 人类开发…

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口 kkFileView二开系列文章&#xff1a;1 kkFileView源码下载及编译2 Pdf转图片接口2.1 背景2.2 分析2.2 接口开发2.2.1 编写Pdf转图片方法2.2.2 编写转换接口 2.3 接口测试2.3.1 Pdf文件准备2.3.2 pdf2Image 3 部署 kkFileView二开系列文章&#x…

阅读论文笔记《Efficient Estimation of Word Representations in Vector Space》

这篇文章写于2013年&#xff0c;对理解 word2vec 的发展历程挺有帮助。 本文仅适用于 Word2Vect 的复盘 引言 这篇论文致力于探索从海量数据中学习高质量单词向量的技术。当时已发现词向量能保留语义特征&#xff0c;例如 “国王 - 男人 女人≈女王”。论文打算借助该特性&am…

SQL注入(SQL Injection)详解与实战

文章目录 一、什么是SQL注入&#xff1f;二、常见SQL注入类型三、手动注入步骤&#xff08;以CTF题目为例&#xff09;四、CTF实战技巧五、自动化工具&#xff1a;SQLMap六、防御措施七、CTF例题八、资源推荐 一、什么是SQL注入&#xff1f; SQL注入是一种通过用户输入构造恶意…

维护ceph集群

1. set: 设置标志位 # ceph osd set <flag_name> # ceph osd set noout # ceph osd set nodown # ceph osd set norecover 2. unset: 清除标志位 # ceph osd unset <flag_name> # ceph osd unset noout # ceph osd unset nodown # ceph osd unset norecover 3. 标志…

学习threejs,使用PointLight点光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PointLight 二、&…

java连接redis

1.使用 1.创建java工程 2.引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version> </dependency> 3. //1.获取jedis对象&#xff0c;把所有对redis的操作都封装到…

论文笔记(七十二)Reward Centering(一)

Reward Centering&#xff08;一&#xff09; 文章概括摘要1 奖励中心化理论 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…

算法——结合实例了解Minimax算法(极小化极大算法)

计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子&#xff0c;最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏&#xff0c;程序趋向于遵循一个被称为Minimax算法&#xff0c;伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法&#…

腿足机器人之四- 卡尔曼滤波

腿足机器人之四卡尔曼滤波 概率学基础贝叶斯准则熵 卡尔曼滤波扩展卡尔曼滤波信息滤波器 在机器人&#xff08;四足、人形&#xff09;领域&#xff0c;感知和行动的不确定性可能由多种因素引起&#xff0c;如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。 和…

基于AWS云平台的法律AI应用系统开发方案

该方案可实现法律文档处理速度提升300%&#xff0c;关键信息提取准确率可达92%以上&#xff08;基于实际测试数据&#xff09;&#xff0c;适合构建企业级法律智能中台。建议采用分阶段实施策略&#xff0c;优先实现文档解析和智能问答模块。 一、技术栈规划 层级技术组件说明…

使用 GPT-SoVITS 克隆声音,很详细

使用 GPT-SoVITS 克隆声音&#xff0c;很详细 一、前言二、下载三、启动四、克隆声音1、准备克隆音频2、分离人声伴奏3、音频分割4、语音降噪5、ASR工具6、语音文本校对标注工具7、训练模型8、微调训练9、推理 一、前言 最近对文本转语言很感兴趣&#xff0c;但对直接在网站上…

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…

Pygame中自定义事件处理的方法2-2

在《Pygame中自定义事件处理的方法2-1》中提到了处理自定义事件的方法。通过处理自定义事件&#xff0c;可以实现动画等效果。 1 弹跳小球程序 通过处理自定义事件&#xff0c;可以实现弹跳小球程序&#xff0c;如图1所示。 图1 弹跳小球程序 2 弹跳小球程序原理 实现弹跳小…

【Flink快速入门-5.流处理之多流转换算子】

流处理之多流转换算子 实验介绍 前面实验中介绍的算子已经能够满足我们的大部分开发需求了&#xff0c;但是在实际工作中有时候还会遇到一些业务场景&#xff0c;例如需要摄入多个输入流并将其合并处理&#xff0c;或者需要将一条输入流分割为多条子流&#xff0c;在不同的子…

【STM32】DRV8833驱动电机

1.电机如何转动 只需要给电机两个端子加一正一负的极性就会转起来了&#xff0c;但是要注意的是不要将电机两端直接接在5v和gnd之间&#xff0c;这种电机一般要提供几百毫安的电流&#xff0c;而GPIO口只能提供几毫安&#xff0c;所以我们使用一个DRV8833来驱动 DRV8833输入口…

vue2老版本 npm install 安装失败_安装卡主

vue2老版本 npm install 安装失败_安装卡主 特别说明&#xff1a;vue2老版本安装慢、运行慢&#xff0c;建议升级vue3element plus vite 解决方案1&#xff1a; 第一步、修改npm 镜像为国内镜像 使用淘宝镜像&#xff1a; npm config set registry https://registry.npmmir…

Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)

目录 1.认识线程 &#xff08;1&#xff09;进程与线程的关系 &#xff08;2&#xff09;最小执行流 &#xff08;3&#xff09;轻量级进程&#xff08;LWP&#xff09; ①对task_struct的理解 ②轻量级进程 ③LWP和TCB的区别 2.页表与进程地址空间 &#xff08;1&…