【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请求可以得到…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
