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.rhkb.cn/news/19889.html

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

相关文章

【AI实践】deepseek支持升级git

当前Windows 11 WSL的git是2.17&#xff0c;Android Studio提示需要升级到2.19版本 网上找到指导文章 安装git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…

从零复现R1之路[3/3]:一文速览Open R1——对DeepSeek R1训练流程前两个阶段的复现(SFT和GRPO训练)

前言 根据R1的GitHub可知 类别开源内容未开源内容模型权重R1、R1-Zero 及蒸馏模型权重&#xff08;MIT 协议&#xff09;原始训练数据 未公开冷启动数据、RL 训练数据集或合成数据的具体内容&#xff0c;仅提供依赖的公开数据集名称&#xff08;如 AI-MO、NuminaMath-TIR&…

大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路

2025年初&#xff0c;中国推出了具有开创性且高性价比的「大型语言模型」&#xff08;Large Language Model — LLM&#xff09;DeepSeek-R1&#xff0c;引发了AI的巨大变革。本文回顾了LLM的发展历程&#xff0c;起点是2017年革命性的Transformer架构&#xff0c;该架构通过「…

在线考试系统(代码+数据库+LW)

摘 要 使用旧方法对在线考试系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在在线考试系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的在线考试…

2025百度快排技术分析:模拟点击与发包算法的背后原理

一晃做SEO已经15年了&#xff0c;2025年还有人问我如何做百度快速排名&#xff0c;我能给出的答案就是&#xff1a;做好内容的前提下&#xff0c;多刷刷吧&#xff01;百度的SEO排名算法一直是众多SEO从业者研究的重点&#xff0c;模拟算法、点击算法和发包算法是百度快速排名的…

【Spring+MyBatis】留言墙的实现

目录 1. 添加依赖 2. 配置数据库 2.1 创建数据库与数据表 2.2 创建与数据库对应的实体类 3. 后端代码 3.1 目录结构 3.2 MessageController类 3.3 MessageService类 3.4 MessageMapper接口 4. 前端代码 5. 单元测试 5.1 后端接口测试 5.2 使用前端页面测试 在Spri…

EtherNet/IP转Modbus TCP:新能源风电监控与分析实用案例

EtherNet/IP转Modbus TCP&#xff1a;新能源风电监控与分析实用案例 一、案例背景 在某新能源汽车电池生产线上&#xff0c;需要将采用EtherNet/IP协议的电池检测设备与采用ProfiNet协议的生产线控制系统进行集成&#xff0c;以实现对电池生产过程的全面监控和数据采集。 二、…

管理WSL实例 以及安装 Ubuntu 作为 WSL 子系统 流程

安装ubuntu wsl --install -d Ubuntu分类命令说明安装相关wsl --install在 Windows 10/11 上以管理员身份在 PowerShell 中运行此命令&#xff0c;可安装 WSLwsl --install -d <distribution name>在 PowerShell 中使用此命令安装特定版本的 Linux 发行版&#xff0c;如…

Spring框架中都用到了哪些设计模式?

大家好&#xff0c;我是锋哥。今天分享关于【Spring框架中都用到了哪些设计模式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring框架中都用到了哪些设计模式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架中使用了大量的设计模…

最新VS code配置C/C++环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake

目录 一、VScode配置C/C环境&#xff0c;需设置tasks.json, launch.json文件 二、安装C/C扩展&#xff0c;配置tasks.json、launch.json、c_cpp_properties.json文件 (1)安装c/c扩展 (2)配置tasks.json文件 (3)配置launch.json文件 (4)配置中的参数(属性)说明 (5)运行程序(运行…

Java零基础入门笔记:(3)程序控制

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互&#xff0c;但是Java给我们提供了这样一个工具类&…

Spring Boot 原理分析

spring-boot.version&#xff1a;2.4.3.RELEASE Spring Boot 依赖管理 spring-boot-starter-parent 配置文件管理 <resources> <resource> <directory>${basedir}/src/main/resources</directory> <filtering>true&l…

Word中接入大模型教程

前言 为什么要在word中接入大模型呢&#xff1f; 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事&#xff0c;拆分一下就是&#xff1a; 获取用户…

【原创】vue-element-admin-plus完成编辑页面中嵌套列表功能

前言 vue-element-admin-plus对于复杂业务的支持程度确实不怎么样&#xff0c;我这里就遇到了编辑页面中还要嵌套列表的真实案例&#xff0c;比如字典&#xff0c;主字典嵌套子信息&#xff0c;类似于一个树状结构。目前vue-element-admin-plus给出的例子是无法满足这个需求的…

OpenCV中的边缘检测

边缘检测是图像处理和计算机视觉中的关键技术之一&#xff0c;旨在识别图像中像素强度发生显著变化的区域&#xff0c;这些区域通常对应于物体的边界或轮廓。边缘检测在机器视觉中具有重要的需求背景&#xff0c;主要体现在以下几个方面&#xff1a; 图像分割&#xff1a;边缘…

vscode的一些实用操作

1. 焦点切换(比如主要用到使用快捷键在编辑区和终端区进行切换操作) 2. 跳转行号 使用ctrl g,然后输入指定的文件内容&#xff0c;即可跳转到相应位置。 使用ctrl p,然后输入指定的行号&#xff0c;回车即可跳转到相应行号位置。

Redis(高阶篇)02章——BigKey

一、面试题 阿里广告平台&#xff0c;海量数据里查询某一个固定前缀的key小红书&#xff0c;你如何生产上限制 keys* /flushdb/flushall等危险命令以防止阻塞或误删数据&#xff1f;美团&#xff0c;memory usage命令你用过吗&#xff1f;BigKey问题&#xff0c;多大算big&…

《Zookeeper 分布式过程协同技术详解》读书笔记-2

目录 zk的一些内部原理和应用请求&#xff0c;事务和标识读写操作事务标识&#xff08;zxid&#xff09; 群首选举Zab协议&#xff08;ZooKeeper Atomic Broadcast protocol&#xff09;文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁 zk的一…

53倍性能提升!TiDB 全局索引如何优化分区表查询?

作者&#xff1a; Defined2014 原文来源&#xff1a; https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中&#xff0c;全局索引是一种定义在分区表上的索引类型&#xff0c;它允许索引分区与表分区之间建立一对多的映射关系&#xff0c;即一个索引分区可以对…

unity学习39:连续动作之间的切换,用按键控制角色的移动

目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition&#xff0c;使用trigger 1.2 在2个连续状态之间的转换&#xff0c;使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…