进入这一学习阶段,我们就必须开始利用API文档了,它可以帮助我们更高效的去学习关于lang包下的各种类,类下的各种常用方法,如何正确的使用API文档,百度自行学习
这是api1.6截的图,我们可以很明显的发现String 类是属于Object的子类,实现了三个不同的接口,而且被final修饰,那么就预示着它不可以被修改
说明了Sting类从何而来并且实现了哪些接口之外,那么接下来我们就理解一下什么是String
char与String 对比
我们经常会看到这样的代码
char c='C'; Sting c="ccc";
很明显我们会发现两个都是修饰字符的,不同的是String修饰的是一组字符串,char则修饰的是单个字符,而且String是用双引号来标记字符串的,char则是用单引号标记单个字符,我们也可以理解成由String定义的字符串是由一个char类型的字符数组组成例如下面代码
char data[]={'a','b','c'];
String data="abc";
通过以上说明我们可以总结一下String主要有两个特点
- 可以将String定义的数据理解为一个字符数组,因此可以存储单个字符或者多个字符
- 字符串属于一个常量,因此创建以后就不能修改,所以对象不可变,可以实现数据共享
接下来我们就了解一下String类中常用的方法以代码的形式示例,并且进行方法解析
class StringTest{
public void main(String[] args){
String xx="abc";
String yy="abcd";
String zz="AbC";
String str="abc,efg,igf";
}
}
char charAt(int index) 根据下标返回该字符串
System.out.println(xx.charAt(1));
输出结果是:b
int compareTo(String anotherString) 根据字典排列顺序进行大小比较,如果前一个字符串比后一个字符串大则返回大于一个0的值,若是比后者小则返回一个比0小的值,若是相等则返回0
System.out.println(xx.compareTo(yy));
输出结果是:-1
boolean eauqalsIgnoreCase(String anotherString) 两个字符串值进行比较忽略大小写,该方法一般用于验证码验证
System.out.println(xx.equalsIgnoreCase(zz));
输出结果是:true
String concat(String str) 将指定的字符串连接在此字符串的后面
System.out.println(xx.concat(zz));
输出结果:abcAbC
boolean contains(CharSequence s) 当且仅当此字符串包含指定的char字符或者字符串时候返回ture
System.out.println(xx.contains("a"));
输出结果:true
boolean startsWith(String prefix) 判断此字符串是否以指定的前缀开始
boolean startsWith(String prefix,int index)判断此字符是否以指定下标的字符作为前缀开始
boolean endsWith(String prefix)则判读结尾是否以指定字符串作为结尾
这两个方法一般用于用户名注册验证
System.out.println(xx.startsWith("a"));
System.out.println(xx.startsWith("a",0));
返回结果是:true
true
int indexOf(“c”); 找出指定字符串第一次出现的下标
System.out.println(xx.indexOf("b"));
输出结果:1
int indexOf(int ch,int fromIndex) 从指定的字符开始检索,输出要检索字符第一次出现的位置 若是没有找到则返回-1 而且要检索字符的位置是它在整个字符串中的下标
System.out.println(xx.indexOf("c",1));
返回结果是:2
**String[] split(String regex)**根据给定正则表达式来拆分此字符串 拆分完之后是一个字符数组 想要输出就必须进行遍历
String[] arr=str.split(",");
for (String string : arr) {
System.out.println(string);
}
输出解雇:abc
efg
igf
String substring(int beginIndex)根据指定下标截取新的字符串 也就是原字符串的字串
System.out.println(xx.substring(1));
System.out.println(xx);
结果:abc
bc
我们会发现xx字符串虽然被截取但是它的原串依然存在不会被更改
StringBuffer
通过API我们会发现StringBuffer类和String类特别相似,都是Object的子类且被final修饰不可以有子类,那我就简单梳理一下它两的相同点和不同点
相同点
- 都是对字符串的操作
不同点
- String内容不可改变一旦对String操作就开辟了新的内存空间
- StringBuffer内容可以改变,所有的操作都是在子集的缓冲区中完成,不会重新开辟新的内存空间(每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大)
- 如果要判断两个StringBuffer是否相等,就必须先将StringBuffer转换成String进行比较
StringBuffer的主要方法主要有一下几个
1.StringBuffer append(String str) 将指定的字符串追加到此字符序列。
2 StringBuffer delete(int start, int end) 移除此序列的子字符串中的字符。
3 StringBuffer deleteCharAt(int index) 移除此序列指定位置的 char。
4 StringBuffer insert(int offset, String str) 将字符串插入此字符序列中。
5 void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch。
6 StringBuffer reverse() 将此字符序列用其反转形式取代
public class StringBufferA {
public static void main(String[] args) {
String s1="123";
StringBuffer s3=new StringBuffer(s1);
StringBuffer s4=s3.append(false);
System.out.println("s4: "+s4);
System.out.println("s3: "+s3)
}
输出结果是:123false
123false
我们会发现StringBuffer类执行自己的方法时候原有的字符串会发生改变,这是因为执行这些操作都是在缓冲区执行的,因此字符串会随之改变(个人自己理解,很是浅薄,若想更清楚理解String和StringBuffer就必须理解它两在执行方法时候的内存变化,搞清楚堆内存,缓冲区,栈内存三者之间的关系 推荐一篇博客https://www.cnblogs.com/javadevelper/p/6067655.html
)