Thinking in java(七)
字符串
1.String类在java.lang包中,并且这个类是最终类,String不能有子类;
String描述的字符串,所有在Java程序使用双引号引用起来的数据都是一个对象。
字符串常量属于对象,但是并不存在于堆中;而是存储在方法区中的字符串常量池中。一旦书写完成,既不能被改变;
不能被改变意思是说在常量池中的字符串对象中的常量数据不能被改变,而指向这些字符串对象的引用变量空间中的内存地址值是可以改变的;
2.string类的常用函数
a) equals:equals函数是用来比较两个对象是否相等
(关于equals与==:
基本类型的比较我们只能使用==,因为equals是对象才有的方法。
对象类型:如果要 比较两个变量对应的内存是否相等,使用==。如果要比较两个对象保存的内容是否相等,使用equals;
自定义类型的比较:
如果一个类没有自己定义equals方法,它默认的eqauls方法继承自Object,下边是Object的equals方法:
public boolean equals(Object obj) {
return (this == obj); //使用== 进行比较
}
如果需要比较自定义类的内容,可以override此方法:
public class Person {
private String name;
@Override
public boolean equals(Object obj) {
//1、如果地址相等,则必相等
if (this==obj) return true;
//2、类型不同,则没有比较的意义
if (!(obj instanceof Person)) return false;
//3、强制转化,比较字段
final Person other=(Person)obj;
if (this.name.equals(other.name))
return true;
else
return false;
}
}
)
b) 求字符串长度:int length()
c) 取出字符串中的指定位置的字符:char charAt(int index);
d) 字符串的拼接:+ 或者concat
String concat(String str);将指定字符拼接到此字符串的结尾;
(效率从低到高 + concat stringBuffer StringBuilder)
e) 拆分字符串:split(拆分);substring(截取)
split(regex) 可以按正则截取
f) 比较字符串大小
int compareTo(String anotherString)
compareTo函数的比较方式:
a)如果两个字符串中的字符不一样,这时会使用两个字符串中相同位置的字符对应的编码值进行比较。(我们先比较字母,汉字的编码表比较特殊,后面都会讲解)
举例: 有两个字符串 s=”abc” 和 s1=”acb”
s.compareto(s1),那么比较的方式就是s的字符串减去s1的字符串,由于s和s1中的字符串不相同,所以会比较相同位置上的编码值,然后相减,由于s和s1中的第一个字符都是a,所以接下来会比较s和s1字符串中的第二个字符b 和 c的大小,b的编码表值是98,c的编码表值是99,由于s.compareto(s1),s是调用者,s1是参数,所以应该是b的编码表值减去c的编码表值,98-99=-1.
所以s.compareto(s1)的结果是-1,s小于s1。
b)如果2个字符串字符完全相同,那么比较完的结果一定是零。
c)如果2个字符串进行比较,短串中的所有字符正好和长串中前面需要比较的相同,这时使用2个串的长度进行比较。
compareTo比较完的结果是一个int值,程序中需要根据这个int值是否为零 、 正数 、 负数 确定到底哪个串较大。
g) 获取指定的字符(子字符串)在字符串中的位置
indexOf()
h) 大小写转换
toLowerCase() / toUpperCase()
i) 字符串转成字节或字符数组的
getBytes() toCharArray()
j) 把其他数据转成字符串 :valueOf()
k) 去除字符串前面和后面的空格(不能去除中间的空格) :trim()
l) 判断是否为空字符串:isEmpty()
m) 判断方法:startWith(),endWith();contains()
n) 对字符串数组中的数据排序 sort(char[] a)
3.字符串缓冲区:StringBuffer和StringBuilder
append 追加:可以给容器中添加任何的数据;
delete(int start ,int end)
deleteCharAt(int index)
reverse() 反转