当前位置: 首页 > ops >正文

String类中的常用方法

目录

前言

一、String 类的常用方法

1. 常用的构造方法

2. 字符串的长度

3. 字符串的比较

4. 字符串的查找

5. 字符串转化

6. 字符串替换

7. 字符串拆分

8. 字符串截取

二、字符串不可变的原因

三、StringBuilder 和 StringBuffer

1.StringBuilder 和 StringBuffer 类的常用方法

2. String,StringBuilder 和 StringBuffer 的区别


前言

本文介绍Java 中 String 类的常用方法,为什么 String 对象不能被改变,以及 StringBuilder 和 StringBuffer 的区别。


一、String 类的常用方法

1. 常用的构造方法

可以传一个字符串,也可以传一个字符数组:

// 传一个字符串
String str1 = new String("abc");// 传一个字符数组
char[] array = {'a', 'b', 'c'};
String str2 = new String(array);

2. 字符串的长度

String 类在 java.lang 包里。

求字符串的长度:

length() 方法:str.length();

判断字符串是否为空:

isEmpty() 方法:str.isEmpty(),返回值是 boolean 类型;

注意:长度为 0 就是空;

3. 字符串的比较

equals() 方法:str1.equals(str2),返回值是 boolean 类型;

注意:equals 是 Object 类的方法,String能使用 equals 比较是因为重写了 equals 的方法.如果是自定义方法,一定要重写 equals 方法,否则只会比较引用变量里面存的哈希值。

compareTo() 方法:str1.compareTo(str2);

str1 大于 str2 返回正数,str1 小于 str2 返回负数,str1 等于 str2 返回 0;

String 类中 compareTo 的比较逻辑:先比较前 k 个字符,返回第一个不同字符的差值,如果前 k 个字符相同,返回字符串长度的差值;

源码如下:

public int compareTo(String anotherString) {int len1 = value.length;int len2 = anotherString.value.length;int lim = Math.min(len1, len2);char v1[] = value;char v2[] = anotherString.value;int k = 0;while (k < lim) {char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2;}k++;}return len1 - len2;}

compareToIgnoreCase() 方法:忽略大小写进行比较;

4. 字符串的查找

返回指定位置字符:

charAt() 方法:str.charAt(pos);

返回字符/子串下标:indexOf() 和 lastIndexOf() 

indexOf(ch) 返回 ch 字符第一次出现的位置;

indexOf(ch, 3) 从 3 位置开始找 ch 第一次出现的位置;

indexOf(substr) 返回 substr 子串第一次出现的位置;

indexOf(substr, 10) 从 10 位置开始找 substr 第一次出现的位置;

lastIndexOf(ch) 从后往前找,返回 ch 字符第一次出现的位置;

lastIndexOf(ch, 3) 从第 3 个位置开始从后往前找,返回 ch 字符第一次出现的位置;

lastIndexOf(substr) 从后往前找,返回 substr 子串第一次出现的位置;

lastIndexOf(substr, 10) 从第 10 个位置开始从后往前找,返回第一次出现 substr 子串的位置;

5. 字符串转化

String.valueOf():数字转字符串;

Integer.parseInt():字符串转整型;

Double.parseDouble():字符串转双精度;

toUpperCase(): 转成大写字符串;

toLowerCase(): 转成小写字符串;

toCharArray(): 字符串转数组(非常重要);

String.format():格式化字符串,String.format("%d-%d-%d", 2025, 5, 29);

6. 字符串替换

replace():

replace(String src, String dest): 字符串替换

replace(char src, char dest): 字符替换

replaceFirst(String src, String dest): 替换首个字符串

replaceAll(String src, String dest): 替换所有字符串

7. 字符串拆分

split(): 

String[] split(String regex): 按照 regex 分割字符串,返回字符串数组

String[] split(String regex, int limit): 按照 regex 分割字符串,分割成 limit 组,返回字符串数组;

正则表达式:

以 “|”,“*”,“+”分割要注意转义,前面加上“\\”;

如果是“\”,要写成“\\\\”;

如果使用多个分隔符分割,需要使用“|”连接分隔符;

注意:如果一次分割不能满足要求,可以考虑多次分割的策略;

8. 字符串截取

substring(int begin, int end): 从 begin 截取到 end - 1,非常重要;

trim(): 去除字符串左右两边的空格;

二、字符串不可变的原因

源码:

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0//......
}

原因:

字符串中存字符的字符数组是被 private 修饰的,我们调用 String 对象时是在类外面调用的,无法获取到这个字符数组,因此这个字符数组是没法被修改的。因此所有操作字符串的方法,实际上都是创建了一个新的对象,并没有修改原有的字符串;

类有 final 关键字修饰,不能被继承;

三、StringBuilder 和 StringBuffer

1.StringBuilder 和 StringBuffer 类的常用方法

append() : 在原有对象后面追加内容,可以是字符,字符串,整数,浮点数,字符串...;

setCharAt(int pos): 更改 pos 位置的字符;

insert(int pos, String s): 在 pos 位置插入字符串;

deleteCharAt(int pos): 删除 pos 下标的元素;

substring(int begin, int end): 返回从 begin 到 end - 1 位置的子串;

reverse(): 逆序 StringBuilder 对象;

toString(): 把 StringBuilder 对象转换为字符串;

2. String,StringBuilder 和 StringBuffer 的区别

String 的内容不可修改,StringBuilder 和 StringBuffer 的内容可以修改;

StringBuilder 和 StringBuffer 的大部分功能是相似的;

StringBuilder中的方法没有关键字 synchronized 修饰, StringBuffer中的方法有 synchronized 修饰,在多线程的环境下使用 StringBuffer 有助于确保线程安全,但是如果频繁调用 synchronized 修饰的方法,会降低程序执行的效率。

源码:

public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, CharSequence{// ......public StringBuilder(String str) {super(str.length() + 16);append(str);}/*** Constructs a string builder that contains the same characters* as the specified {@code CharSequence}. The initial capacity of* the string builder is {@code 16} plus the length of the* {@code CharSequence} argument.** @param      seq   the sequence to copy.*/public StringBuilder(CharSequence seq) {this(seq.length() + 16);append(seq);}@Overridepublic StringBuilder append(Object obj) {return append(String.valueOf(obj));}@Overridepublic StringBuilder append(String str) {super.append(str);return this;}// ......
}public final class StringBufferextends AbstractStringBuilderimplements java.io.Serializable, CharSequence{// ......public StringBuffer(String str) {super(str.length() + 16);append(str);}/*** Constructs a string buffer that contains the same characters* as the specified {@code CharSequence}. The initial capacity of* the string buffer is {@code 16} plus the length of the* {@code CharSequence} argument.* <p>* If the length of the specified {@code CharSequence} is* less than or equal to zero, then an empty buffer of capacity* {@code 16} is returned.** @param      seq   the sequence to copy.* @since 1.5*/public StringBuffer(CharSequence seq) {this(seq.length() + 16);append(seq);}@Overridepublic synchronized int length() {return count;}@Overridepublic synchronized int capacity() {return value.length;}@Overridepublic synchronized void ensureCapacity(int minimumCapacity) {super.ensureCapacity(minimumCapacity);}/*** @since      1.5*/@Overridepublic synchronized void trimToSize() {super.trimToSize();}/*** @throws IndexOutOfBoundsException {@inheritDoc}* @see        #length()*/@Overridepublic synchronized void setLength(int newLength) {toStringCache = null;super.setLength(newLength);}/*** @throws IndexOutOfBoundsException {@inheritDoc}* @see        #length()*/@Overridepublic synchronized char charAt(int index) {if ((index < 0) || (index >= count))throw new StringIndexOutOfBoundsException(index);return value[index];}// ......
}

http://www.xdnf.cn/news/9726.html

相关文章:

  • RapidOCR集成PP-OCRv5_det mobile模型记录
  • 【AI论文】ScienceBoard:评估现实科学工作流程中的多模态自主代理
  • 【FPGA开发】Ubuntu16.04环境下配置Vivado2018.3—附软件包
  • mysql执行sql语句报错事务锁住
  • Python爬虫实战:研究Aiohttp库相关技术
  • 【C语言】指针详解(接)
  • 游戏盾在非游戏行业的应用实践与价值分析
  • 立志成为一名优秀测试开发工程师(第九天)——使用fiddler工具、request库进行接口测试
  • GitCode镜像门法律分析:PL协议在中国的司法实践
  • Python 生成器:从基础到高级
  • 【Ubuntu】Ubuntu网络管理
  • Vscode 解决 #include <> 找不到的问题
  • x86_64-apple-ios-simulator 错误
  • 政策+技术双轮驱动:MiC建筑如何成为“好房子”建设的破局之道
  • UE5.5 pixelstreaming插件打包报错
  • UE5打包项目设置Project Settings(打包widows exe安装包)
  • 《深入解析UART协议及其硬件实现》-- 第三篇:UART ASIC实现优化与低功耗设计
  • 图像数据与显存
  • WebFuture:后台修改内容链接地址保存提示内容链接地址禁止输入外部url链接
  • Spring Boot自动装配原理
  • QT+opecv如何更改图片的拍摄路径
  • Oracle 慢sql排查
  • 前端面试准备2
  • Axure设计案例——科技感渐变柱状图
  • 24点游戏的最小数字组合问题
  • 常见关系型数据库对比指南
  • 制造业的未来图景:超自动化与劳动力转型的双重革命
  • 数据库中常见的锁机制详解
  • Java设计模式之迭代器模式详解
  • Sigma-Aldrich胰蛋白酶细胞解离方案速览