【Java】认识String类
文章目录
- 一、String类的重要性
- 二、String类中的常用方法
- 1.字符串构造
- 2.String对象的比较
- 3.字符串查找
- 4.转换
- 5.字符串替换
- 6.字符串拆分
- 7.字符串截取
- 8.其他操作方法
- 9.字符串的不可变性
- 10.字符串修改
- 三、StringBuilder和StringBuffer
一、String类的重要性
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类
二、String类中的常用方法
1.字符串构造
String类提供的构造方式非常多,常用的有以下三种:
public class Test {public static void main(String[] args) {String s = "hello";System.out.println(s);String s1 = new String("hello");System.out.println(s1);char[] s3 = {'h','e','l','l','o'};System.out.println(s3);}
}

注意:
1.String类是引用类型,内部并不存储字符串本身
2.在Java中""引起来的也是String类型对象
2.String对象的比较
Java中提供了四种比较方式:
1.==比较是否引用同一对象
public class Test {public static void main(String[] args) {int a = 10;int b = 20;int c = 10;System.out.println(a==b);System.out.println(a==c);System.out.println("********");String s = new String("hello");String s1 = new String("hello");String s2 = new String("word");String s3 = s;System.out.println(s==s1);System.out.println(s1==s2);System.out.println(s==s3);}
}

注意: 对于内置类型,== 比较的是变量中的值;对于引用类型==比较的是引用中的地址
2.boolean equals(Object anObject) 方法:按照字典序比较
字典序:字符大小的顺序
String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较
public class Test {public static void main(String[] args) {String s = new String("hello");String s1 = new String("hello");String s2 = new String("Hello");// equals比较:String对象中的逐个字符// s与s2引用的不是同一个对象,而且两个对象中内容也不同,因此输出false// s与s1引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出trueSystem.out.println(s.equals(s2));System.out.println(s.equals(s1));}
}

3.int compareTo(String s) 方法: 按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
1.先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
2.如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
public class Test {public static void main(String[] args) {String s = new String("abc");String s1 = new String("ac");String s2 = new String("abc");String s3 = new String("abcde");System.out.println(s.compareTo(s1));//不同输出字符的差值为-1System.out.println(s.compareTo(s2));//输出字符相同为0System.out.println(s.compareTo(s3));//前几个字符相同,输出长度差值为-2}
}

4. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较
public class Test {public static void main(String[] args) {String s = new String("abc");String s1 = new String("ac");String s2 = new String("ABc");String s3 = new String("abcde");System.out.println(s.compareToIgnoreCase(s1));//不同输出字符的差值为-1System.out.println(s.compareToIgnoreCase(s2));//输出字符相同为0System.out.println(s.compareToIgnoreCase(s3));//前几个字符相同,输出长度差值为-2}
}

3.字符串查找
字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:
| 方法 | 功能 |
|---|---|
| char charAt(int index) | 返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常 |
| int indexOf(int ch) | 返回ch第一次出现的位置,没有返回-1 |
| int indexOf(int ch, int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 |
| int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 |
| int indexOf(String str, int fromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
| int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
| int lastIndexOf(int ch, int fromIndex) | 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1 |
| :int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1: |
| int lastIndexOf(String str, int fromIndex) | 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1 |
public class Test {public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3)); System.out.println(s.indexOf('c'));System.out.println(s.indexOf('c', 10));System.out.println(s.indexOf("bbb"));System.out.println(s.indexOf("bbb", 10));System.out.println(s.lastIndexOf('c'));System.out.println(s.lastIndexOf('c', 10));System.out.println(s.lastIndexOf("bbb"));System.out.println(s.lastIndexOf("bbb", 10));}
}

4.转换
1.数值和字符串转换化
public class Test {public static void main(String[] args) {String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);String s3 = String.valueOf(true);System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println("=================================");// 字符串转数字// 注意:Integer、Double等是Java中的包装类型int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");System.out.println(data1);System.out.println(data2);}
}

2.大小写转换
public class Test {public static void main(String[] args) {String s = "hello";String s1 = "HELLO";System.out.println(s.toUpperCase());//小写转大写System.out.println(s1.toLowerCase());//大写转小写}
}

这两个函数只转换字母
3.字符串转数组
public class Test {public static void main(String[] args) {String s = "hello";// 字符串转数组char[] ch = s.toCharArray();for (int i = 0; i < ch.length; i++) {System.out.print(ch[i]);}System.out.println();// 数组转字符串String s2 = new String(ch);System.out.println(s2);}
}

4.格式化
public class Test {public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9,14);System.out.println(s);}
}

5.字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
| 方法 | 功能 |
|---|---|
| String replaceAll(String regex, String replacement) | 替换所有的指定内容 |
| String replaceFirst(String regex, String replacement) | 替换收个内容 |
public class Test {public static void main(String[] args) {String s = "hellohello";System.out.println(s.replaceAll("l", "z"));System.out.println(s.replaceFirst("l", "z"));}
}

注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串
6.字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串
方法如下:
| 方法 | 功能 |
|---|---|
| String[] split(String regex) | 将字符串全部拆分 |
| String[] split(String regex, int limit) | 将字符串以指定的格式,拆分为limit组 |
public class Test {public static void main(String[] args) {String str = "hello word is you";String[] s = str.split(" ");//按照空格拆分for (int i = 0; i < s.length; i++) {System.out.println(s[i]);}}
}

public class Test {public static void main(String[] args) {String str = "hello word is you";String[] s = str.split(" ",2);//按照空格拆分成两份for (int i = 0; i < s.length; i++) {System.out.println(s[i]);}}
}

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义
注意事项:
1.字符"|“,”*“,”+“都得加上转义字符,前面加上 “\”
2.而如果是 “” ,那么就得写成 “\\”
3.如果一个字符串中有多个分隔符,可以用”|"作为连字符
多次拆分:
public class Test {public static void main(String[] args) {String str = "name=zhagnsan&age=10";String[] s = str.split("&");for (String ss:s) {String[] ret = ss.split("=");for (String sss:ret) {System.out.println(sss);}}}
}

7.字符串截取
从一个完整的字符串之中截取出部分内容
方法如下:
| 方法 | 功能 |
|---|---|
| String substring(int beginIndex) | 从指定索引截取到结尾 |
| String substring(int beginIndex, int endIndex) | 截取部分内容 |
public class Test {public static void main(String[] args) {String str = "helloword";System.out.println(str.substring(5));System.out.println(str.substring(0, 5));}
}

注意事项:
1.索引从0开始
2.注意前闭后开区间的写法,substring(0,5)表示包含0下标的字符,不包含5下标的字符
8.其他操作方法
| 方法 | 功能 |
|---|---|
| String trim() | 去掉字符串中的左右空格,保留中间空格 |
| String toUpperCase() | 字符串转大写 |
| String toLowerCase() | 字符串转小写 |
public class Test {public static void main(String[] args) {String str = " hello word ";System.out.println(str.trim());}
}

trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等)
9.字符串的不可变性
String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1.String类在设计时就是不可改变的,String类实现描述中已经说明了

String类中的字符实际保存在内部维护的value字符数组中,从上图中可以看出:
1.String类被final修饰,表示该类不能被继承
2.value被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改
2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的
10.字符串修改
注意: 尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下
三、StringBuilder和StringBuffer
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的
| 方法 | 功能 |
|---|---|
| StringBuff append(String str) | 在尾部追加,相当于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的方式返回 |
String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder
注意: String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
1.String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2.StringBuilder变为String: 调用toString()方法
String、StringBuffer、StringBuilder的区别
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2.StringBuffer与StringBuilder大部分功能是相似的
3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
相关文章:
【Java】认识String类
文章目录 一、String类的重要性二、String类中的常用方法1.字符串构造2.String对象的比较3.字符串查找4.转换5.字符串替换6.字符串拆分7.字符串截取8.其他操作方法9.字符串的不可变性10.字符串修改 三、StringBuilder和StringBuffer 一、String类的重要性 在C语言中已经涉及到…...
算法——滑动窗口(Sliding Window)
一、背景知识 滑动窗口算法(Sliding Window): 在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。题型一:固定长度题型二:不固定长度 二、例…...
Android异步之旅:探索AsyncTask
前言: 在Android应用程序开发中,异步操作是非常常见的需求。比如,我们可能需要在后台线程中执行网络请求、数据库操作或者其他耗时的任务,而不阻塞UI线程。为了实现这些异步操作,Android提供了多种方式,其…...
kibana 7安装
手动安装 下载 wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.15-linux-x86_64.tar.gz 解压 mv kibana-7.17.15-linux-x86_64.tar.gz /usr/local tar -zxvf kibana-7.17.15-linux-x86_64.tar.gz chown -R es:es kibana-7.17.15-linux-x86_64修改配置 s…...
为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
在生产环境中我们会遇到一些问题,此文主要记录并复盘一下当时项目中的实际问题及解决过程。 背景简述 最初系统上线后都比较正常风平浪静的。在系统运行了一段时间后,业务量上升后,生产上发现java应用内存占用过高,服务器总共64…...
大模型变身双面人:虚假新闻制造机VS假新闻鉴别大师!
大家是怎样看待大型语言模型生成信息的可靠性呢? 尽管大语言模型生成的内容“像模像样”,但这些模型偶尔的失误揭示了一个关键问题:它们生成的内容并不总是真实可靠的。 那么,这种“不保真”特性能否被用来制造虚假信息呢&#x…...
WordPress网站如何修复数千个帖子的SEO错误
在本教程中,我们将向您展示如何解决您经常犯的SEO错误。 最好的是您不必花费太多时间,因为您不需要打开并编辑每个帖子。 相反,我们将向您展示如何使用 WordPress 内的电子表格来修复 WordPress 帖子的 SEO。 在这里,我们为您提…...
Mac如何搭建Vue项目
目录 一、安装node 二、安装NPM 1、本地安装和全局安装 2、通过Node.js官方安装程序安装 3、通过Homebrew安装 三、NPM常用命令 1、查看模块的版本号 2、安装指定版本 3、卸载模块 4、更新模块 5、查看模块信息 6、查看模块地址 7、更新命令 8、卸载NPM 四、安装…...
深入 Django 的 URL 分发器
概要 在 Django 的 MVC 架构中,URL 分发器扮演着至关重要的角色,它负责将用户的请求路由到相应的视图函数或类。这一机制不仅保证了 Django 应用的高度可扩展性,还为开发者提供了灵活的 URL 设计能力。本文将详细介绍 Django 中的 URL 分发器…...
基于单片机设计的气压与海拔高度检测计(采用MPL3115A2芯片实现)
一、前言 随着科技的不断发展,在许多领域中,对气压与海拔高度的测量变得越来越重要。例如,对于航空和航天工业、气象预报、气候研究等领域,都需要高精度、可靠的气压与海拔高度检测装置。针对这一需求,基于单片机设计…...
云原生入门系列(背景和驱动力)
做任何一件事,或者学习、应用一个领域的技术,莫过于先要想好阶段的目标和理解、学习它的意义是什么?解决了什么问题? 这部分,就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…...
Django中间件
目录 一.介绍 1.什么是Django中间件 2.作用: 3.示例 二.Django请求生命周期流程图 三.Django中间件是Django的门户 四.中间件方法 1.必须掌握的中间件方法 (1)process_request: 示例: 2.需要了解的中间件方法 &#x…...
redis运维(十九)redis 的扩展应用 lua(一)
一 redis 的扩展应用 lua redis如何保证原子操作 说明:引入lua脚本,核心解决原子性问题 ① redis为什么引入lua? lua脚本本身体积小,启动速度快 ② redis引入lua的优势 小结: 类似自定义redis命令 ③ redis中如何使用lua ④ EVAL 说明&#…...
SpringBoot——MVC原理
优质博文:IT-BLOG-CN 一、SpringMVC自动配置 SpringMVC auto-configuration:SpringBoot自动配置好了SpringMVC。以下是SpringBoot对SpringMVC的默认配置:[WebMvcAutoConfiguration] 【1】包括ContentNegotiatingViewResolver和BeanNameView…...
[Linux] shell条件语句和if语句
一、条件语句 1.1 测试 test 测试文件的表达式是否成立 格式:test 条件表达式 [ 条件表达式 ] 选项作用-d测试是否为目录-e测试目录或文件是否存在-a测试目录或文件是否存在-f测试是否为文件-r测试当前用户是否有权限读取-w测试当前用户是否有权限写入-x测试当前…...
【陈老板赠书活动 - 18期】-如何成为架构师这几本书推荐给你
陈老老老板🦸 👨💻本文专栏:赠书活动专栏(为大家争取的福利,免费送书) 👨💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。 👨&am…...
chrome 插件 Mobile simulator
谷歌浏览器插件Mobile simulator v3.8.2.0-2023-4-27(做屏幕适应的前端工具)-(Chrome插件)谷歌浏览器插件网 百度网盘:https://pan.baidu.com/s/1xVyny8CtlMjSchhTIlfRAA 提取码:cj5c...
JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较
在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈详解 MERN 技术栈包含四大具体组件: MongoDB&am…...
【Vue】核心特性(响应式)
响应式: 数据变化,视图自动更新 接下来使用一个例子来体现一下什么是响应式 案例一: 访问数据,视图自动更新 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…...
ESP32 http 请求
目录 参考教程1.使用的http连接2.使用Vscode-IDF创建http_request例程3.修改http_request_example_main.c函数4.已经获取到响应的数据 参考教程 ESP-IDF HTTP获取网络时间 1.使用的http连接 http://api.m.taobao.com/rest/api3.do?apimtop.common.getTimestamp请求可以得到…...
VMware Workstation Pro 17许可证密钥:终极免费激活方案与完整使用指南
VMware Workstation Pro 17许可证密钥:终极免费激活方案与完整使用指南 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major vers…...
AI搜索引擎Morphic:基于生成式UI与双模式搜索的智能问答系统
1. 项目概述:一个能“思考”的搜索引擎如果你厌倦了在传统搜索引擎里翻好几页才能找到答案,或者觉得现在的AI聊天机器人虽然能说会道,但回答总像是从一堆文档里东拼西凑出来的,那这个项目可能就是你一直在找的东西。Morphic&#…...
别再死记硬背ZeRO了!用ChatGLM2-6B实战,带你搞懂Deepspeed显存优化的真正逻辑
别再死记硬背ZeRO了!用ChatGLM2-6B实战,带你搞懂Deepspeed显存优化的真正逻辑 如果你曾经被ZeRO技术的各种Stage和Offload配置搞得晕头转向,这篇文章就是为你准备的。我们将通过一个真实的ChatGLM2-6B微调案例,让你亲眼看到不同Ze…...
从‘双曲线’到‘高阶项’:聊聊动校正(NMO)的演进与长排列勘探下的四阶校正实战
从双曲线假设到高阶校正:动校正技术演进与长排列勘探实战解析 当我们在戈壁滩上布设超过8公里的超长排列接收地震信号时,传统双曲线动校正模型突然变得力不从心——远道数据始终无法完美拉平,就像试图用直尺测量弯曲的河岸。这种困境在深海勘…...
手把手教你理解CCC数字钥匙配对:从NFC交互到KTS签名的完整流程拆解
深入解析CCC数字钥匙配对:从NFC交互到KTS签名的全流程技术实现 在智能汽车与移动设备深度融合的今天,CCC(Car Connectivity Consortium)数字钥匙已成为车联网安全认证的核心技术。本文将系统拆解车主配对流程中的关键技术环节&…...
3天精通缠论分析:零代码实现通达信自动技术分析的完整指南
3天精通缠论分析:零代码实现通达信自动技术分析的完整指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论分析头疼吗?ChanlunX缠论插件为你提供了一站式解决方案…...
视频大模型幻觉问题解析与Dr.V框架解决方案
1. 视频大模型幻觉问题的现状与挑战在当今多模态大语言模型(MLLMs)快速发展的背景下,视频理解能力已成为衡量模型智能水平的重要指标。然而,一个长期困扰研究者和实践者的核心问题是:为什么这些看似强大的模型会在视频…...
VMware虚拟机中部署AI模型:Ubuntu系统安装与Qwen3-4B-Thinking配置指南
VMware虚拟机中部署AI模型:Ubuntu系统安装与Qwen3-4B-Thinking配置指南 1. 准备工作与环境搭建 在开始之前,我们需要准备好必要的软件和硬件资源。首先确保你的主机满足以下要求: 硬件配置:建议至少16GB内存(运行Qw…...
5分钟掌握IwrQk:开源免费Iwara客户端三步上手指南
5分钟掌握IwrQk:开源免费Iwara客户端三步上手指南 【免费下载链接】iwrqk Unofficial Iwara Flutter Client 项目地址: https://gitcode.com/gh_mirrors/iw/iwrqk 你是否曾经为在手机上流畅浏览Iwara社区内容而烦恼?是否希望有一个更便捷的方式管…...
本地商家怎么让周边客户搜到你?聊聊 GEO 搜索优化的几个落地思路
作者按:本文基于对烟台本地商家推广痛点的观察,分享 GEO(地理定位搜索)优化的一些通用方法。文中案例来自公开可查的行业实践,不构成服务推荐。引言在烟台,我接触过不少开餐馆、做空气能、卖樱桃的老板。大…...
