字符串不是java基本的数据类型,而是java标准库中的一个String类,每个用双引号引起来的字符串就是String类的一个实例。如:String name="Tonny"
。
1.字符串的构造
第一种方式:
String name="Tonny"
第二种方式:
String name=new String("Tonny");
第三种方式:
byte[] arr = {65, 66, 67, 68};
String s = new String(arr); //s=ABCD
第四种方式:
byte[] arr = {65, 66, 67, 68,69};
String s = new String(arr, 1, 4); //s=BCDE
2.子串
使用substring可以从一个较大的字符串中提取一个子串。比如:
String greeting="HelloWorld!";
System.out.println(greeting.substring(2));//llo World!
System.out.println(greeting.subSequence(2, 6));//lloW
substring() 接受一个参数时,参数为子串开始位置,字符串从0开始计算位置。
substring()接收2个参数时分别为开始位置和结束位置,截取的字符串包含开始位置不包含结束位置。
3.拼接
使用”+”可以拼接2个字符串。例如;
String str1="Hello";
String str2="World!";
String str3=str1+str2;
System.out.println(str3);//HelloWorld
一个字符串和和一个非字符串进行拼接时,后者被转换为字符串类型。在java中任何一个字符串对象都可以转换为字符串。
4. 不可变字符
java中没有修改字符串的方法,java使用拼接再赋值的方式来实现字符串的修改。原来的字符串仍然存在,只是变量指向了新的字符串而已。hello永远是包含h、e、l、l、o的代码单元序列。
5.检查字符串是否相等
这个问题经常出现在各种笔试、面试题中。字符串的equals方法用来检查2个字符串的值是否相等,==比较的是2个字符串的地址是否相同,即是否指向的是同一个字符串。使用substring、+截取或者拼接的字符串虽然内容一样,但是地址不一样。
String a="ucas";
String b=a.substring(0,3)+"s";
System.out.println("ucas".equals(a));//true
System.out.println(a.equals(b)); //true
System.out.println(a==b); //false
6.空串与Null串
空串是一个String 对象,内容为空,长度为0。null表示没有对象和它关联。判断一个字符串对象是不是为空串:
if(str.length==0)
或者
if(str.equals(""))
检查一个对象既不为null也不为空:
if(str!=null&&str.length!=0)
7.字符串Api
- boolean endwith()判断字符串后缀
- equalIgnoreCase()忽略大小写比较
- int indexOf() 子串首次出现位置
- int lastIndexOf() 返回字符串最后一次出现位置
- int length() 返回字符串长度
- boolean startWith(prefix)判断字符串是否以prefix开头
- String toLowerCase 转为小写
- String toUpperCase 转为大写
- String trim()删除尾部空格
8.字符串的本质
地址比较:
字符串”abc”在常量池中,s1和s2指向的是同一个对象,因此不论是比较地址还是比较值结果都是一样的。
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
再看下面的例子:
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
这时,s1指向的是字符串常量池中的”abc”,s2是字符串对象,位于堆内存中,因此s1和s2的地址不一样,不是同一个对象,字符串值一样。
9 字符串切分
String str1 = "abc,def,hig";
String[] strArr = str1.split(",");
for(String str:strArr){
System.out.println(str);
}
打印结果:
abc
def
hig
特殊的字符需要转义,比如,.本身是正则表达式中的占位符,使用\转成英文实心句号:
String str1 = "abc.def.hig";
String[] strArr = str1.split("\\.");
10.字符串转字符数组
String s = "ab你好";
char[] cArr = s.toCharArray();
for (char c : cArr) {
System.out.println(c);
}
打印结果:
a
b
你
好
11.字符串按字典顺序排序
使用TreeSet:
String[] strArr = {"recursive", "raw", "platform", "rank", "register", "symbol"};
TreeSet treeSet = new TreeSet<>();
for (String str : strArr) {
treeSet.add(str);
}
System.out.println(treeSet);
12.按字典顺序逆序排序
逆序排序只需要在TreeSet实现Comparator接口,重写compare()方法:
String[] strArr = {"recursive", "raw", "platform", "rank", "register", "symbol"};
TreeSet treeSet = new TreeSet<>(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return o2.toString().compareTo(o1.toString());
}
});
for (String str : strArr) {
treeSet.add(str);
}
System.out.println(treeSet);
结果:
[symbol, register, recursive, raw, rank, platform]
13.StringBuffer和StringBuilder
StringBuffer是字符串缓冲区, 线程安全,单线程操作单时候也要不停的判断锁,后来独立出来一个StringBuilder,线程不安全,但是速度快。