- CharSequence
- CharSequence
- Java String 类
- 格式化字符串
- String方法
- equals()方法
- compareTo比较
- 方法列表
- StringBuffer 和 StringBuilder
- 选择使用
- 主要方法
- 主要方法
- 常用方法
String、StringBuffer、StringBulider类都实现了该接口
- StringBulider、StringBuffer类构造方法支持传入CharSequnce对象
- 即CharSequence 实例对象描述的是 字符串
-
Java中字符串属于对象,Java提供了String类来创建和操作字符串
-
String类不可改变,一旦创建值就无法改变
-
String s = "Google"; System.out.println("s = " + s); s = "Runoob"; System.out.println("s = " + s); // 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");
}
}
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()方法判断输入内容是否是 张三 //“张三” 放在前面 可以避免用户输入空字符串 引起空指向异常
-
- 相等返回值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类在Java5被提出
StringBulider是线程不安全类,StringBuffer类是线程安全类
- StringBulider和StringBuffer类基本一样
- 常规使用优先选择String
- 如果需要大量修改字符串的操作使用StringBulider类效率更高
- StringBuilder相较于StringBuffer有速度优势
- StringBuffer类的线程安全只能起到有限作用,可以在出现异常时继续执行而已
- String类中+操作使用StringBuffer类的.append()方法实现,返回新的String对象
- 无循环时单行用+拼接字符串没有性能损失,编译器会隐式的替换成 StringBuilder
- 有循环时编译器可能没有足够智能的替换,仍会有不必要的性能损耗
- 因此循环拼接字符串的时候,还是用 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() | 返回此序列中数据的字符串表示形式 |



