详解String类
1.String
类代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。
解析这句话:
String s=new String("abc");
请问这行代码创建了几个字符串对象?
答案:两个。原因:上述代码,相当于,先在字符串常量池创建出一个“abc”的字符串,在再堆里面开辟一个空间然后指向这个字符串常量池中的“abc”字符串。
测试:
public static void main(String[] args) {
String string=new String("abc");
System.out.println(string=="abc");
}
输出结果为:false;因为==比的是地址,所以string这个在栈空间里的变量,指向的是堆空间的地址,而不是常量池里的地址。
public static void main(String[] args) {
String aString="abc";
System.out.println(aString=="abc");
}
输出结果是true:同样比的是地址,由于aString这个栈中的变量指向的是字符串常量池里面的“abc”。所以地址相同。
2.字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
public static void main(String[] args) {
String string=new String("abc");
System.out.println(string.hashCode());
string=new String("cde");
System.out.println(string.hashCode());
}
输出结果:96354
98340
可知栈中的string变量指向推的地址被改变了,所以说字符串是常量,它们的值不能更改,一旦更改,jvm会再创建一个新的堆空间。
String string =new String(“abc”);就等价于: char data[] = {'a', 'b', 'c'}; String str = new String(data);
关于共享的解析
public static void main(String[] args) {
String string="abc";
String string2="abc";
System.out.println(string==string2);
}
输出结果为true,可知两个局部变量指向了同一个空间,也就是说上述代码只创建了一个字符串实例。
3.Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder
(或 StringBuffer
)类及其 append
方法实现的。字符串转换是通过 toString
方法实现的,该方法由 Object
类定。
4.String
表示一个 UTF-16 格式的字符串。
解析:String中的字符串都是由char拼接而成的,每一个char字符都是一个unicode码。
接下来就是String类的各种方法:
String
类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
1.public int length();
解析:返回字符串的长度
2.char charAt(int index);
解析:返回指定索引处的 char
值。索引范围为从 0
到 length() - 1
。序列的第一个 char
值位于索引 0
处,第二个位于索 引 1
处,依此类推。
如果 index
参数为负或小于此字符串的长度,则会抛出IndexOutOfBoundsException.
例如:
public static void main(String[] args) {
String string="abc";
char kk=string.charAt(1);
System.out.println(kk);
}
返回结果为b。
3.public boolean isEmpty();
解析:判断字符串是否为空;当且仅当length()返回为0时为true。
public static void main(String[] args) {
String string=new String();
System.out.println( string.isEmpty());
}
结果为true。
4.public int compareTo(String anotherString);
解析:按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。如果参数字符串等于此字符串,则返回值 0
;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0
的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0
的值。
深层解析:
1)如果这两个字符串在一个或多个索引位置上的字符不同,那么,返回值等于:
this.charAt(key)-anotherString.charAt(key);
例如:
public static void main(String[] args) {
String string=new String("a");
String string2=new String("b");
int i=string.compareTo(string2);
System.out.println(((int) 'a'));
System.out.println(((int)'b'));
System.out.println(i);
}
输出结果为:97,98,-1;
解析:第一句和第二句输出为,输出“a"和“b”字符的unicode码,第三句为输出string和string2比较结果的返回值。从结果可验证上述。
2)如果没有字符不同的索引位置,则较短字符串在较长字符串之前。返回结果等于
this.length()-another.length
例如:
public static void main(String[] args) {
String string=new String("a");
String string2=new String("abc");
int i=string.compareTo(string2);
System.out.println(string.length());
System.out.println(string2.length());
System.out.println(i);
}
输出结果为:1,3,-2
可验证上述猜想。
5.public String concat(String str);
解析:将指定字符串连接到此字符串的结尾。
深层解析:如果参数字符串的长度为 0
,则返回此 String
对象。否则,创建一个新的 String
对象,用来表示由此 String
对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列。
6.public void getChars(int srcBegin,int srcEnd,char[] dst,int detBegin);
解析:将字符从字符串复制到目标字符数组。要复制的第一个字符位于索引 srcBegin
处;要复制的最后一个字符位于索引 srcEnd-1
处(因此要复制的字符总数是 srcEnd-srcBegin
)。要复制到 dst
子数组的字符从索引 dstBegin
处开始,并结束于索引 dstbegin + (srcEnd-srcBegin) - 1
例如:
public static void main(String[] args) {
String string=new String("agjjgjg");
char[] c=new char[6];
c[0]='a';
c[1]='b';
string.getChars(0, 4, c, 2);
for(char d:c){
System.out.print(d+" ");
}
}
输出结果为:a b a g j j ;
7.public byte[] getByte();
解析:使用平台的默认字符集将此 String
编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
public static void main(String[] args) {
String string=new String("agjjgjg");
byte[] b=new byte[10];
b=string.getBytes();
for(byte d:b){
System.out.print(d+" ");
}
}
输出结果:97 103 106 106 103 106 103
8.public String subString (int beginIndex,int endIndex);
解析:返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex
处开始,直到索引 endIndex - 1
处的字符。
9.public String[] split(String regex,int limit);
解析:此方法返回的数组包含此字符串的子字符串,每个子字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止。数组中的子字符串按它们在此字符串中出现的顺序排列。如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。
limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
例如,字符串 "boo:and:foo" 使用这些参数可生成以下结果:
Regex Limit 结果 : 2 { "boo", "and:foo" } : 5 { "boo", "and", "foo" } : -2 { "boo", "and", "foo" } o 5 { "b", "", ":and:f", "", "" } o -2 { "b", "", ":and:f", "", "" } o 0 { "b", "", ":and:f" }
详解例子:例如limit=5,regex=‘o’时,第一次分割成b,o:and:foo;第二次由于o前面是一个空字符串,所以,分成“”,:and:foo;
第三次and:f,o;第四次由于o前面和后面都没有,所以分成“”,“”;
所以结果就为:{“b”,"",":and:f","",""}
10.public String[] split(String regex);
此方法调用public String[] split(String regex,0);
ok结束!!!!!