【Java SE】字符串操作

it2023-09-19  74

文章目录

操作字符串的类StringStringBuilderStringBuffer 反转字符串

操作字符串的类

Java 中,常用的对字符串操作的类有 String、StringBuffer、StringBuilder

String : final 修饰,String 类的方法都是返回 new String。即对 String 对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。

StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。

StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以 new StringBuilder 对象,调用 StringBuilder 对象的 append()、replace()、delete() 等方法修改字符串。

String

源码 final修饰的字节数组 方法,如substring等 是new了一个新的数组,所以会有一定开销

private final byte[] value; public String substring(int beginIndex, int endIndex) { int length = length(); checkBoundsBeginEnd(beginIndex, endIndex, length); int subLen = endIndex - beginIndex; if (beginIndex == 0 && endIndex == length) { return this; } return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen) : StringUTF16.newString(value, beginIndex, subLen); } public static String newString(byte[] val, int index, int len) { return new String(Arrays.copyOfRange(val, index, index + len), LATIN1); } String 类对象称为不可变字符串

String 类没有提供用于修改字符串的方法。由于不能修改 Java 字符串中的字符, 所以在 Java 文档中将 String 类对象称为不可变字符串

不可变字符串的优点:编译器可以让字符串共享。

想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量, 原始字符串与复制的字符串共享相同的字符。

常用API

equals:字符串是否相同 equalsIgnoreCase:忽略大小写后字符串是否相同 compareTo:根据字符串中每个字符的Unicode编码进行比较 compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较 indexOf:目标字符或字符串在源字符串中位置下标 lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标 valueOf:其他类型转字符串 charAt:获取指定下标位置的字符 codePointAt:指定下标的字符的Unicode编码 concat:追加字符串到当前字符串 isEmpty:字符串长度是否为0 contains:是否包含目标字符串 startsWith:是否以目标字符串开头 endsWith:是否以目标字符串结束 format:格式化字符串 getBytes:获取字符串的字节数组 getChars:获取字符串的指定长度字符数组 toCharArray:获取字符串的字符数组 join:以某字符串,连接某字符串数组 length:字符串字符数 matches:字符串是否匹配正则表达式 replace:字符串替换 replaceAll:带正则字符串替换 replaceFirst:替换第一个出现的目标字符串 split:以某正则表达式分割字符串 substring:截取字符串

public String substring(int beginIndex) public String substring(int beginIndex, int endIndex) beginIndex -- 起始索引(包括), 索引从 0 开始。 endIndex -- 结束索引(不包括)。

toLowerCase:字符串转小写 toUpperCase:字符串转大写 trim:去字符串首尾空格

附:

Integer.parseInt(String s); 返回用十进制参数表示的整数值。

StringBuilder

JDK5.0 中引入 StringBuilder 类。可以更有效的进行字符串的连接等操作。 常用API:

StringBuffer

是StringBuilder类的前身, 其效率稍有些低, 但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑 (通常都是这样,) , 则应该用 StringBuilder 替代它。 这两个类的 API 是相同的。

反转字符串

使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。(JDK1.8)不考虑字符串中的字符是否是 Unicode 编码,自己实现。递归(或者使用栈)双指针(不使用额外空间)

https://www.javanav.com/interview/a961e4d2347f4ffd87b527c334de4f0c.html

https://leetcode-cn.com/problems/reverse-string/submissions/

最新回复(0)