Java的String类常用方法 |StringBuilder和StringBuffer

文章目录

  • String类常用方法
    • 字符串查找
    • 转化
    • 字符串替换
    • 字符串拆分
    • 字符串截取
    • 其他操作方法
  • 字符串的不可变性
  • StringBuilder和StringBuffer
    • StringBuilder的介绍
    • 面试题

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

注意:上述方法都是实例方法。

转化

  1. 数值和字符串转化
数字转字符串String.valueOf
字符串转intInteger.parseInt
字符串转doubleDouble.parseDouble
class Student {String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}
}
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);String s4 = String.valueOf(new Student("Hanmeimei", 18));System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4);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);}
}

在这里插入图片描述

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

在这里插入图片描述

  1. 字符串转数组
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);
}
  1. 格式化
public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9,14);System.out.println(s);
}

在这里插入图片描述

字符串替换

方法功能
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容
public static void main(String[] args) {String str = "helloworld" ;System.out.println(str.replaceAll("l", "_"));System.out.println(str.replaceFirst("l", "_"));}

在这里插入图片描述

注意事项: 由于字符串是不可变对象, 不修改当前字符串, 而是产生一个新的字符串

字符串拆分

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

在这里插入图片描述
split根据给定的正则表达式的匹配来拆分此字符串

有些特殊字符( [ { / ^ - $ | } ]) ? * + . 作为分割符可能无法正确切分, 需要加上转义.

在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如 Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 的正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,\\ 代表其他语言中的 \,这也就是为什么表示一位数字的正则表达式是\\d,而表示一个普通的反斜杠是 \\。

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 = "192\\168\\1\\1" ;System.out.println(str);String[] result = str.split("\\\\") ;for(String s: result) {System.out.println(s);}}

在这里插入图片描述

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

public static void main(String[] args) {String str = "name@zhangsan&age=18" ;String[] result = str.split("&|=|@") ;for (int i = 0; i < result.length; i++) {System.out.println(result[i]);}}

在这里插入图片描述

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

在这里插入图片描述

字符串截取

方法功能
String substring(int beginIndex)从指定索引截取到结尾
String substring(int beginIndex, int endIndex)截取部分内容
public static void main(String[] args) {String str = "helloworld" ;System.out.println(str.substring(5));System.out.println(str.substring(0, 5));}

在这里插入图片描述
注意事项:

  1. 索引从0开始
  2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

其他操作方法

方法功能
String trim()去掉字符串中的左右空格,保留中间空格
public static void main(String[] args) {String str = " hello world " ;System.out.println("["+str+"]");System.out.println("["+str.trim()+"]");}

在这里插入图片描述
trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等)

字符串的不可变性

String是一种不可变对象. 字符串不可被修改,是因为:

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

    以下来自JDK1.8中String类的部分实现:
    在这里插入图片描述
    String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:

  • String类被final修饰,表明该类不能被继承
  • value被final修饰,表明value只能引用原来对象,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
public static void main(String[] args) {final int array[] = {1,2,3,4,5};array[0] = 100;System.out.println(Arrays.toString(array));// array = new int[]{4,5,6}; // 编译报错:Error:(19, 9) java: 无法为最终变量array分配值
}
  1. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

字符串不可变,不是因为String类自身,或者其内部value被final修饰而不能被修改。
是因为String类不能被继承,也没有提供方法拿到value,value还是被private修饰的,也不能引用其他对象,拿不到value,就没办法对value进行修改

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

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.

StringBuilder和StringBuffer

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

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

在这里插入图片描述

可以看出在对String类进行修改时,效率是非常慢的,因此:尽量避免对String的直接修改,如果要修改的话建议尽量使用StringBuffer或者StringBuilder。

StringBuilder的介绍

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

方法说明
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第一次出现的位置
nt 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类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
  • StringBuilder变为String: 调用toString()方法。

面试题

  1. String、StringBuffer、StringBuilder的区别
  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
  1. 以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】
String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象

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

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

相关文章

Python polars库:高性能数据操作的利器

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据处理和分析领域&#xff0c;Python一直以来都是一种热门的编程语言。近年来&#xff0c;随着数据量的增加和对性能的需求&#xff0c;一些新的数据处理库也逐渐崭露头角。其中&#xff0c;polars库作为一个…

C++ 11 初识2

一.新的类功能 默认成员函数 原来 C 类中&#xff0c;有 6 个默认成员函数&#xff1a; 构造函数 析构函数拷贝构造函数拷贝赋值重载 取地址重载const 取地址重载 C11 新增了两个&#xff1a;移动构造函数和移动赋值运算符重载。 针对移动构造函数和移动赋值运算符重载有一些需…

Python Paramiko库:SSH远程连接与文件传输实战指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在网络管理和系统运维中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种广泛用于远程登录和文件传输的协议。Python中的Paramiko库为开发者提供了灵活、强大的SSH客户端和服务器功能。本文将深入探讨…

LeetCode刷题--- 验证二叉搜索树

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 http://t.csdnimg.cn/ZxuNL个人专栏&#xff1a;力扣递归算法题 http://t.csdnimg.cn/ZxuNL 【C】 http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#x…

分享5款不起眼但非常实用的小工具

​ 时光荏苒&#xff0c;科技日新月异&#xff0c;一些看似不起眼的小工具却可能改变我们的工作方式。下面我们将介绍五款不可错过的小工具&#xff0c;它们能给你带来一些意想不到的效果&#xff0c;让你的工作更加高效便捷。 1.音乐播放——洛雪音乐助手 ​ 洛雪音乐助手是…

No module named ‘osgeo’解决办法

from osgeo import gdal 报错&#xff1a;No module named ‘osgeo’ pycharm安装osgeo、GDAL都失败 pip install osgeo失败 最后先下载对应版本的GDAL文件 再cmd命令行中用对应环境的python进行GDAL包安装 1.我将我的Anaconda某个环境文件夹D:\software\pinstall\Anaconda3…

Source Tree回滚 重置 贮藏操作

回滚提交 source tree的回滚提交: 在执行该操作时将会对history中提交的指定节点直接进行回滚,将该节点执行的提交操作撤销(如当前节点是提交文件,执行回滚提交时将会删除该文件,如果当前节点的前面的节点对该节点内容进行修改后,执行回滚提交时需要执行冲突解决),同时生成一次…

智能优化算法应用:基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MA…

【音视频 | H.264】H.264编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

使用FluentAvalonia组件库快速完成Avalonia前端开发

前言 工欲善其事必先利其器,前面我们花了几篇文章介绍了Avalonia框架以及如何在Avalonia框架下面使用PrismAvalonia完成MVV模式的开发。今天我们将介绍一款重磅级的Avalonia前端组件库,里面封装了我们开发中常用的组件,这样就不用我们自己再写组件了。专注业务功能开发,提…

1.4 Postman的安装

hello大家好&#xff0c;本小节我们来安装一下Postman&#xff0c;好为我们后续的测试工作做准备。 首先&#xff0c;打开Postman的官网Postman API Platform 然后根据同学们自己电脑的操作系统来下载对应的Postman安装包。我这里拿windows来举例。我们点击windows的图标 会跳…

常见的计算机图片格式

左rgb &#xff08;光源色彩&#xff09; 右cmyk &#xff08;印刷色彩&#xff09; 缺点&#xff0c;不能保存&#xff0c;储存空间太大

螺旋矩阵算法(leetcode第54题)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff…

工厂设备维护管理有什么比较好的解决方案?有什么好用的工单管理系统?

生产设备对于工厂来说是十分宝贵的资产。一方面&#xff0c;工厂依赖设备进行生产活动&#xff0c;一旦设备故障就会影响产量&#xff1b;另一方面&#xff0c;工厂中的生产设备一般造价都比较高昂&#xff0c;如果出现故障就会增加工厂的生产成本&#xff1b;再一方面&#xf…

SQL Server 服务启动报错:错误1069:由于登录失败而无法启动服务

现象 服务器异常关机以后&#xff0c;SQL Server服务无法启动了。 启动服务时报错&#xff1a; 错误1069:由于登录失败而无法启动服务 解决办法 我的电脑–控制面板–管理工具–服务–右键MSSQLSERVER–属性–登录–登陆身份–选择"本地系统帐户" 设置完成后&am…

JavaSE基础50题:23. 数组拷贝(数组练习题)

文章目录 概述方法一&#xff1a;运用for循环进行拷贝方法二&#xff1a;Java内置方法进行拷贝方法三&#xff1a;指定区间进行拷贝方法四&#xff1a;数组克隆clone() 概述 数组拷贝。 注意&#xff1a; public static void main(String[] args) {int[] array1 {1,2,3,4};Sy…

Trace 在多线程异步体系下传递

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

JavaEE进阶学习: SpringBoot 日志文件

1.日志有什么用 日志的主要作用是记录系统的运行状态、事件和错误信息等。具体来说&#xff0c;日志可以用于以下几个方面&#xff1a; 故障排除&#xff1a;当系统出现故障或错误时&#xff0c;日志可以帮助开发人员定位问题的具体原因和位置&#xff0c;从而更快地修复系统。…

Intellij IDEA 运行maven报错误“CreateProcess error=2, 系统找不到指定的文件“的完美解决方案

一、问题背景 博主正常使用着Intellij IDEA&#xff0c;不知道为什么突然Intellij IDEA报错&#xff0c;错误提示如下&#xff1a; Error:Cannot run program "C:\Program Files\Java\jdk1.8.0_351" 观察Intellij IDEA报错的原因&#xff0c;我们可以知道&#xff1…

【LeetCode刷题-栈】-- 150.逆波兰表达式求值

150.逆波兰表达式求值 方法&#xff1a;使用栈 class Solution {public int evalRPN(String[] tokens) {Stack<Integer> numStack new Stack<>();for(int i 0; i < tokens.length;i){String token tokens[i];if(isNumber(token)){numStack.push(Integer.par…