Java 中 String 类

news2024/12/28 3:48:53

目录

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;
    }
}

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

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

相关文章

智慧办公新篇章:可视化技术引领园区管理革命

随着科技的飞速发展&#xff0c;办公方式也在经历着前所未有的变革。在这个信息爆炸的时代&#xff0c;如何高效、智能地管理办公空间&#xff0c;成为了每个企业和园区管理者面临的重要课题。 智慧办公园区作为未来办公的新趋势&#xff0c;以其高效、便捷、智能的特点&#x…

面向对象修炼手册(一)(类与对象)(Java宝典)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;面向对象修炼手册 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 思想 代理和团体 类 1 基本概…

设施布置之车间布局优化SLP分析

一 物流分析&#xff08;Flow Analysis&#xff09; 的基本方法 1、当物料移动是工艺过程的主要部分时&#xff0c;物流分析就是工厂布置设计的核心工作&#xff0c;也是物料搬运分析的开始。 2、零部件物流是该部件在工厂内移动时所走过的路线&#xff0c; 物流分析不仅要考虑…

鸿蒙开发通信与连接:【@ohos.wifi (WLAN)】

WLAN 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import wifi from ohos.wifi;wifi.isWifiActive isWifiActive(): boolean 查询WLAN是否已激活。 需要权限&#xff1a; ohos.p…

java基于ssm+jsp KTV点歌系统

1管理员功能模块 管理员登录&#xff0c;通过填写注册时输入的用户名、密码进行登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入KTV点歌系统可以查看个人中心、用户管理、歌曲库管理、歌曲类型管理、点歌信息管理等信息。 修改密码&#xff0c;在修改密码页…

【数据分享】《中国改革年鉴》1989-2022

最近老有同学过来询问《中国经济体制改革年鉴》、《中国改革年鉴》这两本数据的关系以及怎么获取这两本本数据。今天就在这里给大家分享一下这三本数据的具体情况。 《中国改革年鉴》由国家发展和改革委员会主管,中国经济体制改革研究会主办,中国经济体制改革杂志社编辑出版,是…

iOS开发工具-网络封包分析工具Charles

一、Charles简介 Charles 是在 Mac 下常用的网络封包截取工具&#xff0c;在做 移动开发时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。 Charles 通过将自己设置成系统的网络访问代理服务器&#xff0c;使得所有的网络访问请求…

Lighthouse浮游菌采样器AC100H及操作使用介绍-中邦兴业

Lighthouse浮游菌采样器AC100H介绍 Lighthouse浮游菌采样器AC100是一款高性能的便携式浮游菌采样器&#xff0c;专为洁净室和无菌环境设计。它基于先进的光学技术和安德森撞击原理&#xff0c;实现了对微小浮游菌的高效采集。采样器内置了HEPA高效过滤器&#xff0c;能够过滤掉…

泽众云真机-平台即将升级支持华为机型HarmonyOS NEXT系统

具小编了解&#xff0c;泽众云真机即将升级支持华为机型HarmonyOS NEXT系统。有些人可能对HarmonyOS NEXT系统了解不多。 之前我们有个银行项目&#xff0c;客户要求测试华为HarmonyOS NEXT系统环境&#xff0c;当时我们云真机尚未有该系统的机型&#xff0c;然后技术人员向华为…

React的服务器端渲染(SSR)和客户端渲染(CSR)有什么区别?

React的服务器端渲染&#xff08;SSR&#xff09;和客户端渲染&#xff08;CSR&#xff09;是两种不同的页面渲染方式&#xff0c;它们各自有不同的特点和适用场景&#xff1a; 服务器端渲染&#xff08;SSR&#xff09; 页面渲染: 页面在服务器上生成&#xff0c;然后将完整的…

如何最简单的方式使用nodejs中的http-server发布轻量级的html网页

1、查看nodejs是否安装。 node 2、设置环境路径。 3、使用npm install http-server -g安装http-server >npm install http-server -g 5、启动http-server服务,查看是否正确安装。 http-server 6、查看是否能够正常运行。 5、创建文件夹&#xff0c;复制html、css、js、in…

使用Rsbuild构建基于Vue3+Vant4开发h5应用

一、介绍 1.1 Vant介绍 Vant 是一个轻量、可定制的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 使用文档&#xff1a;快速上手 - Vant 4 (vant-u…

35、正则表达式

一、正则表达式命令 正则表达式&#xff1a;匹配的是文本内容&#xff0c;linux的文本三剑客都是针对文本内容。 ​ grep 过滤文本内容 ​ sed 针对文本内容进行增删改查 ​ awk 按行取列 文本三剑客----都是按照行进行匹配。 1.1、grep筛选&#xff1a; grep的作用就是…

Swift Combine — zip和combineLatest的理解与使用

Publisher 上还有一些其他的操作&#xff0c;比如 zip 和 combineLatest&#xff0c;能让我们在时序上对控制多个 Publisher 的结果进行类似 and 和 or 的合并&#xff0c;它们在构建复杂 Publisher 逻辑时也十分有用。 zip Publisher 中的 zip 和 Sequence 的 zip 相类似&am…

VERYCLOUD睿鸿股份亮相亚马逊云科技中国峰会2024

5月30日&#xff0c;为期两天的亚马逊云科技中国峰会在上海世博中心圆满落幕。 多位大咖现场分享&#xff0c;生成式AI时代的数据战略&#xff0c;企业级AI应用&#xff0c;最新技术、产品重磅发布&#xff0c;创新行业解决方案 …… 作为亚马逊云科技的生态合作伙伴&#x…

Docker:认识Docker Host/Container/none网络

文章目录 Docker Host网络认识Docker Host网络实际操作网络模式区别使用场景 Docker Container网络认识Docker Container网络操作实例使用场景 Docker None网络使用场景 Docker Host网络 认识Docker Host网络 Docker容器运行默认会分配独立的Network Namespace隔离子系统&…

计算机网络 交换机的安全配置

一、理论知识 1.交换机端口安全功能介绍 交换机端口安全功能是针对交换机端口进行安全属性的配置&#xff0c;以控制用户的安全接入。主要包括以下两种配置项&#xff1a; ①限制交换机端口的最大连接数&#xff1a;控制交换机端口连接的主机数量&#xff1b;防止用户进行恶…

微信小程序笔记 四!

协同工作和发布 - 协同工作 1. 了解权限管理需求 在中大型的公司里&#xff0c;人员的分工非常仔细&#xff1a;同一个小程序项目&#xff0c;一般会有不同岗位、不同角色的员工同时参与设计与开发。 此时出于管理需要&#xff0c;我们迫切需要对不同岗位、不同角色的员工的…

游戏录屏软件,游戏录屏,3款软件推荐

“最近迷上了电脑游戏&#xff0c;想把自己在游戏中的精彩瞬间给记录下来。看到网上其他人录制的游戏都十分高清且有趣。想问问大家都是用什么软件进行游戏录屏的&#xff1f;有推荐的软件吗&#xff1f;” 在游戏生活中&#xff0c;相信你也一定想要记录下和队友在游戏中的欢…

应用篇| 深入浅出LLM应用之RAG

相信很多人都使用过LLM大模型&#xff0c;但是现有大模型或多或少都有以下问题&#xff1a; LLM幻觉问题&#xff1a;从《【小白入门篇1】GPT到底是怎样练成&#xff1f;》我们知道虽然大模型现在能力很强,但是本质就是在做文字接龙,而且每次接龙都具有随机性, 导致模型有时候…