【String字符串之后续】

news2025/1/12 22:02:39

我们继续上一篇文章为大家讲解,String字符串的相关知识,希望大家有所收获💞💞💞

字符串前篇的链接: link

目录

  • 1.字符串的替换
  • 2.字符串的拆分
  • 3.字符串截取
  • 4.去掉空格
  • 5.String的不可变性
  • 6. 字符串的修改
  • 7.StringBuilder和StringBuffer
  • 8.面试题
    • 8.1面试1
    • 8.2面试2

1.字符串的替换

使用一个指定的新的字符串替换掉已有的字符串数据

由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串

String replaceAll(String regex, String replacement) 
//替换所有的指定内容
String replaceFirst(String regex, String replacement) 
//替换收个内容
public static void main(String[] args) {
        String str="aaabbbccc";
        String str1=str.replaceAll("aaa","111");
        String str2=str.replaceFirst("a","p");
        System.out.println(str1);
        System.out.println(str2);

    }

在这里插入图片描述

2.字符串的拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串

String[] split(String regex) 
//将字符串全部拆分
String[] split(String regex, int limit) 
//将字符串以指定的格式,拆分为limit组
 public static void main(String[] args) {
        String str = "hello world to bit" ;
        String[] result = str.split(" ") ; // 按照空格拆分
        for(String str1: result) {
            System.out.println(str1);
        }
    }

public static void main(String[] args) {
        String str = "hello world to bit" ;
        String[] result = str.split(" ",2) ; // 按照空格拆分
        for(String str1: result) {
            System.out.println(str1);
        }
    }

在这里插入图片描述
在这里插入图片描述

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义

注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
 public static void main(String[] args) {
        String str = "192.168.1.1" ;
        String[] result = str.split("\\.") ;
        for(String s: result) {
            System.out.println(s);
        }
    }

多次拆分

public static void main(String[] args) {
        String str = "name=lisi&age=20";
        String[] result = str.split("&");
        for (int i = 0; i < result.length; i++) {
            String[] temp = result[i].split("=");
            System.out.println(temp[0] + " = " + temp[1]);

        }
    }

在这里插入图片描述

3.字符串截取

从一个完整的字符串之中截取出部分内容
这里需要注意,这里的截取区间范围是【)(左闭右开)

String substring(int beginIndex) 
//从指定索引截取到结尾
String substring(int beginIndex, int endIndex) 
//截取部分内容
public static void main(String[] args) {
        String str="abcdef";
        System.out.println(str.substring(2));
        System.out.println(str.substring(2,6));
    }

在这里插入图片描述

4.去掉空格

我么使用String trim() 去掉字符串中的左右空格,保留中间空格

 public static void main(String[] args) {
        String str=" aaa aaa   ";
        System.out.println(str.trim());
    }

在这里插入图片描述

5.String的不可变性

String类在设计时就是不可改变的,String类实现描述中已经说明了
String类中的字符实际保存在内部维护的value字符数组中

注意:

  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中
    的内容可以修改。
    在这里插入图片描述
    所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内 容是可以修改的。

6. 字符串的修改

尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率
非常低下。

当我们想修改的时候,我们一般会对字符串新建一个对象,然后片拼接在一起

public static void main(String[] args) {
        String str="abc";
        for (int i = 0; i < 5; i++) {
            str=str+'a';
        }
        System.out.println(str);
    }

在这里插入图片描述
我们通过一个代码就可以看出来

        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);
            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);
            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的时间是最短的,StringBuiffer其次,String时间是最长的,因为要新建许多的对象

7.StringBuilder和StringBuffer

StringBuff append(Stringstr)
//在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
char charAt(int index) //获取index位置的字符
int length() //获取字符串的长度
int capacity() //获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)//扩容
void setCharAt(int index,char ch) //将index位置的字符设置为ch
int indexOf(String str) //返回str第一次出现的位置
int indexOf(String str, int fromIndex)//从fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str) //返回最后一次出现str的位置
int lastIndexOf(String str,int fromIndex)//从fromIndex位置开始找str最后一次出现的位置
StringBuff insert(int offset, String str)/// 在offset位置插入:八种基类类型 & String类型 & Object类型数据
StringBuffer deleteCharAt(int index)//删除index位置字符
StringBuffer delete(int start, int end) //删除[start, end)区间内的字符
StringBuffer replace(int start, int end, String str) //将[start, end)位置的字符替换为str
String substring(int start) //从start开始一直到末尾的字符以String的方式返回
String substring(int start,int end)[start, end)//范围内的字符以String的方式返回
StringBuffer reverse() //反转字符串
String toString() //将所有字符按照String的方式返回
    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!!!"); // Hello world!!!Hello world123
        System.out.println(sb1);
        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()方法

8.面试题

8.1面试1

String、StringBuffer、StringBuilder的区别
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操 作

8.2面试2

String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象

在这里插入图片描述

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

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

相关文章

STL:string类使用

编码&#xff1a; ASCII unicode–utf-8 utf-16----一个字符2个字符 utf-32----一个字符4个字节 gbk–中文编码表 string&#xff1a; 是一个特殊的容器&#xff0c;对数据&#xff08;字符数组&#xff09;和库函数&#xff08;strlen等&#xff09;进行封装 STL提供的内容…

OpenStack部署(三)

OpenStack部署 6. Neutron6.1 创建Neutron数据库并授权6.2 获得admin凭证6.3 创建 neutron 用户并设置密码6.4 添加admin角色到neutron 用户6.5 创建neutron服务实体6.6 创建网络服务API端点6.7 安装并配置neutron服务6.8 链接plugin.ini文件6.9 初始化neutron数据库6.10 重启计…

连续两年!PingCAP 入选 Gartner 云数据库“客户之声”,获评“卓越表现者”最高分

近日&#xff0c;全球权威信息技术研究与咨询机构 Gartner 发布了云数据库市场领域 2023 Gartner Peer Insights™“Voice of the Customer” 报告&#xff0c;PingCAP 在报告中获得的客户总体评分达到 4.9 分&#xff08;满分 5 分&#xff09;&#xff0c;在所有入选企业中位…

CBCGPCaptionBar 使用实例说明

CBCGPCaptionBar的位置如下&#xff1a; 如图区域就是 MainFrame.h中声明&#xff1a; CBCGPCaptionBar m_wndCaptionBar; MainFrame.cpp中创建显示控件&#xff1a; BOOL CMainFrame::CreateCaptionBar () { if (!m_wndCaptionBar.Create (WS_CHILD | WS_V…

力扣第三天 242.有效字母异位词 349 两个数组的交集

目录 1.242. 有效的字母异位词 2.349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 使用算法笔记&#xff1a; 总结&#xff1a; 1.242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

15. 算法之排序算法

前言 排序是在软件开发中经常遇到的需求。比如基于订单的创建时间倒排&#xff0c;基于金额大小排序等等&#xff0c;那么这些排序底层是怎么写的呢&#xff0c;本节&#xff0c;我们就常用排序算法展开介绍。 1. 冒泡排序 1.1 算法思想 冒泡排序是最基础的排序算法。冒泡排…

HashMap 的底层原理和源码分析

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 一、HashMap…

【迷宫】地下迷宫游戏-微信小程序开发流程详解

可曾记得&#xff0c;小时候上学路边买的透明铅笔盒&#xff0c;里面内嵌了一个小球&#xff0c;它用重力可从起点滚动到终点&#xff0c;对小朋友来说是感觉有趣的&#xff0c;在这个游戏的基础上&#xff0c;弄一款微信小程序的迷宫探索游戏试试&#xff0c;在不同关卡的迷宫…

14 【Vuex】

1.理解 Vuex 1.1 Vuex 是什么 概念&#xff1a;专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用…

基于RK3399+FPGA的地面测试台多参数数据记录仪方案(一)软件设计及测试

完成了测试台软件分析和编程环境搭建后&#xff0c;接下来就是软件的编写。本章主要包括 软件窗口界面设计和功能代码实现。以某型号数据记录仪的工作需求为目标&#xff0c;根据测试 工作流程&#xff0c;以 Linux-Qt 为主要开发手段&#xff0c;设计一款功能完备、界面友…

Java8 Stream详解及结束操作方法使用示例(三)

结束操作是指结束 Stream 该如何处理的操作&#xff0c;并且会触发 Stream 的执行。下面是一些常用的结束操作方法。结束操作会对数据源进行遍历&#xff0c;因此是及早求值的。 Java8 Stream详解及中间操作方法使用示例&#xff08;一&#xff09; ​​​​​​​Java8 Strea…

三种经典博弈(取石子问题)

三种经典博弈 巴什博奕威佐夫博奕尼姆博奕 博弈是有一种很有意思的游戏&#xff0c;就是有物体若干堆&#xff0c;可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干&#xff0c;规定最后取光物体者取胜。这是我国民间很古老的一个游戏&#xff0c;别看这游戏极其简…

一体化协同平台助力企业回归生产本质,创造价值

核心观点 单点工具的串联无法有效解决研效痛点问题&#xff0c;企业需要通过一体化协同平台提高端到端价值流动效率。一体化协同平台的价值是软件工程理念最大化落地、数字化研发管理、沉浸式研发体验。一体化协同平台集成需要评估闭环效率杠杆&#xff0c;确定集成边界和集成…

什么是关系模型? 关系模型的基本概念

关系模型由IBM公司研究员Edgar Frank Codd于1970年发表的论文中提出&#xff0c;经过多年的发展&#xff0c;已经成为目前最常用、最重要的模型之一。 在关系模型中有一些基本的概念&#xff0c;具体如下。 (1)关系(Relation)。关系一词与数学领域有关&#xff0c;它是集合基…

TensorRT 从7.2升级到8.5,改写plugin以适配新版本

前言 TensorRT是NVIDIA推出的一款高效深度学习模型推理框架&#xff0c;其包括了深度学习推理优化器和运行时&#xff0c;能够让深度学习推理应用拥有低时延和高吞吐的优点。 TensorRT的版本迭代速度非常快&#xff0c;很多之前写的plugin在版本升级后可能就没法直接使用&…

广州虚拟动力携数字人交互技术产品参展第十九届深圳文博会

2023年6月7-11日 深圳国际会展中心 第十九届深圳文博会正式举办&#xff01; 广州虚拟动力携数字人交互技术产品参展 诚邀您莅临粤港澳大湾区馆&#xff08;11号馆&#xff09; 广东参展团展位参观交流 数字技术&#xff0c;引领文化产业新发展 中国文化及相关文化产业的…

【Apache Pinot】Controller、Broker 和 Server 的概念和工作流程

背景 笔者最近一段时间使用 Apache Pinot 比较多&#xff0c;发现目前国内使用 Pinot 的很少&#xff0c;所以跟他相关的资料也比较少&#xff0c;本人在扩容&#xff0c;升级&#xff0c;部署&#xff0c;查询等方面操作有些许经验&#xff0c;知道其中有很多细节需要注意和规…

北邮22信通:实验七 三角波-方波(锯齿波-矩形波)发生器实验报告(着急验收的同学先看看,后续细节正在赶来中)

北邮22信通一枚~ 持续更新模电实验讲解 关注作者&#xff0c;解锁更多邮苑模电实验报告~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 实验七 三角波-方波&#xff08;锯齿波-矩形波&#xff09;发生器实验…

数据结构——树的概念、二叉树的概念

文章目录 引言1.树的概念1.1.树的其他相关概念 2.树的代码实现的结构2.1.树形结构的应用 3.二叉树的概念3.1.特殊二叉树的概念3.1.1.完全二叉树3.1.2.满二叉树 3.2.二叉树试题讲解3.2.1.试题一3.2.2.试题二3.2.3.试题三 4.二叉树的存储结构4.1.顺序结构存储4.2.链式结构存储 引…

重温经典:简读光干涉、衍射原理

如果您不是光学专业的&#xff0c;或者是文科生&#xff0c;那么您想到光的干涉和衍射第一反应应该是很多公式对不对&#xff1f;头好大是不是&#xff1f;好&#xff0c;那么今天我们就不用一个公式来重新解读光的干涉和衍射。 光&#xff0c;也叫电磁波&#xff0c;他的表现…