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

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;}}

相关文章:

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

&#xff08;以下内容全部来自上述课程&#xff09; 1.StringBuilder 因为StringBuilder是Java已经写好的类。 java在底层对他进行了一些特殊处理。 打印对象不是地址值而是属性值。 1.概述 StringBuilder可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。 作用…...

LabVIEW危化品仓库的安全监测系统

本案例展示了基于LabVIEW平台设计的危化品仓库安全监测系统&#xff0c;结合ZigBee无线通信技术、485串口通讯技术和传感器技术&#xff0c;实现了对危化品仓库的实时无线监测。该系统不仅能提高安全性&#xff0c;还能大幅提升工作效率&#xff0c;确保危化品仓库的安全运营。…...

深度学习框架探秘|Keras 应用案例解析以及 Keras vs TensorFlow vs PyTorch

引言 上一篇文章《深度学习框架探秘&#xff5c;Keras&#xff1a;深度学习的魔法钥匙》 我们初步学习了 Keras&#xff0c;包括它是什么、具备哪些优势&#xff08;简洁易用的 API、强大的兼容性、广泛的应用领域&#xff09;&#xff0c;以及基本使用方法。本文&#xff0c;…...

VINS-mono代码笔记

feature_tracker_node.cpp: 一、通过roslaunch文件的参数服务器获得配置参数 二、获得相机的内参 三、订阅图像&#xff0c;img_callback&#xff1a; 1、第一帧图像只记录时间戳 2、与之前时间戳比较一下&#xff0c;判断是否要发布当前帧&#xff0c;避免高频率发送&#xff…...

Maven下载安装IDEA使用MavenJava在pom.xml配置教程

一、Maven 简介 Maven 是一个强大的项目管理和构建工具&#xff0c;主要用于 Java 项目的构建、依赖管理和文档生成等。它通过一个统一的 XML 文件&#xff08;pom.xml&#xff09;来管理项目的整个生命周期&#xff0c;包括编译、测试、打包、发布等环节。 二、Maven 下载与…...

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换&#xff08;SNAT&#xff0c;Source NAT&#xff09;&#xff1a; 目标地址转换&#xff08;DNAT&#xff0c;Destination NAT&#xff09;&#xff1a; 端口地址转换&#xff08;PAT&#xff0c…...

newgrp docker需要每次刷新问题

每次都需要运行 newgrp docker 的原因: 当用户被添加到 docker 组后&#xff0c;当前会话并不会立即更新组信息&#xff0c;因此需要通过 newgrp docker 切换到新的用户组以使权限生效 如果不想每次都手动运行 newgrp docker&#xff0c;可以在终端中配置一个自动刷新的脚本。…...

【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】

在本文中&#xff0c;我们将介绍如何使用 FastAPI和uvicorn来同时运行HTTP和HTTPS的 Python应用程序。 简介 FastAPI是一个高性能的Web框架&#xff0c;可以用于构建快速、可靠的API。它基于Python的类型提示和异步支持&#xff0c;使得开发者可以轻松地编写出安全且高效的代…...

容器化部署Kafka的最佳实践:基于KRaft模式的无ZooKeeper方案

一、docker 部署kafka单节点 1.1安装docker 可以参考这篇CentOS 7安装docker并配置镜像加速 1.3 运行kafka&#xff08;注意修改zookeeper&#xff0c;kafka地址&#xff09; docker run -d --name kafka -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://172.16.10.180:9092 -p …...

20250214 随笔 线程安全 线程不安全

1. 什么是线程安全 & 线程不安全&#xff1f; 线程安全&#xff08;Thread-Safe&#xff09;&#xff1a;在多线程环境下访问同一个对象时&#xff0c;不会产生数据竞争、不会出现数据不一致的问题。线程不安全&#xff08;Not Thread-Safe&#xff09;&#xff1a;在多线…...

rem、em、vw区别

在前端开发里&#xff0c;rem、em、vw都是用来设置元素大小的单位&#xff0c;下面就用大白话讲讲它们的区别。 参考标准不一样 rem&#xff1a;就像大家都用同一把“大尺子”来量东西&#xff0c;这把“大尺子”就是网页里根元素&#xff08;也就是 <html> 标签&#…...

【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统&#xff08;源码论文…...

cURL请求与Javascript请求转换工具

cURL请求与Javascript请求在线转换工具(如 curlconverter) 首先,看看各个证据中关于curl的定义。提到cURL是“Client for URLs”的缩写,最初全大写是为了方便记忆,社区也将其解释为“Client URL Request Library”或递归的“Curl URL Request Library”。同时,还指出cURL…...

rv1103b编译opencv

opencv-3.4.16&#xff0c;png的neon会报错&#xff0c;如果想开可以参考 https://blog.csdn.net/m0_60827485/article/details/137561429 rm -rf build mkdir build cd build cmake -DCMAKE_BUILD_TYPERELEASE \ -DCMAKE_C_COMPILERxxx/arm-rockchip831-linux-uclibcgnueabih…...

thingboard告警信息格式美化

原始报警json内容&#xff1a; { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...

OpenHarmonry 5.0.1源码下载与编译

预置环境&#xff1a;硬盘500G、内存32G、Ubuntu 20.04.6 LTS Ubuntu系统下载路径&#xff1a;ubuntu-releases安装包下载_开源镜像站-阿里云 一、必需环境 sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf…...

【Python深入浅出㊸】解锁Python3中的TensorFlow:开启深度学习之旅

目录 一、TensorFlow 简介1.1 定义与背景1.2 特点 二、Python 3 与 TensorFlow 的关系2.1 版本对应2.2 为何选择 Python 3 三、安装 TensorFlow3.1 安装步骤3.2 验证安装 四、TensorFlow 基本概念与使用方法4.1 计算图&#xff08;Graph&#xff09;4.2 会话&#xff08;Sessio…...

STM32 外部中断和NVIC嵌套中断向量控制器

目录 背景 外部中断/事件控制器(EXTI) 主要特性 功能说明 外部中断线 嵌套向量中断控制器 特性 ‌中断线&#xff08;Interrupt Line&#xff09; 中断线的定义和作用 STM32中断线的分类和数量 优先级分组 抢占优先级&#xff08;Preemption Priority&#xff09; …...

string类详解(上)

文章目录 目录1. STL简介1.1 什么是STL1.2 STL的版本1.3 STL的六大组件 2. 为什么学习string类3. 标准库中的string类3.1 string类3.2 string类的常用接口说明 目录 STL简介为什么学习string类标准库中的string类string类的模拟实现现代版写法的String类写时拷贝 1. STL简介 …...

DeepSeek教unity------Dotween

1、命名法 Tweener&#xff08;补间器&#xff09;&#xff1a;一种控制某个值并对其进行动画处理的补间。 Sequence&#xff08;序列&#xff09;&#xff1a;一种特殊的补间&#xff0c;它不直接控制某个值&#xff0c;而是控制其他补间并将它们作为一个组进行动画处理。 Tw…...

AIP-146 泛化域

编号146原文链接AIP-146: Generic fields状态批准创建日期2019-05-28更新日期2019-05-28 API中的大多数域&#xff0c;无论是在请求、资源还是自定义应答中&#xff0c;都有具体的类型或模式。这个模式是约定的一部分&#xff0c;开发者依此约定进行编码。 然而&#xff0c;偶…...

【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法

每天一篇Go语言干货&#xff0c;从核心到百万并发实战&#xff0c;快来关注魔法小匠&#xff0c;一起探索Go语言的无限可能&#xff01; 在 Go 语言中&#xff0c;Goroutine 是一种轻量级的并发执行单元&#xff0c;它使得并发编程变得简单高效。而 Goroutine 的高效调度机制是…...

【前端】Vue组件库之Element: 一个现代化的 UI 组件库

文章目录 前言一、官网1、官网主页2、设计原则3、导航4、组件 二、核心功能&#xff1a;开箱即用的组件生态1、丰富的组件体系2、特色功能亮点 三、快速上手&#xff1a;三步开启组件化开发1、安装&#xff08;使用Vue 3&#xff09;2、全局引入3、按需导入&#xff08;推荐&am…...

第十五天 学习并实践HarmonyOS应用的基本结构、页面导航和状态管理

HarmonyOS应用开发入门&#xff1a;从基本结构到状态管理实战指南 前言 &#xff08;约300字&#xff0c;说明HarmonyOS的发展前景&#xff0c;应用开发的市场需求&#xff0c;以及本教程的核心价值。强调手把手教学特点&#xff0c;降低学习门槛&#xff09; 一、HarmonyOS应…...

Cursor生成JAVA相关的关键词提示规则

在项目根目录创建一个.curstorrules文件&#xff08;注意有个小数点&#xff09;&#xff0c;之后在该文件内填入下面内容 你是 Java 编程、Spring Boot、Spring Framework、Maven、JUnit 及相关 Java 技术的专家。 代码风格与结构 编写整洁、高效且文档完善的 Java 代码&am…...

数据结构:队列(Queue)及其实现

队列&#xff08;Queue&#xff09;是一种广泛使用的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In, First Out&#xff09;的原则。也就是说&#xff0c;最早插入队列的元素会最先被移除。队列是一种典型的顺序存取结构&#xff0c;它与栈&…...

MoE架构中的专家选择门控机制:稀疏激活如何实现百倍效率突破?

技术原理&#xff08;数学公式与核心逻辑&#xff09; 核心公式 门控网络输出&#xff1a; G ( x ) Softmax ( W g ⋅ x b g ) G(x) \text{Softmax}(W_g \cdot x b_g) G(x)Softmax(Wg​⋅xbg​) 最终输出&#xff1a; y ∑ i 1 n G i ( x ) ⋅ E i ( x ) (仅保留Top-…...

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火&#xff0c;虽然网上很多介绍和解读&#xff0c;但听人家的总不如自己去看看原论文。于是花了大概一周的时间&#xff0c;下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…...

DeepSeek 的创新融合:多行业应用实践探索

引言 在数字化转型的浪潮中&#xff0c;技术的融合与创新成为推动各行业发展的关键力量。蓝耘平台作为行业内备受瞩目的创新平台&#xff0c;以其强大的资源整合能力和灵活的架构&#xff0c;为企业提供了高效的服务支持。而 DeepSeek 凭借先进的人工智能技术&#xff0c;在自然…...