1.String类
1.1String类的概念和储存结构:
(1)字符串是一个比较特殊的对象,可以使用new,也可以不使用new来创建字符串对象
String s1 = new String("abc"); 堆
String str= "abc"; 常量池
String str2= "abc";
两者的区别:一个在堆中,一个在常量池中
常量池:方法区的一部分,字符串在常量池里面保存一份
(2)字符串是不可变量,一旦初始化就不可以被改变
String s1 = "abc";(直接使用用字符串字面量)
s1 = s1 + "123";//s1变量指向变了(指向了"abc123"),并不是字符串变了。
面试题:以下语句创建了几个对象?
String str1= new String("abc");
一个或者两个:
如果之前常量池里有"abc"了,就在堆中创建一个对象;
如果常量池里没有"abc"对象,则先在常量池中把"abc"创建出来,然后再到堆空间中创建对象.
面试题
(3)"abc" vs new String("abc");
String s3 = "abc";
String s4 = "abc"; VS String str1 = new String("abc");
使用new关键字创建的对象都是在堆内存中开辟了新空间,所以地址不可能相同。
不使用new创建的字符串引用的是常量池中的字符串对象,所以地址是相同的
(4)new String(chs)
1.2String类的常用构造方法
String(char[] ch)
String(char[] ch,int offset,int count)
String(byte[] bys,int off,int len)
//使用默认的解码,将字节数组解码成String
先在堆中,后在常量池
其构造方法创建的字符串,先在堆中创建出来,
并在常量池保存一个副本(如果常量池中没有的话)
String(String original)
//用一个原始字符串构建一个新字符串
使用构造方法创建的对象都是在堆中
如果直接使用字符串常量创建对象: new String(String original)
先在常量池中创建对象,然后在堆中创建对象;
补充:char的ASCII
int length()--获取字符串中字符的个数
char charAt(int index);
char[] toCharArray();//使用此方法改写统计案例
int indexOf(String str); 有报位置无-1
boolean startsWith(String str);
boolean endsWith(String str);
String[] split(String reg);//统计单词
String substring(int beginIndex);
String substring(int beginIndex,int endIndex);(左闭右开)
1.3 equal方法与==
1.4 String 的构造方法
1.4.1成员变量
1.4.2构造方法
1.5字符串拼接原理
2.StringBuffer类
类似于String的字符缓冲区,是一个容器。其内部维护了一个字符数组,用于存储字符。StringBuffer可以对字符串内容进行增删
很多方法与String相同。
2.1对成员变量源码研究
2.2StringBuffer的构造方法
2.3StringBuffer类特有方法--添加
StringBuffer append(int x)--在末尾追加
StringBuffer insert(int off,插入内容)---指定位置
若:StringBuffer sb = new StringBuffer();
则以下语句等价:
2.3.1append解析
append方法后面可以跟任意数据类型,一下是对append(String str)
2.4StringBuffer类特有方法--删减
StringBuffer delete(int start, int end)
注意位置区间的处理:包前不包后:[start,end)
2.5toString方法
补充:对比oject类
2.5StringBuffer类特有方法--反转功能
StringBuffer reverse()
2.6StringBuffer类特有方法--替换功能
StringBuffer replace(int start,int end,String str)
替换功能:[start,end)
3.StringBuilder类
3.1StringBuilder vs StringBuilder
JDK1.5出现了:StringBuilder
区别是从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。
与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
StringBuilder是同步的,效率稍低
StringBuilder是非同步的,因此速度更快
3.2练习
练习1:
将字符串中每个单词反转,例如:
welcome to China
emoclew ot anihC
思路:
考虑使用StringBuffer类的reverse方法
关键是如何将每个单词转换成StingBuffer对象?public classStringBuilderDemo2 {public static voidmain(String[] args) {
String src= new String("welcome to China");//切分成字符串数组
String[] words = src.split(" ");//用来装反转之后的字符串
StringBuilder res = newStringBuilder();//遍历数组,封装成StringBuilder对象
for(int i = 0;i
StringBuilder sb= newStringBuilder(words[i]);
res.append(sb.reverse()).append(" ");
}
System.out.println(res.toString().trim());
}
}
练习
练习2:
public classStringBufferDemo{public static voidmain(String[] args){
StringBuffer s1= new StringBuffer("A");
StringBuffer s2= new StringBuffer("B");
test(s1,s2);
System.out.println(s1+","+s2);//考察 AB,B
}public static voidtest(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
System.out.println("test:"+x+","+ y);//AB,AB
}
}
练习