Java没有内置的字符串类型,而是在标准的Java类库中提供了一个预定义类,叫做String。它允许使用+号对字符串进行拼接,当将一个字符串与一个非字符串进行拼接时,后者会被转换成字符串。对于修改字符串String类并没有提供用于修改字符串的方法,并不能对实际字符串进行修改,字符串被声明为常量对象,以final修饰。而将字符串内容改变,如拼接操作只是改变了改对象的引用地址,而原来的字符串依然存在于内存中,并没有被修改。这样会使通过拼接创建新串的效率变低,但是却使字符串实现了共享。
对于字符串的判等,如果两个串都是通过直接付值的方式进行声明的,那么可以用==进行判等,但是如果一个为直接赋值,另一个采用构造器,或全部采用构造器,就要用equals进行判等,这是因为采用直接赋值,会使字符串直接从常量池中寻找,找不到存入常量池中。而采用构造器,会使字符串存入堆中,不管堆中有没有,然后去常量池找,找不到就存入,然后堆中存在常量池中地址。而equals方法:
1 public boolean equals(Object anObject) { 2 if (this == anObject) { 3 return true; 4 } 5 if (anObject instanceof String) { 6 String anotherString = (String)anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
先判断是不是同一引用地址,如果不是就判断类型是不是String,再判断串中每一个字符是不是相同,需要注意的是当字符串为null时不能使用equals,这是因为null表示空对象,没有该方法。
当需要频繁短串结合成长字符串时,拼接操作就会又费时又费力,所以就引入了类StringBuffer和StringBuilder。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的,但是StringBuilder处理速度要更快,所以大多建议使用StringBuilder,但涉及安全时要采用StringBuffer。
一些常用方法: append(String s)//将指定的字符串追加到此字符序列。
reverse()//将此字符序列用其反转形式取代。
delete(int start, int end)//移除此序列的子字符串中的字符。
insert(int offset, int i)//将 int
参数的字符串表示形式插入此序列中。
replace(int start, int end, String str)//使用给定 String
中的字符替换此序列的子字符串中的字符。