String源码分析
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
........
}
1)String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。
2)String类其实是通过char数组来保存字符串的。
“String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。
String、StringBuffer、StringBuilder的区别
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象
使用 StringBuffer 类时,会对 StringBuffer 对象本身进行操作,而不是生成新的对象,StringBuffer 中的方法大都采用了synchronized 关键字进行修饰,因此是线程安全的
StringBuilder 类在 Java 5 中被提出,是非线程安全的
StringBuffer对象的创建:
1. 无参构造方法:无参构造方法创建一个可容纳16个字符的StringBuffer对象
StringBuffer sb = new StringBuffer();
2. 整型参数构造方法:创建一个可容纳参数长度字符的StringBuffer对象
StringBuffer sb = new StringBuffer(101); //创建一个可容纳101个字符的字符串
3. 以String对象作为参数的构造方法:可容纳长度为参数字符串长度,再加16 个字符
StringBuffer sb = new StringBuffer("abcde");
以下是 StringBuffer 类支持的主要方法:
序号 | 方法描述 |
---|---|
1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
5 | insert(int offset, String str) 将 str 参数的字符串插入此序列中。 |
6 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
StringBuilder对象的创建
public class RunoobTest{
public static void main(String args[]){
StringBuilder sb = new StringBuilder(10);
sb.append("Runoob..");
System.out.println(sb);
sb.append("!");
System.out.println(sb);
sb.insert(8, "Java");
System.out.println(sb);
sb.delete(5,8);
System.out.println(sb);
}
}
String常用方法
1)length():获取字符串的长度,其实也就是字符个数
String str = "adsfaxsdfas沙发上案发地方";
System.out.println(str.length());
运行结果:
18
2)charAt(int index):获取指定索引处的字符
String str = "adsfaxsdfas沙发上案发地方";
char[] c = {'a','d','s','f','a'};
System.out.println(str.charAt(12));
运行结果:
发
3)indexOf(String str):获取str在字符串对象中第一次出现的索引
String str = "adsfaxsdfas沙发上案发地方";
System.out.println(str.indexOf('a',5));
运行结果:
9
4)String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
String str = "adsfaxsdfas沙发上案发地方";
System.out.println(str.substring(1, 12));
运行结果:
dsfaxsdfas沙
String判断功能
1)equals(Object obj):比较字符串的内容是否相同
String str = "adsfaxsdfas沙发上案发地方";
System.out.println(str.equals("adsfaxsdfas沙发上发地方"));
System.out.println(str.equals("adsfaxsdfas"));
运行结果:
true
false
2)replace(char oldChar, char newChar):将指定字符替换成另一个指定的字符
String str = "adsfaxsdfas沙发上发地方";
System.out.println(str.replace('a', 's'));
运行结果:
sdsfsxsdfss沙发上发地方
3)replaceFirst(String regex,String replacement):替换首个满足条件的内容
String str = "adsfaxsdfas沙发上发地方";
System.out.println(str.replaceFirst("沙", "璇"));
运行结果:
adsfaxsdfas璇发上发地方
4)contains(CharSequence s):查看字符串中是都含有指定字符
String str4 = "Hello,world!";
System.out.println(str4.contains("l"));
运行结果:
true
5)concat(String str):在原有的字符串的基础上加上指定字符串
String str5 = "dr";
System.out.println(str5.concat("eam"));
运行结果:
dream