Java 中 String 类

目录

1 常用方法

1.1 字符串构造

1.2 字符串包含的成员

1.3 String 对象的比较

1.4 字符串查找

1.5 转化

1.5.1 数值和字符串转化

1.5.2 大小写转化

1.5.3 字符串转数组

1.5.4 格式化

1.6 字符串替换

1.7 字符串拆分

1.8 字符串截取

1.9 其他操作方法

1.10 字符串的不可变性

1.11 字符串修改

2 StringBuilder 和 StringBuffer

2.1 StringBuilder 和 StringBuffer 的区别

2.2 StringBuilder、StringBuffer 和 String 比较

3 试题


常用方法


1.1 字符串构造


String 是字符串类型


String 类提供的构造方式非常多,常用的就以下三种:


① 使用常量串构造

String s1 = "hello bit";

System.out.println(s1);


② 直接 newString 对象

String s2 = new String("hello bit");

System.out.println(s1);


③ 使用字符数组进行构造

char[] array = {'h','e','l','l','o','b','i','t'};

String s3 = new String(array);

System.out.println(s1);


其它构造方法


从0位置开始偏移1个输出 a


从0位置开始偏移2个输出 ab


从1位置开始偏移2个输出 bc


1.2 字符串包含的成员


① 注意:String 是引用类型,内部并不存储字符串本身,在 String 类的实现源码中,String 类实例变量如下:


System.out.println(s1.length());

 // 获取字符串长度


// 打印"hello"字符串(String对象)的长度也可以直接某一字符串. length()

System.out.println("hello".length());

结果:5


System.out.println(s1.isEmpty());

// 如果字符串长度为0,返回true,否则返回 false


② 在 Java 中 “ ” 引起来的是 String 类型对象


1.3 String 对象的比较


① == 比较两个引用变量比较的是地址



② 比较内容(boolean equals(Object anObject)



③ 比较大小(int compareTo(String s)



④ 忽略大小写比较大小(int compareToIgnoreCase(String str)



1.4 字符串查找



char charAt(int index) (通过下标返回字符)


返回 index 位置上字符,如果 index 为负数或者越界,抛出 IndexOutOfBoundsException 异常




一个一个字符串进行打印



int indexOf(int ch)  (通过字符返回下标)


返回 ch 第一次出现的位置,没有返回-1



当出现两个相同字符串时默认从头到后(第一个字符串出现的位置)



int indexOf(int ch, int fromIndex)  (从指定位置开始查找)


从 fromIndex 位置开始找 ch 第一次出现的位置,没有返回-1


从3位置开始找,打印结果为:3


从指定位置查找字符串出现的位置


从3位置开始找,打印结果为:5


int lastIndexOf(int ch)  (通过下标倒着找字符)


从后往前找,返回 ch 第一次出现的位置,没有返回-1


结果:5


int lastIndexOf(int ch, int fromIndex)  (从指定位置倒着往回找)


从 fromIndex 位置开始找,从后往前找 ch 第一次出现的位置,没有返 回-1


从4位置开始倒着往回找,结果为:2


1.5 转化


1.5.1 数值和字符串转化

ValueOf 中不管传任何数据都会变成字符串



也可以字符串转数字



1.5.2 大小写转化

① toUpperCase (小写变大写,原来大写的不动)


转变大小写需要进行接收,是一个新对象



未接收则是原来的对象



② toLowerCase (大写变小写,原来小写的不动)



1.5.3 字符串转数组


数组转字符串



1.5.4 格式化

此处 %d 相当于一个占位符


1.6 字符串替换


replace(有两种)



两个 replace 里面的参数不一样,一个两个都是 char 类型,还有一个两个都是 charSequence


String 类在定义时实现了 charSequence 接口,意味着对于 charSequence 接口本身来说能接收String 类型数据


对 String 本身修改都是产生新的对象的(字符串的不可变性)



另外两个与 replace 有关的



① replaceFrist (只对第一次出现的进行修改)



② replaceAll (替换所有指定内容)



1.7 字符串拆分



以空格为分割拆分



以空格分开最多分两组



特殊情况



修改后




也可以进行两次分割(在第一次分割基础上进行第二次分割)



注意

1. 字符“.”,“|”,“*”,“+”都得加上转义字符,前面加上 “\\”

2. 而如果是 “\\” ,那么就得写成 “\\\\”

3. 如果一个字符串中有多个分隔符,可以用“|”作为连字符


1.8 字符串截取




1.9 其他操作方法




1.10 字符串的不可变性


String 类不能修改的主要原因是:String 类功能是私有的



String 是一种不可变对象,字符串中的内容是不可改变,字符串不可被修改,是因为:


 String 类在设计时就是不可改变的,String 类实现描述中已经说明了 


以下来自 JDK1.8 中 String 类的部分实现:


String 类中的字符实际保存在内部维护的 value 字符数组中,该图还可以看出:

1. String 类被 final 修饰,表明该类不能被继承

2. value 被修饰被 final 修饰,表明 value 自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改


② 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象


纠正:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变,这种说法是错误的,不是因为 String 类自身,或者其内部 value 被 final 修饰而不能被修改


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



为什么 String 要设计成不可变的?(不可变对象的好处是什么?)


1. 方便实现字符串对象池,如果 String 可变,那么对象池就需要考虑写时拷贝的问题了

2. 不可变对象是线程安全的

3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中


那如果想要修改字符串中内容,该如何操作呢?


1.11 字符串修改


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



如果要修改建议尽量使用 StringBuffer 或者 StringBuilder


String、StringBuffer、StringBuilder 对 String 类型对象进行修改,由于 String 类不能修改,所有的修改都会创建新对象,每次返回的对象都不一样,不断地创建对象销毁对象,效率非常低下,而 StringBuffer、StringBuilde 都在 append 拼接后指向同一个对象


String、StringBufferStringBuilder 对 String 类型对象进行修改前后之间的时间对比




2 StringBuilder 和 StringBuffer


由于 String 不可更改特性,为了方便字符串的修改, Java 中又提供 StringBuilder 和 StringBuffer 类,这两个类大部分功能是相同的 


2.1 StringBuilder 和 StringBuffer 的区别


StringBuffer 的 append 方法



StringBuilder 的 append 方法



StringBuilder 和 StringBuffer 中 append 内容没什么区别,都是返回 this,区别在于方法旁边的关键字



线程安全类似于一间厕所有人进去后就上了锁,即同一时间只有一个线程可以执行此方法


每次开锁和上锁都需要耗费资源,StringBuffer 是线程安全的,也意味着在多线程情况下虽然安全,但是效率很低,频繁的开锁上锁对资源是消耗的


2.2 StringBuilderStringBuffer 和 String 比较


StringBuilder 和 StringBuffer 这两个类包含了一些 String 没有的方法,它的功能进一步扩大


StringBuff append(String str)


在尾部追加,相当于 String的+=,可以追加(追加:即尾插):boolean、char、char[]、 double、float、int、long、Object、String、StringBuff 的变量



StringBuff insert(int offset, String str)


在 offset 位置插入:八种基类类型 & String类型 & Object类型数据


public class StringBufferInsertExample {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer("Hello World!");
        buffer.insert(6, "Beautiful ");
        System.out.println(buffer.toString()); // 输出: Hello Beautiful World!
    }
}

StringBuffer deleteCharAt(int index)

删除index位置字符


StringBuffer delete(int start, int end) 

删除[start, end)区间内的字符


StringBuffer replace(int start, int end, String str)

将[start, end)位置的字符替换为str


StringBuffer reverse() 

反转字符串:对字符串进行逆置 


以 String 方法返回的方法




String 和 StringBuilder、StringBuffer 类不能直接转换,要想互相转换,可以采用如下原则:


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


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


补充



String、StringBufferStringBuilder 的区别


String 的内容不可修改,StringBuffer 与 StringBuilder 的内容可以修改,包含的方法也不一样 

StringBuffer 与 StringBuilder 大部分功能是相似的

StringBuffer 采用同步处理,属于线程安全操作

StringBuilder 未采用同步处理,属于线程不安全操作


3 试题


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



② 最后一个单词的长度



③ 检测字符串是否为回文


④ 字符串相加



⑤ 字符串转整形数字


方法一:使用Integer.parseInt()方法:



方法二:定义了一个 stringToInt 方法,它尝试将输入的字符串转换为整数。如果字符串不是一个有效的整数表示,则返回0。代码还处理了溢出情况,确保返回的整数在 Java 的 Integer 类型的范围内


public class StringToInteger {
    public static void main(String[] args) {
        String str = "1234";
        int num = stringToInt(str);
        System.out.println("转换后的整数为: " + num);
    }
 
    public static int stringToInt(String str) {
        if (str == null) {
            return 0;
        }
        int res = 0;
        boolean isPositive = true;
        for (int i = 0; i < str.length(); i++) {
            if (i == 0 && (str.charAt(i) == '-' || str.charAt(i) == '+')) {
                isPositive = str.charAt(i) == '+' ? true : false;
                continue;
            }
            if (str.charAt(i) < '0' || str.charAt(i) > '9') {
                return 0;
            }
            res = res * 10 + (str.charAt(i) - '0');
            if (res > Integer.MAX_VALUE) {
                return isPositive ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
        }
        return isPositive ? res : -res;
    }
}

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

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

相关文章

DDR3控制器(一)DDR3 IP调用

目录 一、DDR3 IP核简介 二、DDR3 IP核调用 在千兆以太网通信中用到了DDR3控制器&#xff0c;但是并没有对其做相关介绍。这次准备重新整理一下DDR3控制相关知识&#xff0c;复习巩固一下。 一、DDR3 IP核简介 MIG IP核&#xff08;Memory Interface Generator&#xff09;是…

SiLM585x系列SiLM5851NHCG-DG一款具有分离的管脚输出 单通道隔离驱动器 拥有强劲的驱动能力

SiLM585x系列SiLM5851NHCG-DG是一款单通道隔离驱动器&#xff0c;具有分离的管脚输出&#xff0c;提供3.0A源电流和6.0A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 2.5A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为1…

计算机毕业设计Thinkphp/Laravel学生考勤管理系统zyoqy

管理员登录学生考勤管理系统后&#xff0c;可以对首页、个人中心、公告信息管理、年级管理、专业管理、班级管理、学生管理、教师管理、课程信息管理、学生选课管理、课程签到管理、请假申请管理、销假申请管理等功能进行相应操作&#xff0c;如图5-2所示。学生登录进入学生考勤…

一天跌20%,近500只下跌,低价可转债为何不香了?

6月以来&#xff0c;Wind可转债低价指数累计下跌7.3%&#xff0c;大幅跑输中价、高价转债。分析认为&#xff0c;市场调整的底层逻辑在于投资者对风险的重新评估和流动性的紧缩&#xff0c;宏观经济的波动和政策环境的不确定性、市场结构性的变化均对低价可转债市场产生了冲击。…

ai智能写作助手有哪些?3款AI工具推荐

ai智能写作助手有哪些&#xff1f;在数字化时代的浪潮中&#xff0c;AI智能写作助手如同智慧的灯塔&#xff0c;照亮了创作者们的道路。它们不仅极大地提升了写作效率&#xff0c;让文字流淌更加顺畅&#xff0c;更能够深入挖掘和激发创作者的内在灵感&#xff0c;将创意的火花…

RK3568平台开发系列讲解(I2C篇)利用逻辑分析仪进行I2C总线的全面分析

🚀返回专栏总目录 文章目录 1. 基础协议1.1. 协议简介1.2. 物理信号1.3. 总线连接沉淀、分享、成长,让自己和他人都能有所收获!😄 1. 基础协议 1.1. 协议简介 IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。 主要是用来方…

MYSQL 将某个字段赋值当前时间

如 我们需要将use_time 赋值为当前时间&#xff1a; 准备三条数据 &#xff1a; 执行sql &#xff0c;2种当前时间赋值函数&#xff0c;1种关键字赋值 &#xff1a; update test_info SET use_timeNOW() WHERE id 1; update test_info SET use_timeCURRENT_TIMESTAMP() …

C++并发之阻塞队列(block,queue)

目录 1 概述2 实现3 测试3 运行 1 概述 最近研究了C11的并发编程的线程/互斥/锁/条件变量&#xff0c;利用互斥/锁/条件变量实现一个支持多线程并发的阻塞队列&#xff0c;队列大小没有限制。 阻塞队列是一个模板类&#xff0c;有两个模块参数&#xff0c;参数1是元素类型&…

【芯片】MCU的分类

MCU又称单片微型计算机(Single Chip Microcomputer )或者单片机&#xff0c;是把中央处理器(Central Process Unit&#xff1b;CPU)的频率与规格做适当缩减&#xff0c;并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口&#xff0c;甚至LCD驱动电路都…

MySQL报错Duplicate entry ‘0‘ for key ‘PRIMARY‘

报错现场 现象解释 因为你在插入时没有给 Customer.Id 赋值&#xff0c;MySQL 会倾向于赋值为 NULL。但是主键不能为 NULL&#xff0c;所以 MySQL 帮了你一个忙&#xff0c;将值转换为 0。这样&#xff0c;在第二次插入时就会出现冲突&#xff08;如果已经有一条记录为 0&…

第二证券:什么是破净股票?破净股票好还是不好?

一家公司手上掌握的财物包含实物财物、公司注册资金、未分配利润、各种公积金及品牌价值等等&#xff0c;一家公司的负债包含贷款、应付款、其他公司给的预付款等等。公司的总财物减去总负债后得到的净财物&#xff0c;再除以股票总数&#xff0c;就是公司的每股净财物&#xf…

【LM-Debugger】让研究人员与开发者能够深入洞察并干预模型的预测过程,开启了模型透明度和可解释性的一扇新门

背景 基于 Transformer 的语言模型 (LM) 是现代 NLP 模型的支柱&#xff0c;但其内部预测构建过程不透明。这对于不了解模型为何做出特定预测的最终用户以及希望调试或修复模型行为的开发人员来说都是个问题用于检查和干预基于转换器的语言模型的交互式工具项目地址&#xff1…

React的Redux的状态管理

步骤 1.创建新项目 npx create-react-app react-redux 2.安装配套工具 npm i reduxjs/toolkit react-redux 3.启动项目 npm run start 4.在src目录下创建store文件夹 5.在store文件夹下创建modules文件夹 6.在store文件夹里创建index.js文件 7.在counterStore.js文件…

【扩散模型(二)】IP-Adapter 从条件分支的视角,快速理解相关的可控生成研究

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;本文将从该视角快速理解 IP-Adapter 以及相关可控生成研究。 文章目…

Open3D 删除点云中重复的点

目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份   构造重叠区域   合并点云获得重叠点 2、主要…

第二期书生·浦语大模型实战营优秀项目一览

书生浦语社区于 2023 年年底正式推出了书生浦语大模型实战营系列活动&#xff0c;至今已有两期五批次同学参加大模型学习、实战&#xff0c;线上课程累计学习超过 10 万人次。 实战营特设项目实践环节&#xff0c;提供 A100 算力支持&#xff0c;鼓励学员动手开发。第 2 期实战…

SolidWorks北京正版代理商亿达四方:官方授权SolidWorks中国代理

在北京这座融合了古老文明与现代科技的都市中&#xff0c;亿达四方作为SolidWorks官方认证的北京区域正版代理商&#xff0c;正引领着一场设计与制造领域的革新风潮。我们致力于为北京及周边地区的企业提供原汁原味的SolidWorks软件及全方位的增值服务&#xff0c;共同推进首都…

想要用tween实现相机的移动,three.js渲染的canvas画布上相机位置一点没动,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Git】版本控制器的方式:SVN集中式版本控制工具和Git分布式版本控制工具

一、应用场景 二、版本控制器的方式 三、SVN 集中式版本控制工具 四、Git 分布式版本控制工具 五、Git工作流程 一、应用场景 Git 在开发过程中提供了多种应用场景&#xff0c;帮助开发团队高效地管理代码、协同工作&#xff0c;并保证代码质量。以下是一些具体应用场景和相应…

Springboot Mybatis 多数据源配置以及使用

在Spring Boot中配置MyBatis的多数据源是一个常见需求&#xff0c;尤其是在需要连接多个数据库时&#xff0c;下面是详细的步骤指南。 引入依赖 首先&#xff0c;在你的pom.xml文件中添加Spring Boot、MyBatis和数据库连接的相关依赖。例如&#xff0c;如果你使用的是MySQL数…