java.lang.Object
丨
丨—- java.lang.String
概述
String对象是不可变对象:
String类代表字符串,String类是经final修饰过的,它的值在创建后不能更改且类不能被继
承,字符串一旦创建,对象永远无法改变,但是字符串引用可以重新赋值;
注:String类型是引用类型,内部存储的只是字符串的引用,并非是值。
String常量池:
java为了提高性能,静态字符串(字面量、常量、常量连接的结果)在常量池中创建,并尽量使用同
一个对象,重用静态字符串,对于重复出现的字符串直接量,JVM会首先在常量池中查找
如果存在即返回该对象如果不存在就在常量池中创建。
public class StringTest{
String test1="Hello";
//不会创建新对象,而是使用常量池中已有的"Hello";
String test2="Hello";
System.out.println(test1 == test2); //输出:true
//使用new关键字创建新的String对象。
String newString = new String("Hello");
System.out.println(test1 == newString); //输出false
}
注:
1、第6行代码输出为true:因为test1创建时已在String常量池中创建了”Hello”常量,test2值与test1相同所有优先重用。
2、第9行代码输出为false:因为newString是通过new关键字创建的,不管常量池中是否存在相同的字符串都会创建一个新的,这样就并没有做到静态字符串的重用。所以因尽量避免使用new关键字创建String类型。
String内存编码及长度
String在内存中采用的Unicode编码,每个字符占用两个字节,任何一个字符(无论中文还是英文)算一个字符长度,占用两个字节。
常用的API
indexOf
api _ int indexOf(xxx ch)
返回在此字符串中第一次出现 ch 的索引(下标)。
api _ int indexOf(xxx ch,int fromIndex)
返回在此字符串中第一次出现 ch 的索引(下标)。从 fromIndex 指定的索引开始
api _ int lastIndexOf(xxx ch)
返回在此字符串中最后一次出现 ch 的索引(下标)。
api _ int lastIndexOf(xxx ch,int fromIndex)
返回在此字符串中最后一次出现 ch 的索引(下标)。从 fromIndex 指定的索引开始反向搜索
xxx 可代表的类型: int(字符) 、 String(字符串)
注:short、int 、long、float、double、char这些基本类型都可以存储字符,
只有boolean以及byte不可以其中一个因为是char类型占用2个字节
boolean、byte占用一个字节所以他俩不行。
public static void main(String[] args) {
String date = "String to IndexOf";
int index_1 = date.indexOf('o');
int index_2 = date.indexOf("to");
int index_3 = date.indexOf('o', 7);
int index_4 = date.indexOf("to", 7);
int lastIndex_1 = date.indexOf('o');
int lastIndex_2 = date.indexOf("to");
int lastIndex_3 = date.indexOf('o', 9);
int lastIndex_4 = date.indexOf("to", 9);
}
subString
api _ String subString(int beginIndex)
返回一个从beginIndex的索引开始到结尾的子串
api _ String subString(int beginIndex,int endIndex)
返回一个从beginIndex的索引开始到endIndex的子串 (返回的子串包头不含尾)
注:下标从0开始
抛出:indexOutOfBoundsException---如果BeginIndex为负或大于此String对象的长度
public static void main(String[] args) {
String date = "String to subString";
//subDate只包含从date字符串从下标为2开始到5的字符
String subDate = date.substring(2, 6);
System.out.println("结果为:"+subDate); //结果为:ring
}
charAt
api_ char charAt(int Index)
返回index处的char值,索引的范围为从0到 length() - 1 。下标从0开始
抛出:indexOutOfBoundsException--如果index参数为负或小于此字符串的长度。
String date = "String to charAt";
char ch = date.charAt(0);
System.out.println(ch);//输出S
for(int i = 0 ;i<date.length();i++){ //循环遍历
char[] chs = date.charAt(i);
}
valueOf
api_ static String subString(xxx date)
1、返回XXX参数的字符串表示形式。所支持的类型有:
boolean/char/char[]/double/float/int/long/Object
其中Object返回的是传入参数的toString方法的返回值,
2、如果这个对象没有重写toStirng则返回Object类的toString的值。
说白了就是将传入参数的类型转化为字符串类型。
注:因为String对象自身的不可变性导致了一些缺点,就是对String类型在做非常频繁的修改操作时就会在常量池中创建非常多的静态字符串,导致内存溢出等等错误,有错误就改的程序员是好程序员,对此sun公司在JDK1.0推出了StringBuffe类。
java.lang.Object
丨
丨—-java.lang. StringBuffer
概述
StringBuffer:
1、StringBuffer类似于String的字符串缓冲区,可将字符串缓冲区安全的地应用于多个线程,可以在必要时对这些方法进行同步,因此所有操作就好像是串行发生的,该顺序与所设计的每个线程进行的方法调用顺序一致。
2、每个缓冲区都有一定容量,只要字符串缓冲区所包含的字符序列的长度没有超出此容量就无需分配新的内部缓冲区数组,如果溢出了就自动增大。
3、因为他是线程同步的所以他的速度会比较慢。
常用API
append
api_ StringBuffer append(xxx date)
将xxx参数的字符串表达式追加到序列。
此方法同等于:StringBuffer.append(String.valueOf(date));
将传入值通过valueOf转化为String类型在追加到StringBuffer中
insert
api_ StringBuffer insert(int index,xxx date)
将 date 参数插入到 index 参数指定的索引处。
此方法同等于:StringBuffer.append(int index,String.valueOf(date));
将传入值通过valueOf转化为String类型在追加到StringBuffer中
index 参数必须大于0 ,且小于等于序列长度
抛出:StringIndexOutOfBoundsException----如果index参数无效
delete
api_ StringBuffer delete(int start,int date)
移除此序列的子字符串中的字符。该字符串从start处开始,一直到索引end - 1处的字符,
如果不存在这种字符,则一直到序列尾部,如果 start 等于 end ,则不发送任何更改。
从start开始 (包含) 到 end 结束 (不包含);
抛出:StringIndexOutOfBoundsException---- 如果start为负、大于length() 或大于end。
注:由于StringBuffer执行速度比较慢,所以在JDK1.5中添加了StringBuilder,与StringBuffer使用几乎完全一样,而执行速度更快。
java.lang.Object
丨
丨—-java.lang. StringBuilder
概述
StringBuilder: 此类发布于JDK1.5,与StringBuffer宏观上非常相似主要用法与StringBuffer相同下面说明主要的不同点。
**1**、StringBuffer是线程安全的 、 StringBuilder是非线程安全的
**2**、StringBuffer因是线程安全的在对此对象操作时执行的所有操作都是顺序执行一个一个走,在安全上大大增加但是在效率上却在下降。因这个类在多线程中使用时才能表现出他的优势,在单线程中无法发挥出他应该有的优势。
**3**、StringBuilder是非线程安全的,所以不需要考虑同步问题,执行效率更快
**4**、所以在实际开发中根据性能等指标选择使用。
总结:
String:类不可被继承,所创建的字符串不可变,引用地址可变,无法实现做频繁更改操作。
StringBuffer:线程安全、执行效率慢、可更改。(适用于多线程)
StringBuilder:非线程安全、执行效率快、可更改。(适用于单线程)