CharSequence
文章目录
CharSequence
String
、StringBuffer
、StringBulider
类都实现了该接口
StringBulider
、StringBuffer
类构造方法支持传入CharSequnce
对象- 即
CharSequence
实例对象描述的是字符串
Java String 类
-
Java中字符串属于对象,Java提供了String类来创建和操作字符串
-
String类不可改变,一旦创建值就无法改变
-
String s = "Google"; System.out.println("s = " + s); s = "Runoob"; System.out.println("s = " + s); /** 运行结果: Google Runoob */ // s 只是 String 对象的引用,并不是对象本身 // 执行 s = "Runoob" 时创建新的对象 "Runoob",而原来的 "Google" 还存在于内存中
-
-
String类底层定义了数组来存放对象内容
- JDK 8 及以前使用字符数组 final char[]
- JDK 9 以后使用字节数组 final byte []
- 使用
final
封装的数组
-
String
类型字符串可以向所有类型转换String
是使用字符串时首选类- 但
String
类实例对象**(字符串)不可改变** - 表面的改变是生成了新的实例对象并指向原来的引用
-
String 中的所有的方法,都是对于 char 数组的改变
- 方法内部都是返回一个新的 String 实例
-
String创建的字符串存储在公共池中,而new创建的对象在堆上
String s1 = "Runoob"; //直接创建
String s2 = "Runoob"; //直接创建
String s3 = s1; //相同引用
String s4 = new String("Runoob"); //String对象创建
String s5 = new String("Runoob"); //String对象创建
-
字符串长度:
length()
方法,返回字符串对象包含的字符数 -
连接字符串:
.concat()
、+
+
操作使用StringBuffer类的.append()
方法实现,返回新的String对象
string1.concat(string2);
//返回 string2 连接 string1 的新字符串,也可以对字符串常量使用 concat() 方法,如:
"我的名字是 ".concat("Runoob"); // 我的名字是Runnoob
//更常用'+'操作符来连接字符串,如:
"Hello," + " runoob" + "!" // Hello, runnoob!
public class StringDemo {
public static void main(String args[]) {
String string1 = "菜鸟教程网址:";
System.out.println("1、" + string1 + "www.runoob.com");
}
}
/*
输出结果:
1、菜鸟教程网址:www.runoob.com
*/
String a = "a";
String b = "b";
String c = a + b;
相当于:
String c = new StringBuffer().append(a).append(b).toString();//指向地址是堆中new的StringBuilder对象
格式化字符串
输出格式化数字可用 printf() 和 format() 方法
- 静态方法
format()
返回一个String 对象而不是PrintStream
对象 - 创建可复用的格式化字符串
String s = String.format("浮点型变量的值为%f, " + "整型变量的值为*d" + "字符串类型的变量的值为%s" ,floatVar ,intVar ,stringVar);
// %m.nf: m 位数,小数点后n位 float 类型输出
// %d:以整型输出;
// %s:以字符串类型输出
// %c: 以字符类型输出
String方法
equals()方法
-
String字符串使用
==
比较的是字符串在堆中的地址,而非内容 -
equals()
方法可以直接比较字符串内容-
将固定的字符串放在前面,调用
equals()
方法 -
避免另一个字符串为空引发空指针异常
String str = new Scanner(System.out).nextLine(); //从键盘读取输入 System.out.println("张三".equals(str)); //使用equals()方法判断输入内容是否是 张三 //“张三” 放在前面 可以避免用户输入空字符串 引起空指向异常
-
compareTo比较
- 相等返回值0
- 此字符串小于参数,则返回一个小于 0 的值;
- 此字符串大于参数,则返回一个大于 0 的值。
- 如果第一个字符和参数的第一个字符不等,结束比较,返回第一个字符的ASCII码差值
- 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,
- 以此类推,直至不等为止,返回该字符的ASCII码差值
- 如果两个字符串不一样长,但对应字符又完全一样,则返回两个字符串的长度差值
方法列表
方法(前缀为返回值类型) | 描述 |
---|---|
char charAt(int index) | 返回指定索引处的char值 |
int compareTo(Object o) | 这个字符串和另一个对象比较 |
int compareTo(String anotherString) | 按字典顺序比较两个字符串 |
int compareToIgnoreCase(String str) | 按字典顺序比较,不考虑大小写 |
String concat(String str) | 指定字符串连接到此字符串结尾 |
boolean contentEquals(StringBuffer s) | 当且仅当字符串与指定的StringBuffer有相同顺序的字符时返回真 |
staic String copyValueOf(char[] data) | 返回指定数组中表示该字符序列的String |
staic String copyValueOf(char[] data, int offset, int count) | 返回指定数组中表示该字符序列的String;data-字符数组、offset-子数组初始偏移量、count-子数组长度 |
boolean endswith(String str) | 测试此字符串是否以指定的后缀结束 |
boolean equals(Object anObject) | 将此字符串与指定的对象比较 |
boolean equalsIgnoreCase(String anotherString) | 将此String与另一个String比较,不考虑大小写 |
byte[] getBytes[] | 使用平台默认的字符集将此String编码为byte序列,并将结果存储到一个新的byte数组 |
byte[] getBytes(String charsetName) | 使用指定字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中 |
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将字符从此字符串复制到目标字符数组;srcBegin – 字符串中要复制的第一个字符的索引、srcEnd – 字符串中要复制的最后一个字符之后的索引、dst – 目标数组、dstBegin – 目标数组中的起始偏移量 |
int hashCode() | 返回此字符串的哈希码 |
int indexOf(int i) | 返回指定字符在此子字符串第一次出现处的索引 |
int indexOf(int i, int fromIndex) | 返回指定字符在此字符串第一次出现处的索引,从指定的索引开始搜索 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现的索引 |
int indexOf(String str, int fromIndex) | 返回指定字符串在此字符串中第一次出现的索引,从指定的索引开始搜索 |
String intren() | 返回字符串对象规范化表示形式;返回值是一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。 |
int lastIndexOf(int i) | 返回指定字符在此字符串中最后一次出现的索引 |
int lastIndexOf(int i, int fromIndex) | 返回指定字符在此字符串中最后一次出现的索引,从指定的索引开始反向搜索 |
int lastIndexOf(String str) | 返回指定字符在此子字符串最后一次出现处的索引 |
int lastIndexOf(String str, int fromIndex) | 返回指定子字符串在此字符串中最后一次出现的索引,从指定的索引开始反向搜索 |
int length() | 返回此字符串的长度 |
boolean matches((.)String regex(.)) | 告知此字符串是否匹配给定的正则表达式。 |
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) | 测试两个字符串区域是否相等;可以忽略大小写、toffset– 此字符串中子区域的起始偏移量、other – 字符串参数、ooffset – 字符串参数中子区域的起始偏移量、len – 要比较的字符数 |
boolean regionMatches(int toffset, String other, int ooffset, int len) | 测试两个字符串区域是否相等 |
String replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的 |
String replaceAll((.)String regex(.), String replacement) | 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串 |
String replaceFirst((.)String regex(.), String replacement | 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串 |
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串。(. 、 $ 、 ` |
String[] split(String regex, int limit) | 根据匹配给定的正则表达式来拆分此字符串;regex – 正则表达式分隔符、limit – 分割的份数 |
boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
boolean startsWith(String prefix, int toffset) | 测试此字符串从指定索引开始的子字符串是否以指定前缀开始 |
CharSequence subSequence(int beginIndex, int endIndex) | 返回一个新的字符序列,它是此序列的一个子序列;beginIndex – 起始索引(包括)、endIndex – 结束索引(不包括) |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它是此字符串的一个子字符串 |
char[] toCharArray() | 将此字符串转换为一个新的字符数组 |
String toLowerCase() | 使用默认语言环境的规则将此 String 中的所有字符都转换为小写 |
String toLowerCase(Locale locale) | 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写 |
String toString() | 返回此对象本身(它已经是一个字符串!) |
String toUpperCase() | 使用默认语言环境的规则将此 String 中的所有字符都转换为大写 |
String toUpperCase(Locale locale) | 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写 |
String trim() | 返回字符串的副本,忽略(删除)前导空白和尾部空白 |
static String valueOf(primitive data type x) | 返回给定data type类型x参数的字符串表示形式 |
contains(CharSequence chars) | 判断是否包含指定的字符系列 |
isEmpty() | 判断字符串是否为空 |
StringBuffer 和 StringBuilder
选择使用
对字符串修改需要使用StringBuffer
或StringBuilder
类
- 使用时会对
StringBuffer
对象本身操作,而非生成新的对象StringBuilder
类在Java5
被提出
StringBulider
是线程不安全类,StringBuffer
类是线程安全类
StringBulider
和StringBuffer
类基本一样- 常规使用优先选择
String
- 如果需要大量修改字符串的操作使用StringBulider类效率更高
StringBuilder
相较于StringBuffer
有速度优势
- 常规使用优先选择
- StringBuffer类的线程安全只能起到有限作用,可以在出现异常时继续执行而已
- String类中
+
操作使用StringBuffer类的.append()
方法实现,返回新的String对象- 无循环时单行用
+
拼接字符串没有性能损失,编译器会隐式的替换成 StringBuilder- 有循环时编译器可能没有足够智能的替换,仍会有不必要的性能损耗
- 因此循环拼接字符串的时候,还是用
StringBuilder
- 无循环时单行用
public class RunoobTest{
public static void main(String args[]){
StringBuilder sb = new StringBuilder(10); // 开辟 10 个空间
sb.append("Runoob.."); // 添加元素
System.out.println(sb);
sb.append("!"); // 追加元素
System.out.println(sb);
sb.insert(8, "Java"); // 插入元素从索引为 8 的位置开始
System.out.println(sb);
sb.delete(5,8); // 删除索引 [5 ~ 7) 的元素
System.out.println(sb);
}
}
运行结果:
Runoob..
Runoob..!
Runoob..Java!
RunooJava!
- 在要求线程安全的情况下必须使用StringBuffer类
StringBuffer sBuff = new StringBuffer("菜鸟教程官网:");
sBUff.append("www");
sBuff.append(".runoob");
sBuff.append(".com");
System.out.println(sBuff);
//运行结果:菜鸟教程官网:www.runoob.com
主要方法
StringBuffer 和 StringBuilder 方法基本一样
主要方法
方法 | 描述 |
---|---|
pubilc StringBuffer append(String s) | 将指定的字符串追加到此字符序列 |
public StringBuffer reverse() | 将此字符序列用其反转形式取代 |
public delete(int start, int end) | 移除此序列的子字符串中的字符 |
public insert(int offset, int i) | 将int参数的字符串表示形式插入此序列中 |
insert(int offset, String str) | 将str参数的字符串插入此序列中 |
replace(int start, int end, String s) | 使用给定String中的字符串替换此序列的子字符串中的字符 |
常用方法
方法 | 描述 |
---|---|
int capacity() | 返回当前容量 |
char charAt(int index) | 返回此序列中指定索引处的char值 |
void ensureCapacity(int minimumCapacity) | 确保容量至少等于指定的最小值 |
void getChars(int strBegin, int srcEnd, char[] dst, int dstBegin) | 将字符从此序列复制到目标字符数组dst(会覆盖数组dst原位置的字符) |
int indexOf(String str) | 返回第一次出现的指定字符串在该字符串中的索引(若指定范围内不存在输出-1) |
int indexOf(String str, int fromIndex) | 从指定的索引处开始往后,返回第一次出现指定字符串在该字符串中的索引 |
int lastIndex(String str) | 返回最后一次出现指定字符串在该字符串中的索引(输出的是在原字符串中的索引,而非与指定索引的相对位置) |
int lastIndex(String str, int fromIndex) | 从指定的索引处开始往前,返回最后一次出现指定字符串在该字符串中的索引 |
int length() | 返回长度(字符数) |
void setCharAt(int index, char c) | 将给定索引处的字符设为ch |
void setLength(int newLength) | 设置字符序列的长度 |
CharSequence subSequence( int start,int end) | 返回一个新的字符序列,该字符序列是此序列的子序列 |
String subString(int start) | 返回一个新的String,它包含此序列当前所包含的字符子序列 |
String subString(int start, int end) | 返回一个新的String,它包含此序列当前所包含的字符子序列 |
String toString() | 返回此序列中数据的字符串表示形式 |