12.1.1 字符串对象的创建
-
方式1:最简单方式
String str="你好";
-
方式2:构造函数方式
注意事项:String类对象是不可改变的,所以一旦创建了String对象它的值是无法改变的!
解释:修改后就是另一个对象,地址改变了
12.1.2 String类常用API
SN(序号) | 方法描述 |
---|---|
1 | char charAt(int index) 返回指定索引处的 char 值 |
2 | int compareTo(Object o) 把这个字符串和另一个对象比较 |
3 | int compareTo(String anotherString) 按字典顺序比较两个字符串 |
4 | int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写 |
5 | String concat(String str) 将指定字符串连接到此字符串的结尾 |
6 | boolean contentEquals(StringBuffer sb) 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真 |
7 | [static String copyValueOf(char] data) 返回指定数组中表示该字符序列的 String |
8 | [static String copyValueOf(char] data, int offset, int count) 返回指定数组中表示该字符序列的 String |
9 | boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束 |
10 | boolean equals(Object anObject) 将此字符串与指定的对象比较(类中重写了equals()方法,比较的时字符串的内容) |
11 | boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写 |
12 | [byte] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中 |
13 | [byte] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中 |
14 | [void getChars(int srcBegin, int srcEnd, char] dst, int dstBegin) 将字符从此字符串复制到目标字符数组 |
15 | int hashCode() 返回此字符串的哈希码 |
16 | int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引 |
17 | int indexOf(int ch, int fromIndex) 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索 |
18 | int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引 |
19 | int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 |
20 | String intern() 返回字符串对象的规范化表示形式 |
21 | int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引 |
22 | int lastIndexOf(int ch, int fromIndex) 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索 |
23 | int lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引 |
24 | int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 |
25 | int length() 返回此字符串的长度 |
26 | boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式 |
27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等 |
28 | boolean regionMatches(int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等 |
29 | String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的 |
30 | String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串 |
31 | String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串 |
32 | [String] split(String regex) 根据给定正则表达式的匹配拆分此字符串 |
33 | [String] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串 |
34 | boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始 |
35 | boolean startsWith(String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始 |
36 | CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列 |
37 | String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串 |
38 | String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串(含头不含尾) |
39 | [char] toCharArray() 将此字符串转换为一个新的字符数组 |
40 | String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写 |
41 | String toLowerCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写 |
42 | String toString() 返回此对象本身(它已经是一个字符串) |
43 | String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写 |
44 | String toUpperCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写 |
45 | String trim() 返回字符串的副本,忽略前导空白和尾部空白 |
46 | static String valueOf(primitive data type x) 返回给定data type类型x参数的字符串表示形式 |
12.1.3 字符串类型和基本类型的转换
-
int类型转换成String类型
String str=Integer.toString(int param)
-
String转换成int
int num=Integer.parseInt(String param)
Integer num=Integer.valueOf(String param)
12.2 字符串比较
String s2="Monday";
System.out.println("s1==s2:"+(s1==s2));
System.out.println("s1.equals(s2):"+(s1.equals(s2)));
System.out.println("s2 address:"+System.identityHashCode(s2));
/*
* 字符串缓冲池
* 1.程序在运行的时候会创建一个字符串缓冲池
* 2.s1被放入缓冲池,放入前会查询缓冲池:是否有相同内容的字符串
* 3.s2预备放入缓冲池,放入前会查询缓冲池:查到有相同内容的字符串
* 它把s2指向了s1所指向的对象
*
*/
s1.equals(s2):true
s1 address:366712642
s2 address:366712642
(2)
String s2="Monday1";
System.out.println("s1==s2:"+(s1==s2));
System.out.println("s1.equals(s2):"+(s1.equals(s2)));
System.out.println("s2 address:"+System.identityHashCode(s2));
/*
* 字符串缓冲池
* 1.程序在运行的时候会创建一个字符串缓冲池
* 2.s1被放入缓冲池,放入前会查询缓冲池:是否有相同内容的字符串
* 3.s2预备放入缓冲池,放入前会查询缓冲池:没有查到查到有相同内容的字符串
* 所以s2也放入缓冲池
*
*/
String s2=new String("Monday").intern(); //构造方法声明不放入缓冲池
System.out.println("s1==s2:"+(s1==s2));
System.out.println("s1.equals(s2):"+s1.equals(s2));
System.out.println("s1 address:"+System.identityHashCode(s1));
System.out.println("s2 address:"+System.identityHashCode(s2));
s1.equals(s2):true
s1 address:42768293
s2 address:1717159510
System.out.println("before s1:"+s1);
System.out.println("before s1 address:"+System.identityHashCode(s1));
String s2=s1.replace("h", "f");
System.out.println("after s1:"+s1);
System.out.println("after s1 address:"+System.identityHashCode(s1));
System.out.println("after s2:"+s2);
System.out.println("after s2 address:"+System.identityHashCode(s2));
before s1 address:42768293
after s1:You are hired
after s1 address:42768293
after s2:You are fired
after s2 address:1717159510
12.3 字符串拼接
12.3.1 字符串拼接简介
-
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类;
-
与String 类不同:StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象;
12.3.2 StringBuffer类实现字符串拼接
(1)
StringBuffer sbf=new StringBuffer();
System.out.println("111sbf address:"+System.identityHashCode(sbf));
//字符串拼接
sbf.append("1");
System.out.println("222sbf address:"+System.identityHashCode(sbf));
sbf.append("2");
System.out.println("333sbf address:"+System.identityHashCode(sbf));
sbf.append("3");
System.out.println("444sbf address:"+System.identityHashCode(sbf));
sbf.append("4");
System.out.println("555sbf address:"+System.identityHashCode(sbf));
System.out.println(sbf.toString());
结果:
111sbf address:1768305536
222sbf address:1768305536
333sbf address:1768305536
444sbf address:1768305536
555sbf address:1768305536
1234
(2)
//创建一个StringBuffer对象
StringBuffer sbf=new StringBuffer("Hello from Java");
System.out.println("before sbf:"+sbf);
System.out.println("before sbf address:"+System.identityHashCode(sbf));
//执行replace
sbf.replace(6, 10, "to");
System.out.println("after sbf:"+sbf);
System.out.println("after sbf address:"+System.identityHashCode(sbf));
结果:
before sbf:Hello from Java
before sbf address:42768293
after sbf:Hello to Java
after sbf address:42768293
12.3.3 StringBuilder类实现字符串拼接
12.3.4 StringBuffer与StringBuilder区别
-
StringBuilder和StringBuffer之间的最大不同在于StringBuilder的方法是线程安全的(不能同步访问);
-
StringBuffer相较于StringBuilder有速度优势,所以多数情况下建议使用 StringBuffer类。但在应用程序要求线程安全的情况下,则必须使用StringBuilder类;