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 可再发…

OJ系统JavaScript Node标准输入输出(https://pintia.cn/)

const readline require("readline"); const rl readline.createInterface({input: process.stdin,output: process.stdout, }); const arr [];//储存数据 rl.on(line, function (line) {arr.push(line);} ); rl.on(close,function (){console.log(arr)//[ 1 5, 1…

小程序解析二维码: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. 复制当前内容 粘贴到当前…

如何了解数字化和信息化的区别?

在数字化浪潮席卷全球的今天&#xff0c;企业如何乘风破浪、实现转型升级&#xff1f; 数字化和信息化&#xff0c;这两个看似相似却各有千秋的概念&#xff0c;一直被人们拿来对比。 下面就来讲一讲我的理解&#xff1a; 从简单了说&#xff1a; “信息化”可以理解为传统数…

关于配置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…

Java二进制、八进制、十进制、十六进制转换

N进制转十进制 Integer.valueOf( str, N ) 方法把N进制的字符str转换成十进制 Integer.valueOf( str, N ) 方法等同于 Integer.parseInt( str, N ) 方法 // str 是字符串 // N 整数&#xff0c;指定字符串str是几&#xff08;N&#xff09;进制 Integer.parseInt(str, N) 例…

docker安装华为高斯-opengauss

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

每周编辑精选|COIG-CQIA 数据集上线、在线运行 ComfyUI 文生图工作流

为了填补高质量中文数据集的空白&#xff0c;中国科学院、零一万物、北京大学等 10 家机构联合开发出了 COIG-CQIA 数据集。令人惊讶的是&#xff0c;该数据集中「弱智贴吧」的数据质量&#xff0c;居然大幅度超过知乎、豆瓣、思否等知识社区。 COIG-CQIA 数据集现已上线 hyper…

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

不少新手养猫人都会好奇&#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}

nginx 如何对用户屏蔽网站首页但是对蜘蛛开放

使用 Nginx 的 if 指令结合 $http_user_agent 变量来实现条件判断。不过&#xff0c;请注意&#xff0c;Nginx 官方文档通常建议避免在配置中过度使用 if 指令&#xff0c;因为它可能会导致不可预测的行为&#xff0c;尤其是在复杂的配置中。然而&#xff0c;对于简单的用例&am…

【统计建模选题】大数据和人工智能背景下新能源汽车某方面的统计研究

针对新能源汽车行业&#xff0c;在大数据和人工智能背景下的统计研究是一个前沿且具有实际意义的研究方向。为了确保研究主题不偏离“大数据与人工智能”的主题框架&#xff0c;同时选取合适的指标进行研究&#xff0c;以下是一些建议&#xff1a; 1.体现大数据与人工智能主题…

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

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

行列视在行业中占据的优势

行列视&#xff08;RCV&#xff09;生产数据应用系统具有多种优势&#xff0c;这些优势使得它在行业中能够脱颖而出。以下是一些主要的优势&#xff1a; 1. 指标数据快速治理&#xff1a;行列视能够实现指标的快速治理、统一管理、共享、应用及分析。通过采用多种方式如从上至…

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按位查找时间…

深入了解TypeScript:从基础语法到高级特性

在当今的软件开发领域中&#xff0c;TypeScript&#xff08;TS&#xff09;作为JavaScript的超集语言&#xff0c;越来越受到开发者的关注和喜爱。它扩展了JavaScript的语法&#xff0c;并引入了静态类型检查&#xff0c;为开发者提供了更好的开发工具和更可靠的代码结构。本篇…