String类(2)

❤️❤️前言~🥳🎉🎉🎉 

hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥💥,如果发现这篇文章有问题的话,欢迎各位评论留言指正,大家一起加油!一起chin up!👍👍 

💥个人主页:E绵绵的博客
💥所属专栏:JAVASE题目练习  JAVASE知识点专栏  c语言知识点专栏   c语言题目练习

在String类的第二部分中我们将给大家介绍如何真正修改字符串内容以及讲解一些题目。

那么开始吧!

 字符串修改

❤️❤️注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,我们对其修改都会创建新对象,导致效率非常低下。 

所以我们这就出现了StringBuilder类或者StringBuffer类。

下面我们拿StringBuilder类举例:

如上图其类内部也包含着数组,但其修饰并不是用private以及final修饰,所以其内部可以被修改,当我们修改该类对象时,不会创建新对象而是修改原本的对象的值。所以用它修改字符串时效率较高。

下面请看实例

    public class Main {
public static void main(String[] args) {long start = System.currentTimeMillis();String s = "";for(int i = 0; i < 10000; ++i){s += i;}long end = System.currentTimeMillis();System.out.println(end - start);//直接修改String类对象所用时间start = System.currentTimeMillis();StringBuffer sbf = new StringBuffer("");for(int i = 0; i < 10000; ++i){sbf.append(i);}end = System.currentTimeMillis();System.out.println(end - start);//用StringBuffer类间接修改String对象所用时间start = System.currentTimeMillis();StringBuilder sbd = new StringBuilder();for(int i = 0; i < 10000; ++i){sbd.append(i);}end = System.currentTimeMillis();System.out.println(end - start);//用StringBuilder类间接修改String对象所用时间}}

我们由上图可知——各个方法对字符串修改100次所花费的时间,直接修改为经历了255毫秒,间接修改为经历了1毫秒.

这是因为直接修改会创建非常多的对象,导致效率变低很多,而我们用这两个类其中一个类间接修改都是从始至终就只有该类对象里面的数组值在不断变换,并不会创建新对象,所以效率很高

❤️❤️因此:尽量避免对String的直接需要,如果要修改字符串建议尽量 使用StringBuffer或者StringBuilder。

那么接下来我们将给大家介绍怎么使用Stringbuffer,StringBuilder。

🎯🎯StringBuilder和StringBuffer的使用 

 ❤️❤️StringBuilder和StringBuffer其实大部分功能是相似的,所以我们只要讲其中一个类的使用,另一个类的使用也是跟它大差不差几乎相同的(区别我们之后讲)。

那我们就讲下StringBuilder的使用:

 🎯🎯StringBuilder是Java中的一个类,用于处理字符串的可变序列。它的创建如下:

使用关键字new创建一个StringBuilder对象:

如果参数为空,StringBuilder的初始内容就不存在,相当于内部字符数组不含任何字符。

StringBuilder sb = new StringBuilder(); 

我们还可以选择在创建StringBuilder对象时传入一个初始字符串,该字符串将成为StringBuilder的初始内容,相当于其内部的字符数组存在着该字符串的字符.

StringBuilder sb = new StringBuilder("Hello"); 

那么这就是其创建StringBuilder对象的一些方法

🎯🎯下面我们讲一下其类中的两个重要方法。(必记)

StringBuilder类中的append()方法向StringBuilder对象中添加字符串,如下:

使用后该StringBuilder对象sb内容尾部将添加World。相当于其字符数组在最后面加了这五个字符.注意因为不用创建新对象,所以我们也无需创建引用去接收它,直接使用该方法就能达成在尾部添加字符串的效果,如下:

​sb.append("World"); 

StringBuilder类中的toString()方法是创建一个String类型,字符串内部是StringBuilder对象内部字符数组的全部字符,并返回该字符串,所以我们需要创建一个字符串引用去接收它。

String result = sb.toString(); 

除此之外该类中还存在很多方法,不过我们这里就不再多讲了,你们自己看下面的图,注意有些直接使用方法就能达成其效果,有些要创建引用去接收才行。

public static void main(String[] args) {StringBuilder sb1 = new StringBuilder("hello");StringBuilder sb2 = sb1;// 追加:即尾插-->字符、字符串、整形数字sb1.append(' ');                  // hellosb1.append("world");              // hello worldsb1.append(123);                  // hello world123System.out.println(sb1);          // hello world123System.out.println(sb1 == sb2);   // trueSystem.out.println(sb1.charAt(0));   // 获取0号位上的字符 hSystem.out.println(sb1.length());    // 获取字符串的有效长度14System.out.println(sb1.capacity());  // 获取底层数组的总大小sb1.setCharAt(0, 'H');     // 设置任意位置的字符 Hello world123sb1.insert(0, "Hello world!!!");  //在0位置上插入字符串hello world!!!                 System.out.println(sb1);  //Hello world!!!Hello world123System.out.println(sb1.indexOf("Hello"));          // 获取Hello第一次出现的位置System.out.println(sb1.lastIndexOf("hello"));  // 获取hello最后一次出现的位置sb1.deleteCharAt(0);                               // 删除首字符sb1.delete(0,5);                                   // 删除[0, 5)范围内的字符String str = sb1.substring(0, 5);                  
// 截取[0, 5)区间中的字符以String的方式返回System.out.println(str);sb1.reverse();                      // 字符串逆转str = sb1.toString();               // 将StringBuffer以String的方式返回System.out.println(str);}

从上述例子可以看出:

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。

注意:String和StringBuilder类不能直接转换(不存在继承关系)。如果要想互相转换,可以采用如下原则:

String变为StringBuilder:利用StringBuilder的构造方法或append()方法

StringBuilder变为String: 调用toString()方法。

注意StringBuilder和StringBuffer大部分功能相似,所以StringBuffer也是可以用以上方法去创建对象和使用如上图一样的方法。几乎StringBuilder能做的StringBuffer都能做。

❤️❤️所以这样就可以通过不断追加字符串来构建一个可变的字符串。StringBuilder和StringBuffer相比于String类的优势在于,它可以避免频繁创建新的字符串对象,提高了字符串拼接的效率。 

String、StringBuffer、StringBuilder的区别

❤️❤️区别:

1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.

2.StringBuffer与StringBuilder大部分功能是相似的,但其还是有一点点区别的,如下:

3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。

线程安全操作比线程不安全操作的效率要低一点,也就是运行速度慢一点,所以使用StringBuffer比使用StringBuilder其运行要慢一点。  (对于线程我们现在还没学之后深入学习再去讲解)

 关于String习题

习题总共有三题,大家可以做一下,链接放在下面了,这些题目都很简单,我就不多讲了,直接上代码,大家看下代码应该都能看懂:

求第一个只出现一次的字符

. - 力扣(LeetCode)

class Solution {public int firstUniqChar(String s) {int[] count = new int[256];// 统计每个字符出现的次数for(int i = 0; i < s.length(); ++i){count[s.charAt(i)]++;}// 找第一个只出现一次的字符for(int i = 0; i < s.length(); ++i){if(1 == count[s.charAt(i)]){return i;}}return -1;}
}

求字符串最后一个单词的长度 

 字符串最后一个单词的长度_牛客题霸_牛客网

import java.util.Scanner;public class Main{public static void main(String[] args){// 循环输入Scanner sc = new Scanner(System.in);while(sc.hasNext()){// 获取一行单词String s = sc.nextLine();// 1. 找到最后一个空格// 2. 获取最后一个单词:从最后一个空格+1位置开始,一直截取到末尾// 3. 打印最后一个单词长度int len = s.substring(s.lastIndexOf(' ')+1).length();System.out.println(len);}}
}

检测字符串是否为回文串

. - 力扣(LeetCode)

class Solution {public static boolean isValidChar(char ch){if((ch >= 'a' && ch <= 'z') ||(ch >= '0' && ch <= '9')){return true;}return false;}public boolean isPalindrome(String s) { // 将大小写统一起来s = s.toLowerCase();int left = 0, right = s.length()-1;while(left < right){// 1. 从左侧找到一个有效的字符while(left < right && !isValidChar(s.charAt(left))){left++;}// 2. 从右侧找一个有效的字符while(left < right && !isValidChar(s.charAt(right))){right--;}if(s.charAt(left) != s.charAt(right)){return false;}else{left++;right--;}}return true;}
}

这里多说一点,之所以在左侧和右侧找一个有效字符时还要加上left<rightt这条件,是因为当字符串全为非字母数字字符时,我们没有该条件会导致数组越界而报错。当我们有了该条件就能解决该情况,并且特殊情况下的结果和实际情况一模一样。(如不存在字母数字字符情况)

 总结 

所以我们讲的String类就完结啦,现在我们讲的主要还是如何去使用String类,等到数据结构时我们还会提及String讲其更深层的内容.

还希望各位大佬们能给个三连,点点关注,点点赞,发发评论呀,感谢各位大佬~❤️❤️💕💕🥳🎉🎉🎉!

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

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

相关文章

应用程序无法正常启动0xc000007b, 解决方案(超简单)

1、问题 安装软件时候报错 应用程序无法正常启动(0xc000007b) 2、原因 主要是没有安装Microsoft Visual C 3、解决方法&#xff1a;下载 Microsoft Visual C 可再发行程序包 直接在Microsoft Learn官网下载 vcredist_x64.exe。 3.1、打开官网链接Microsoft Visual C 可再发…

小程序解析二维码:jsQR

1.了解jsQR jsQR是一个纯javascript脚本实现的二维码识别库&#xff0c;不仅可以在浏览器端使用&#xff0c;而且支持后端node.js环境。jsQR使用较为简单&#xff0c;有着不错的识别率。 2.效果图 3.二维码 4.下载jsqr包 npm i -d jsqr5.代码 <!-- index.wxml --> &l…

blender安装mmd并导入pmx,pmd文件

点击链接GitHub上下载这个&#xff0c;值得注意的是blender4.0以上版本暂时不支持&#xff0c;这里使用的是blender3.6版本GitHub - powroupi/blender_mmd_tools: mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance. 复制当前内容 粘贴到当前…

关于配置nginx的反向代理时出现的一些问题及解决方法

1.配置反向代理 &#xff08;1&#xff09;上传nginx.conf到/opt/nginx/conf/中&#xff0c;并覆盖。 #查看一下IP是否正确&#xff08;需要将文件中的IP改成自己的IP&#xff09; cat /opt/nginx/conf/nginx.conf &#xff08;2&#xff09;重启 cd /opt/nginx/sbin ./n…

docker安装华为高斯-opengauss

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

为何进口的主食冻干大量养猫达人推荐?五大优质主食冻干养猫必选

不少新手养猫人都会好奇&#xff0c;为何进口主食冻干的价格如此高昂&#xff0c;却仍受到众多养猫达人的青睐&#xff1f;与国产主食冻干相比&#xff0c;进口产品价格高出3-4倍&#xff0c;那么这高昂的价格背后&#xff0c;进口主食冻干究竟物有所值&#xff0c;还是只是一个…

web安全-SSH私钥泄露

发现主机 netdiscover -r 192.168.164.0 扫描端口 看到开放80和31337端口都为http服务 浏览器访问测试 查看80端口和31337端口网页和源代码并无发现有用信息 目录扫描 扫描出80端口并无有用信息 扫描31337端口 发现敏感文件robots.txt和目录.ssh 访问敏感文件和目录 /.ss…

GEEKCTF 2024

Welcome flag{welcome_geekers}

商城系统个性化功能——可视化编辑

商城系统的普及化&#xff0c;让很多中小企业和商家也开始接触商城系统管理&#xff0c;之前在使用第三方平台时&#xff0c;大多数商城系统的样式都是固定的&#xff0c;商城页面也不能按照自己的想法去调整。 现在&#xff0c;随着商城系统越来越普遍&#xff0c;商城系统功…

05—面向对象(上)

一、面向对象编程 1、类和对象 &#xff08;1&#xff09;什么是类 类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。 属性&#xff1a;就是该事物的状态信息。行为&#xff1a;就是在你这个程序中&#xff0c;该状态信息要做什么操作&#x…

加固系统安全,防范ssh暴力破解之Fail2Ban

你是否还在担心你的服务器被攻击&#xff1f;你是否还在担心你的博客的安全&#xff1f;你是否还在担心你的隐私&#xff1f;别急fail2ban它来了&#xff0c;它可以解决你的一切问题。 Fail2Ban 是什么&#xff1f; 现在让我们一起来认识一下今天的主角 – Fail2Ban。简单说来…

数据结构复习指导之顺序表上基本操作的实现(插入、删除、查找)

文章目录 顺序表基本操作实现 知识总览 1.顺序表的初始化 1.1静态分配顺序表的初始化 1.2动态分配顺序表的初始化 2.插入操作 2.1插入操作流程 2.2插入操作时间复杂度 3.删除操作 3.1删除操作流程 3.2删除操作时间复杂度 4.查找操作 4.1按位查找 4.2按位查找时间…

TinyEMU源码分析之中断处理

TinyEMU源码分析之中断处理 1 触发中断2 查询中断2.1 查询中断使能与pending状态&#xff08;mie和mip&#xff09;2.2 查询中断总开关与委托&#xff08;mstatus和mideleg&#xff09;2.2.1 M模式2.2.2 S模式2.2.3 U模式 3 处理中断3.1 获取中断编号3.2 检查委托3.3 进入中断3…

软件设计师-基础知识科目-数据库技术基础识9

九、数据库技术基础识&#xff1a; 数据库设计阶段&#xff1a; 需求分析阶段 -> 确定系统边界。逻辑设计阶段 -> 关系规范化分。 数据库三级模式和两层映射&#xff1a; 三级模式&#xff1a; 外模式、概念模式&#xff08;也称模式&#xff09;、内模式&#xff08…

新员工入职培训时长缩短36%!智能陪练产品再升级

诸多预测认为&#xff0c;2024 年将成为国内大模型产业应用爆发的元年。中关村科金作为领先的对话式 AI 技术解决方案提供商&#xff0c;自主研发的智能陪练产品&#xff0c;以学、练、考、培一体化的方式&#xff0c;为企业提供全方位的综合培训服务。 借助大模型技术方面的突…

视频号小店新商机逐渐爆发,高门槛仍挡不住商家前进的脚步!

大家好&#xff0c;我是电商花花。 不知道大家有没有发现一件很有意思的事情&#xff0c;就是现在有越来越多的商家涌入抖音小店&#xff0c;部分商家还是想在视频号小店里博一丝机会。 我们都知道视频号小店是除了抖音小店之外&#xff0c;最火热的项目了&#xff0c;部分商…

19(20)-1(3)-CSS3 平面 2D 变换+CSS3 过渡

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍一、CSS3 平面 2D 变换&#x1f48e;1 坐标轴&#x1f48e;2 transform 语法…

KubeSphere 社区双周报|2024.03.29-04.11

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2024.03.29-04.11…

C/C++ 入门(5)内存管理

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 欢迎指教&#xff01; 目录 一、内存分布 二、C中动态内存管理 new delete 三、C语言的动态内存管理 四、operator new 和operator delete函数 operator new operator delete 五、new和delete的…

细胞世界:4.细胞分化(划区域)与细胞衰老(设施磨损)

(1)细胞凋亡 1. 概念&#xff1a;细胞凋亡可以比作城市的规划者主动拆除某些建筑来更新城市或防止危险建筑对市民的潜在伤害。这是一个有序的过程&#xff0c;由城市&#xff08;细胞内部&#xff09;的特定规划&#xff08;基因&#xff09;所决定。 2. 特征&#xff1a;细…