【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘📘

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net

四月份就准备蓝桥杯咯 为了冲击国赛 博主这段时间日夜刷题 但发现光刷没有 还是得把学习到的东西记录下来  于是打算专门做一篇冲击蓝桥篇的专栏 作为蓝桥复习过程中 易出错的知识点补充和学习 里面会有刷题的笔记 希望能够记录学习之路

那么正片开始

目录

String、StringBuilder区别

StringBuilder 类的特点和用法:

StringBuilder 是 Java 提供的用于处理可变字符串的类。它具有以下特点:

String 和 StringBuilder 的选择:选择使用 String 还是 StringBuilder 取决于具体的需求:

思路分析:

代码实现+详细注释:


String、StringBuilder区别

String 和 StringBuilder 是两个常见的字符串处理类。尽管它们都用于处理字符串,但它们在性能和使用方式上存在一些重要的区别。本文将介绍 String 和 StringBuilder 的区别,以及它们的用法和常见应用场景,帮助读者更好地理解和选择适当的类来处理字符串。

一、String 类的特点和用法:
String 类是 Java 中最常用的字符串类之一。它具有以下特点:

  1. 不可变性:String 对象一旦被创建,其值就不能被修改。每次对 String 对象进行操作时,都会创建一个新的 String 对象。
  2. 线程安全:由于 String 对象的不可变性,它可以被多个线程同时访问而不会出现并发问题。
  3. 应用场景:String 适用于字符串不经常改变的情况,比如字符串的拼接、比较、查找等操作。

常见用法示例:

字符串拼接:

String str = "Hello";
str += " World";

 字符串比较:

String str1 = "Hello";
String str2 = "World";
boolean isEqual = str1.equals(str2);

 字符串查找:

String str = "Hello World";
int index = str.indexOf("World");

StringBuilder 类的特点和用法:

StringBuilder 是 Java 提供的用于处理可变字符串的类。它具有以下特点:

  1. 可变性:StringBuilder 对象的值可以被修改,而不会创建新的对象。这使得在频繁修改字符串的情况下,StringBuilder 的性能更高。
  2. 非线程安全:StringBuilder 不是线程安全的,如果多个线程同时访问同一个 StringBuilder 对象,可能会导致数据不一致或并发问题。
  3. 应用场景:StringBuilder 适用于需要频繁修改字符串的情况,比如字符串的拼接、替换、插入等操作。

常见用法示例

字符串拼接:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" World");
String result = sb.toString();

字符串替换:

StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
String result = sb.toString();

字符串插入:

StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " World");
String result = sb.toString();

String 和 StringBuilder 的选择:
选择使用 String 还是 StringBuilder 取决于具体的需求:

  • 如果字符串的值不会频繁改变,或者在多线程环境下使用,建议使用 String 类,因为它是不可变的和线程安全的。
  • 如果字符串需要频繁修改,并且在单线程环境下使用,建议使用 StringBuilder,因为它具有可变性和更高的性能。

但蓝桥杯基本都是针对单线程环境下编程的 所以 StringBuilder就很有优势 

下面分享一道洛谷的题 作为这篇的参考

链接:https://www.luogu.com.cn/problem/B3640

思路分析:

  1. 首先,使用Scanner类从标准输入读取一行句子,并将其存储在字符串s中。
  2. 然后,将字符串s转换为字符数组c,方便逐个处理字符。
  3. 你创建了两个StringBuilder对象,ans用于存储倒序输出的结果,a用于处理每个单词。
  4. 在一个循环中,从字符数组c的最后一个字符开始遍历。
    • 如果当前字符是空格,表示一个单词的结束,需要处理a中的字符并将其插入到ans中。首先检查a是否为空,然后判断第一个字符是否为数字,如果是数字,则将a进行反转(翻转自然数)。
    • 将a转换为字符串并追加到ans中,然后重置a为一个新的StringBuilder对象。
    • 如果当前字符不是空格,表示一个单词的继续,你需要将其插入到a的开头。在插入之前,检查当前字符是否为字母,如果是字母,则将其转换为相反的大小写形式,并插入到a中。
  5. 循环结束后,再次检查a是否为空,如果不为空,则表示最后一个单词需要处理,你执行与空格处相同的操作。
  6. 将a转换为字符串并追加到ans中。
  7. 最后,打印出ans作为结果。

代码实现+详细注释:

public static void main(String[] args) {Scanner in = new Scanner(System.in);String s = in.nextLine();char[] c = s.toCharArray();//每一个字符 都是一个数组元素StringBuilder ans = new StringBuilder();StringBuilder a = new StringBuilder();for (int i = c.length - 1; i >= 0; i--) {if (c[i] == ' ') {//输入的字符串轮到空格的时候 就去处理a当中的字符 如果是字母就不用管 因为是转为大写再插入进来的 如果是数字 就把他翻转并插入到答案字符串中if (a.length() != 0) {int k = a.charAt(0) - '0';if (k >= 0 && k <= 9) {a.reverse();}}ans.append(a.toString() + " ");a = new StringBuilder();} else {//字符串不是空格char x = c[i];// 判断是不是字母if ((c[i] >= 'a' && c[i] <= 'z') || (c[i] >= 'A' && c[i] <= 'Z')) {//把字母变为反转x ^= 32;}//放入待处理的字符串中a.insert(0, x);}}if (a.length() != 0) {//这里处理的是最后一个单词int k = a.charAt(0) - '0';if (k >= 0 && k <= 9) {a.reverse();}}ans.append(a);System.out.println(ans);}

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

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

相关文章

docker打包当前dinky项目

以下是我的打包过程&#xff0c;大家可以借鉴。我也是第一次慢慢摸索&#xff0c;打包一个公共项目&#xff0c;自己上传。 如果嫌麻烦&#xff0c;可以直接使用我的镜像&#xff0c;直接跳到拉取镜像&#xff01; <可以在任何地方的服务器进行拉取> docker打包当前din…

LLMs之Gemma:Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略

LLMs之Gemma&#xff1a;Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略 导读&#xff1a;此文章介绍了Google推出的新一代开源模型Gemma&#xff0c;旨在帮助研发人员负责任地开发AI。 背景&#xff1a; >> Google长期致力于为开发者和研究人…

Vue(学习笔记)

什么是Vue Vue是一套构建用户界面的渐进式框架 构建用户界面&#xff1a; 基于数据渲染出用户可以看到的界面 渐进式&#xff1a; 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vue中的所有API都学完才能开发Vue&#xff0c;可以学一点开发一点 创建Vue实例 比如就上面…

猫头虎分享已解决Bug || ImportError: Keras requires TensorFlow 2.2 or higher

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

openai sora 只能根据文本生成视频?不,TA 是通用物理世界模拟器

视频生成模型作为世界模拟器 我们探索了在视频数据上进行大规模生成模型的训练。 具体来说&#xff0c;我们联合在可变持续时间、分辨率和长宽比的视频和图像上训练文本条件扩散模型。 我们利用了一个在视频和图像潜在编码的时空补丁上操作的变压器架构。 我们最大的模型So…

C++的string容器->基本概念、构造函数、赋值操作、字符串拼接、查找和替换、字符串比较、字符存取、插入和删除、子串

#include<iostream> using namespace std; #include <string> //string的构造函数 /* -string(); //创建一个空的字符串 例如: string str; -string(const char* s); //使用字符串s初始化 -string(const string& str); //使…

Leetcode 209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

Linux基础命令-文件管理

目录结构 1.存放命令相关的目录 /bin #普通用户使用的命令 /bin/ls, /bin/date /sbin #管理员使用的命令 /sbin/service2.存放用户相关数据的家目录 /home #普通用户的家目录, 默认为/home/username /root #超级管理员root的家目录, 普通用户无权操作3.系统文件目录 /usr #相当…

《TCP/IP详解 卷一》第3章 链路层

目录 3.1 引言 3.2 以太网 3.3 全双工 省点 自动协商 流量控制 3.4 网桥和交换机 3.5 WiFi 3.6 PPP协议 3.6.1 PPP协议流程 3.7 环回 3.8 MTU和路径MTU 3.9 隧道基础 3.9.1 GRE 3.9.2 PPTP 3.9.3 L2TP 3.10 与链路层相关的攻击 3.11 总结 3.1 引言 城域网&…

132 Linux 系统编程9 ,IO操作,lseek 函数,truncate函数,查看文件的表示形式

一 lseek 函数 函数说明&#xff1a;此函数用于文件偏移 Linux中可使用系统函数lseek来修改文件偏移量(读写位置) 每个打开的文件都记录着当前读写位置&#xff0c;打开文件时读写位置是0&#xff0c;表示文件开头&#xff0c;通常读写多少个字节就会将读写位置往后移多少个字…

ai数字仿真辩论主持人提升用户体验

Ai虚拟主持人是元宇宙和AI人工智能技术在播音主持行业的重要应用&#xff0c;AI虚拟主持人能极大提升新闻资讯内容的精准度&#xff0c;改变单一的播报形式。 首先&#xff0c;AI虚拟主持人极大地提升了节目的制作效率和灵活性。传统主持人需要花费大量时间进行彩排和录制&…

Jmeter之内置函数__property和__P的区别

1. __property函数 作用 读取 Jmeter 属性 语法格式 ${__property(key,var,default)} 参数讲解 小栗子 ${__property(key)} 读取 key 属性如果找不到 key 属性&#xff0c;则返回 key&#xff08;属性名&#xff09; ${__property(key,,default)} 读取 key 属性如果找不到 k…

Python:函数

目录 前言&#xff1a; 一、函数的定义 二、函数的调用 三、函数的分类 四、全局变量和局部变量 五、函数的参数 5.1 位置参数 5.2 默认值参数 5.3 可变参数 5.4 关键字参数 5.5 命名关键字参数 5.6 参数的组合 六、函数的递归 前言&#xff1a; 函数就是一个过程…

ETL:数据转换与集成的关键过程

ETL&#xff1a;数据转换与集成的关键过程 在现代数据驱动的世界中&#xff0c;有效地管理和处理数据对于企业的成功至关重要。ETL&#xff08;提取、转换、加载&#xff09;是一种关键的数据处理过程&#xff0c;有助于将数据从源系统提取、清洗、转换并加载到目标系统中&…

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换&#xff08;自动类型提升&#xff09; 强制转换 自增自减运算符 …

【网络编程】okhttp源码解析

文章目录 配置清单框架结构解析 配置清单 首先了解一下okHttp的配置清单&#xff1a; Dispatcher dispatcher &#xff1a;调度器&#xff0c;⽤于调度后台发起的⽹络请求&#xff0c;有后台总请求数和单主机总请求数的控制。List<Protocol> protocols &#xff1a;⽀持…

PostgreSQL 实体化视图的使用

上周的教程中&#xff0c;通过 DVD Rental Database 示例&#xff0c;让我们了解了在 PostgreSQL 中创建实体化视图的过程。正如我们所了解的&#xff0c;PostgreSQL 实体化视图提供了一种强大的机制&#xff0c;通过预计算和存储查询结果集为物理表来提高查询性能。接下来的内…

leetcode刷题日志-98.验证二叉搜索树

思路&#xff1a;根据二叉搜索树的性质&#xff0c;中序遍历满足升序。那么我们就可以使用中序dfs&#xff0c;并且记录每个节点的前一个节点的值&#xff0c;如果前一个节点值比后一个大&#xff0c;返回false。 class Solution {Integer pre null; //记录前序节点boolean …

2.23数据结构

单向循环链表 创建单向循环链表&#xff0c;创建节点 &#xff0c;头插&#xff0c;按位置插入&#xff0c;输出&#xff0c;尾删&#xff0c;按位置删除功能 //main.c #include "loop_list.h" int main() {loop_p Hcreate_head();insert_head(H,12);insert_head(…

3分钟看懂设计模式02:观察者模式

一、什么是观察者模式 观察者模式又叫做发布-订阅模式或者源-监视器模式。 结合它的各种别名大概就可以明白这种模式是做什么的。 其实就是观察与被观察&#xff0c;一个对象&#xff08;被观察者&#xff09;的状态改变会被通知到观察者&#xff0c;并根据通知产生各自的不…