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(' ');                  // hello
        sb1.append("world");              // hello world
        sb1.append(123);                  // hello world123
        System.out.println(sb1);          // hello world123
        System.out.println(sb1 == sb2);   // true
        System.out.println(sb1.charAt(0));   // 获取0号位上的字符 h
        System.out.println(sb1.length());    // 获取字符串的有效长度14
        System.out.println(sb1.capacity());  // 获取底层数组的总大小
        sb1.setCharAt(0, 'H');     // 设置任意位置的字符 Hello world123
        sb1.insert(0, "Hello world!!!");  //在0位置上插入字符串hello world!!!                 
        System.out.println(sb1);  //Hello world!!!Hello world123
        System.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讲其更深层的内容.

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉:技术与应用的深度解析

一、引言 计算机视觉&#xff0c;作为人工智能的一个重要分支&#xff0c;旨在通过计算机模拟人类的视觉系统&#xff0c;实现对图像或视频信息的自动分析和理解。随着深度学习、神经网络等技术的快速发展&#xff0c;计算机视觉在各个领域的应用日益广泛&#xff0c;包括安全…

MongoDB数据库转换为表格文件的Python实现

目录 一、引言 二、转换工具与库的选择 三、转换过程详解 安装必要的库 连接MongoDB数据库 查询并处理数据 将数据写入CSV文件 四、进阶技巧与注意事项 五、总结 一、引言 在当今大数据时代&#xff0c;数据的存储、处理与共享显得尤为重要。MongoDB作为一个面向文档…

Arduino 项目笔记 |TH1621 LCD液晶显示屏驱动(SSOP-24封装)

LCD液晶屏资料 LCD液晶屏资料 重要参数&#xff1a; 工作电压&#xff1a; 3V可视角度&#xff1a;1201/4 &#xff0c;1/3 TH1621 驱动 HT1621 LCD控制驱动芯片介绍 VLCD 和 VCC 电压符合规格书&#xff0c;最好都取3.3V 。电压太高或太低都会出现段码液晶屏乱码的情况&am…

每日一题---OJ题: 相交链表

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go! ! ! emmm,看这道题好像不怎么难,我们一起画图分析分析 上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交 …

(Java)数据结构——图(第六节)Dijkstra实现单源最短路径

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Dijkstra算法&#xff08;Dijkstra的实现原理&#xff09; 迪杰斯特拉算法的实现&#xff0c;很像Prim&#xff0c;基本原理是&#xff1a; 我先找到距离集合路径…

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…

Oracle 正则表达式

一、Oracle 正则表达式相关函数 (1) regexp_like &#xff1a;同 like 功能相似&#xff08;模糊 匹配&#xff09; (2) regexp_instr &#xff1a;同 instr 功能相似&#xff08;返回字符所在 下标&#xff09; (3) regexp_substr &#xff1a; 同 substr 功能相似&…

七项上榜!通付盾十一度荣登安全牛《中国网络安全行业全景图》

2024年4月12日&#xff0c;安全牛第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;正式发布。通付盾凭借领先的技术实力与优秀的市场表现&#xff0c;成功入选身份与访问安全、应用与业务安全、移动安全、安全支撑技术与体系四大安全领域。 身份…

宝塔面板部署腾讯云的域名

一、腾讯云&#xff0c;搜索我的证书&#xff0c;点击打开如图所示&#xff0c;点击下砸 二、点击宝塔的证书&#xff0c;然后下载到桌面 三、解压 四、打开宝塔&#xff0c;网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去&#xff0c;保存并启用证书 六、有了…

基于SSM校园招聘信息管理系统的设计与实现说明(内附设计LW + PPT+ 源码下载)

摘 要 随着我国近年来高校不断的进行扩招&#xff0c;2022年全国高校的毕业生人数已经超过一千万人&#xff0c;而在这个时代的大学生早已不像上世纪八九十年代一样&#xff0c;毕业就可以分配工作&#xff0c;所以在当今这个时代毕业生找工作是个非常困难的事情。再加上近几…

[管理者与领导者-158] :团队管理 - 高效执行力 -1- 总体架构、策略、方法、情与法

目录 一、总体架构 二、管理者目标&#xff1a;管理者通过团队获得结果 2.1 考核目标 2.2 高效执行力的指标&#xff1a;时间、成本、质量、数量、满意度 三、管理者的管理策略&#xff1a;结果&#xff08;头与尾&#xff09; VS 过程 四、管理手段和方法 五、关于情与…

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…

【教程】7代核显直通HDMI成功输出 PVE下玩AIO最有性价比的机器

大家好&#xff0c;我是村雨Mura&#xff0c;好久没写教程了&#xff0c;本期是7代核显直通&#xff0c;重点在于HDMI输出画面 本教程理论上适用于4代以后intel带核显CPU&#xff0c;如果你有直通成功经验欢迎评论区分享 前面有点啰嗦&#xff0c;想直接看教程&#xff0c;直…

【每日练习】二叉树

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;二叉树 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 文章目录 一、100. 相同的树1. 题目简介2.…

Go语言中channel和互斥锁的应用场景

面对一个并发问题,我们的解决方案是使用channel还是互斥锁来实现并不总是很清晰。因为Go提倡使用通信来共享内存,所以一个常见的错误就是总是强制使用channel,不管实际情况如何。但是我们应该把这两种选择作为互补手段。 首先,简单回顾一下Go语言中的channel:channel是一种交…

同步检查继电器DT-13/200额定电压100V柜内安装板前接线JOSEF约瑟

系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 用途 DT-13型同步检查继电器用于两端供电线路的自动重合闸线路中&…

2024 年第十四届 Mathorcup 数学应用挑战赛题目C 题 物流网络分拣中心货量预测及人员排班完整思路以及源代码分享,仅供学习

电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同流向进行分拣并发往下一个场地&#xff0c;最终使包赛到达消费者手中。分拣中心管理效率的提升&#xff0c;对整…

物联网SaaS平台

在信息化、智能化浪潮席卷全球的今天&#xff0c;物联网SaaS平台作为推动工业数字化转型的重要工具&#xff0c;正日益受到广泛关注。那么&#xff0c;物联网SaaS平台究竟是什么&#xff1f;HiWoo Cloud作为物联网SaaS平台又有哪些独特优势&#xff1f;更重要的是&#xff0c;它…

使用unicloud-map 无法展示poi的天坑

天坑&#xff01;天坑&#xff01;天坑 使用unicloud-map的天坑 202404121722&#xff0c;昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败&#xff0c;一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的&#xff0c;所以今…

上网行为管理软件怎么选择?哪个软件好?| 三款热门行为审计软件分享

上网行为监控系统是一种用于监控和管理互联网使用行为的系统。 这种系统主要用于企业和学校等机构&#xff0c;以控制和管理员工或学生在工作时间或学习时间内对互联网的使用。 而现在的企业越来越信息化&#xff0c;随之而来的信息危机也丛生不断&#xff0c;企业管理软件也…