String类(2)

news2024/11/22 7:11:28

❤️❤️前言~🥳🎉🎉🎉 

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讲其更深层的内容.

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

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

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

相关文章

【日常记录】【JS】使用Number.prototype.toLocaleString 对 数字做 格式化

文章目录 1、引言2、语法参数3、常见案例4、参考链接 1、引言 在目前的项目中&#xff0c;经常需要给数字做格式化处理&#xff0c;特别是财务方面&#xff0c;比如分割成千分位&#xff0c;保留小数&#xff0c;增加符号等 &#xff0c;这些都需要我们手写一些函数来处理。 但…

Vue.js组件精讲 第2章 基础:Vue.js组件的三个API:prop、event、slot

如果您已经对 Vue.js 组件的基础用法了如指掌&#xff0c;可以跳过本小节&#xff0c;不过当做复习稍读一下也无妨。 组件的构成 一个再复杂的组件&#xff0c;都是由三部分组成的&#xff1a;prop、event、slot&#xff0c;它们构成了 Vue.js 组件的 API。如果你开发的是一个…

TechTool Pro for Mac v19.0.3中文激活版 硬件监测和系统维护工具

TechTool Pro for Mac是一款专为Mac用户设计的强大系统维护和故障排除工具。它凭借全面的功能、高效的性能以及友好的操作界面&#xff0c;赢得了广大用户的信赖和好评。 软件下载&#xff1a;TechTool Pro for Mac v19.0.3中文激活版 作为一款专业的磁盘和系统维护工具&#x…

大数据入门之如何利用Phoenix访问Hbase

在大数据的世界里&#xff0c;HBase和Phoenix可谓是一对黄金搭档。HBase以其高效的列式存储和强大的数据扩展能力&#xff0c;成为大数据存储领域的佼佼者&#xff1b;而Phoenix则以其SQL化的操作方式&#xff0c;简化了对HBase的访问过程。今天&#xff0c;就让我们一起看看如…

哲学家带你实现单链表

最近本哲♂学家学习了链表这一新的数据结构&#xff0c;接下来由我带领大家实现链表&#xff1a; 一 、头文件 注&#xff1a;本写法是无头的单链表&#xff0c;所以传参为二级指针。 我们事先写好所要完成的函数&#xff0c;在 .c文件中进一步去完成。 typedef int SLTData…

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

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

云原生数据库海山(He3DB)PostgreSQL版核心设计理念

本期深入解析云原生数据库海山PostgreSQL版&#xff08;以下简称“He3DB”&#xff09;的设计理念&#xff0c;探讨在设计云原生数据库过程中遇到的工程挑战&#xff0c;并展示He3DB如何有效地解决这些问题。 He3DB是移动云受到 Amazon Aurora 论文启发而独立自主设计的云原生数…

【学习】Spring IoCDI

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 Spring 是什么&#xff1f; 什么是 IoC容器&#xff1f; 传统开发模式 loC开发模式 IoC的优势 IoC 的使用 Bean的…

策略为王股票软件源代码-----如何修改为自己软件04

上面是如何打开-------类---------函数 1. 数据结构 1) 股票数据结构的定义在头文件Src\StkLib\Include\Stock.h中,主要的几个结构定义为: KDATA K线数据结构 DRDATA 除权数据结构 REPORT 交易所在交易时间内不断发送的报价信息 MINUTE 分钟成交…

最大连续1的个数 III

题目链接 最大连续1的个数 III 题目描述 注意点 nums[i] 不是 0 就是 10 < k < nums.length 解答思路 创建一个滑动窗口&#xff0c;保证窗口内翻转0的个数始终不大于k&#xff0c;不断移动窗口的右边界&#xff0c;有以下三种情况&#xff1a; 当右边界的值为1&…

Java基础第十课——类与对象(1)

前面二白的九讲属于Java基础方面的内容&#xff0c;总体来说偏基础和简单&#xff0c;能完成的操作也有限&#xff0c;有兴趣的同学可以写一写相关的管理系统&#xff0c;后面二白也会上传一些自己敲的小系统&#xff0c;下面就要开始Java面对对象的知识内容了&#xff0c;从这…

【年度典型案例】扫码就能领补贴?通知社保在线速办?当心是钓鱼骗局!

随着我们生活的数字化程度越来越高&#xff0c;完成各种业务和服务变得前所未有的便捷。只需轻轻一点手机屏幕&#xff0c;我们办事儿变得飞快又方便。然而&#xff0c;正当我们享受这种数字化带来的便捷时&#xff0c;一些不法分子也在暗中伺机而动&#xff0c;利用各种手段制…

c# refc# substring c# 反射c# split c# websocket c# datatable使用

在C#编程中&#xff0c;ref关键字、Substring方法、反射&#xff08;Reflection&#xff09;、Split方法、WebSocket通信以及DataTable的使用都是常见的技术和方法。下面我将逐一为您详解这些内容。 1. C# ref关键字 ref关键字在C#中用于按引用传递参数。这意味着当您将变量作…

PC-lint 学习之配置方法

1. 下载PC-lint 9.0后&#xff0c;点击pclint9setup.exe进行安装&#xff08;我只安装了C/C语言&#xff0c;其他语言可安装时选择&#xff09; 2.安装完成后&#xff0c;打开keil5&#xff0c;选择配置 3. 配置选项 &#xff08;1&#xff09;Lint Executable&#xff1a;在第…

基于SpringBoot+Vue+Mysql的图书管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

html+javascript,用date完成,距离某一天还有多少天

图片展示: html代码 如下: <style>* {margin: 0;padding: 0;}.time-item {width: 500px;height: 45px;margin: 0 auto;}.time-item strong {background: orange;color: #fff;line-height: 100px;font-size: 40px;font-family: Arial;padding: 0 10px;margin-right: 10px…

LeetCode---392周赛

题目列表 3105. 最长的严格递增或递减子数组 3106. 满足距离约束且字典序最小的字符串 3107. 使数组中位数等于 K 的最少操作数 3108. 带权图里旅途的最小代价 一、最长的严格递增或递减子数组 按照题目要求进行模拟即可&#xff0c;这里提供两者思路&#xff1a; 1、两次…

Harmony鸿蒙南向外设驱动开发-Codec

功能简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于OpenMax实现了视频硬件编解码驱动&#xff0c;提供Codec基础能力接口给上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

数据分析python代码——数据填充

在Python中&#xff0c;我们通常使用pandas库来处理和分析数据。数据填充是数据预处理的一个重要步骤&#xff0c;用于处理数据中的缺失值。以下是使用pandas库进行数据填充的示例代码&#xff1a; 在数据分析中&#xff0c;处理缺失值&#xff08;空值&#xff09;是一个重要…