从概念上来说,String字符串就是Unicode字符序列。(例如,串“Java\u2122”)由五个Unicode字符J、a、v、a和TM。Java中没有内置的字符串类型,而是在标准的Java类库中提供了一个预定义类,很自然的叫做String。
String类实例化方式
String类是引用类型,该类实例化方式有两种:
1、直接赋值
这种方式会出现常量池数据共享的情况。上述代码执行“String str1 = ”abc“;”后,JVM在常量池中开辟空间存放一个abc字符串空间并让str1指向该对象;
执行“String str2 = ”abc“;”时,JVM会先检查常量池中是否已经存在了一内容为abc的空间,如果存在就直接让str2指向该空间,否则就会在开辟一个新的空间存放该字符串,上面的代码等同于下面代码:
下面代码的jvm执行过程:
执行“String str1 = ”abc“;”后,JVM在常量池中开辟空间存放一个abc字符串空间并让str1指向该对象; 2、执行“String str2 = ”abc“;”时,JVM会先检查常量池中是否已经存在了一个内容为abc的空间,如果存在就直接让str2指向该空间,否则就会在开辟一个新的空间存放该字符串; 3、执行“String str3 = ”def“;”时,JVM会先检查常量池中是否已经存在了一个内容为def的空间,由于不存在,所以JVM在常量池中新开辟一个空间存放def并让str3指向该空间;
2、构造方法实现实例化
这种方式每new一次就会创建一个新的对象。下面代码jvm的执行过程:
1、执行“String str = ”abc“;”后,JVM在常量池中开辟存放abc的空间并让str指向该空间; 2、执行“String str1 = new String(str);”时,JVM直接创建一个新的对象并让str1指向该对象; 3、执行“String str2 = new String(str);”时,JVM再次创建一个新的对象并让str2指向该对象;
String类中常用的方法
1、 indexOf
indexOf(String str)
indexOf(String str,int fromIndex)
indexOf(int cp)
indexOf(int cp,int fromIndex)返回字符串str或代码cp匹配的第一个子串开始的位置。这个位置从索引0开始或fromIndex开始计算。如果在原始串中不存在str,返回-1
2、lastIndexOf
lastIndexOf(String str)
lastIndexOf(String str,int fromIndex)
lastIndexOf(int cp)
lastIndexOf(int cp,int fromIndex)返回与字符串str或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromIndex开始计算
public class Test { public static void main(String[] args) { String a="aaabbbaaacccc"; System.out.println( a.indexOf("a"));//0 System.out.println( a.indexOf("a",2));//2 System.out.println( a.lastIndexOf("a"));//8 System.out.println( a.lastIndexOf("a",2));//2 } }
3、contains()
该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。
public class Test { public static void main(String[] args) { String a="aaabbbaaacccc"; String b = "aa"; System.out.println(a.contains(b)); System.out.println(b.contains(a)); } }
运行结果:
4、split(String sign)
分割字符串,split方法返回的是数组类型,该数组由目标字符串根据sign拆分得到。
public class Test { public static void main(String[] args) { String a="aaabaaabcccbbbc"; String[] array = a.split("b"); int i=0; for (String arr:array) { System.out.println(arr); i++; } System.out.println("------->"+i); } }
运行结果:
5、startsWith 和endWith
boolean startsWith (String prefix)
boolean endWith (String prefix) 如果字符串以suffix开头或者结尾,则返回true
6、subString
String subString(int start)返回当前字符串从start开始截取到当前字符串末尾的部分。
String subString(int start,int end)返回当前字符串,从start开始截取到end之前的部分。
String类中的subString方法可以从一个较大的字符串中提取出一个子串。
public class Test { public static void main(String[] args) { String a="aaabaaabcccbbbc"; String s=a.substring(4); System.out.println(s); String u=a.substring(4,6); System.out.println(u); } }
运行结果:
7、getBytes()方法
得到一个操作系统默认的编码格式的字节数组。这表示在不同的操作系统下,返回的东西不一样!
8、toCharArray()
将字符串转换为char类型的数组:
public class Test { public static void main(String[] args) { String a="aaab"; char[]str= a.toCharArray(); for (char s:str ) { System.out.println(s); } } }
运行结果:
9、String replaceAll(String old, String new)
返回当前字符串用new替换old的结果
10、String trim()
返回去掉当前字符串左右两端空格后的字符串,注意:当前字符串中间空格不会去掉。
运行结果:
10、int length() 返回字符串的长度
空串与null串
空串“”是长度为0的字符串 ,空串是一个Java对象,有自己的串长度为0和内容为空。
String类中还可以存放一个特殊的 值,名为null,这表示目前没有任何对象与该变量关联。
11、字符串拼接
与绝大多数程序设计语言一样,Java允许使用+号连接(拼接)两个字符串。
注意:单词之间没有空格
public class Test { public static void main(String[] args) { String a=" aabb"; String str="AABB"; System.out.println(a+str); } }
运行结果 :
将一个字符串和一个非字符串的值进行拼接,后者被转换成字符串
public class Test { public static void main(String[] args) { String a=" aabb"; int num=13; System.out.println(a+num); } }
运行结果:
12、静态join方法
String join(CharSequence delimiter,charSequence...elements),返回一个新字符串,用给定的定界符连接所有元素。
如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:
运行结果:
13、equals
equals(String targetString) 用于判断两个字符串是否相同,完全相同返回true,否则返回false:
String 类equals方法和==区别:
String类中的equals方法用于判断两个字符串内容是否相同:
如果所比较的两个变量是引用类型,则==用于比对两个变量指向的是否为同一个存放数据的地址;如果是基本数据类型的两个变量进行比较,则比较的是值是否相等:
14、equalsIgnoreCase
Boolean equalsIgnoreCase (String value) 用于判断两个字符串忽略大小写后是否相同,相同返回true,否则返回false: