String类
一、概述
- 字符串是一个特殊的对象。
- 字符串一旦初始化就不可以被改变。
- String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象。
- String s2 = new String("abc");有什么区别?s1代表一个对象,s2代表两个对象。
- String类复写了Object的equals方法,将此字符串与指定的对象比较。该方法用于判断字符串是否相同。
二、获取和判断
String类是用于描述字符串事物。那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
1、获取。
1.1 字符串中包含的字符数,也就是字符串的长度。
int length():获取长度。
1.2 根据位置获取位置上某个字符。
char charAt(int index):返回指定索引处的char值。//当访问到字符串中不存在的叫表示会发生StringIndexOutOfBoundsException。
1.3 根据字符获取该字符在字符串的位置。
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中第一次出现的位置。
int indexOf(String str):返回的是str在字符串中第一次出现的位置。
int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取str在字符串中第一次出现的位置。
反向索引:
int lastIndexOf(int ch):返回指定字符串在此字符串中最后一次出现的索引。
int lastIndexOf(int ch,int fromIndex):返回指定字符串在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
int lastIndexOf(String str):返回指定子字符串中在此字符串中最右边出现处的索引。
int lastIndexOf(String str,int fromIndex):返回指定字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
2、判断。
2.1 字符串中是否包含某一个子串。
boolean contains(CharSequence s):当且仅当此字符串包含指定的char值序列时,返回true。//接口 CharSequence字符序列:已知实现类String、StringBuffer。
特殊之处:indexOf(str):可以索引str第一次出现的位置。如果返回-1,表示该str不在字符串中存在。if(str.indexOf("aa")!=-1),而且该方法既可以判断,又可以获取出现的位置。
2.2 字符中是否有内容。
boolean isEmpty():当且仅当length()为0时返回true。//从1.6开始.
2.3 字符串是否是以指定内容开头。
boolean startsWith(String suffix):测试此字符串是否以指定的前缀开始。
2.4 字符串是否以指定内容结尾。
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束。
2.5 判断字符串的内容是否相同。复写了Object类中的equals方法。、
boolean equals(Object anObject):将此字符串与指定的对象比较。
2.6 判断内容是否相同。并且忽略大小写。
boolean equalsIgnoreCase(Srting anotherString):将此String与另一个String比较,不考虑大小写。
3、转换。
3.1 将字符数组转成字符串
构造函数:String (char[] value):分配一个新的String,使其表示字符数组参数中当前包含的字符序列。
String (char[] value,int offset,int count):分配一个新的String,它包含取自字符数组参数一个子数组的字符。注意count是个数。
静态方法:static String copyValueOf(char[] date):返回指定数组中表示该字符序列的String。
static String copyValueOf(char[] date,offset,int count):返回指定数组中表示该字符序列的String。
static String valueOf(char[] ):返回char参数的字符串表示形式。
3.2 将字符串转成字符数组
char[] toCharArray()将此字符串转换为一个新的字符数组。
3.3 将字节数组转成字符串
构造函数:String(byte[] bytes):通过使用平台的默认字符集解码指定的byte子数组,构结一个新的string。
String (char[] value,int offset,int count):将字节数组的一部分转成字符串。
3.4 将字符串转成字节数组
byte[] getBytes():通过使用平台的默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中。
3.5 将基本数据类型转成字符串
static String valueOf(int):返回int参数的字符串表示形式。
static String valueOf(double):返回double参数的字符串表示形式。
//3+"";//String.valueOf(3)
特殊:字节数组和字符串转换过程中,是可以指定编码表的。
4、替换。
String replace(char oldChar,char newChar):返回一个新的字符串,它是通过newChar替换此字符串中出现的所有oldChar得到的。
//如果要替换的字符不存在,返回的还是原串。
String replace(CharSequence target,CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
5、切割。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
6、字串。获取字符串中的一部分。
String subSrting(int beginIndex):返回一个新的字符串,它是此字符串的一个仔字符串。//从指定位置开始到结尾。如果交表不存在,会出现字符串交表越界异常。
String subSrting(int beginIndex,int endIndex):返回一个新的字符串,它是此字符串的一个仔字符串。//包含头,不包含尾。
7、转换,去除空格,比较。
7.1 将字符串转成大写或者小写。
String toUpperCase();使用默认语言环境的规则将此 String
中的所有字符都转换为大写。
String toLowerCase(); 使用默认语言环境的规则将此 String
中的所有字符都转换为小写。
7.2 将字符串两端的多个空格去除。
String trim();返回字符串的副本,忽略前导空白和尾部空白。
7.3 对两个字符串进行自然顺序的比较。
int compareTo(String anotherString);如果参数字符串等于此字符串,则返回值 0
;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0
的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0
的值。
int compareToIgnoreCase(String str):按字典顺序比较两个字符串,不考虑大小写。
8、练习。
1.模拟一个trim方法,去除字符串两端的空格。
思路:
1,判断字符串第一个位置是否是空格,如果是继续向下判断,知道不是空格为止。结尾处判断空格也是如此。charAt()
2,当开始和结尾都判断到不是空格时,就是要获取的字符。substring(start,end+1)//记住:Java但凡取从头到尾的部分,都是包含头,不包含尾。
2.将一个字符串进行反转,将字符串中指定部分进行反转,"abcdefg",abfedcg。
思路:
1,曾经学习过对数组的元素进行反转。
2,将字符串变成数组,对数组反转。toChatArray()
3,将反转后的数组变成字符串。return new string(str);//valueOf(str);
4,只要将反转的部分的开始和结束位置作为参数传递即可。reverseString(String s,int start,int end);
3.获取一个字符串在另一个字符串中出现的次数。
"abkkcdkkefkkskk"
思路:
1,定义一个计数器。
2,获取kk第一次出现的位置。while((index = str.indexOf(key,index))!=-1);
3,从第一次出现的位置后剩余的字符串中继续获取kk出现的位置。每获取一次就计数一次。index= index + key.length();count++;
4,当获取不到时,计数完成。//你建议使用split();不一定通用。
4,获取两个字符串中最大相同子串,第一个动作:讲短的那个串进行长度依次递减的的子串打印。
"abcwerthelloyuiodef"
"cvhellobnm"
思路:
1,将短的那个子串按照长度递减的方式获取到。
2,将每获取到的子串去长串中判断是否包含,如果包含,已经找到。
StringBuffer(字符串缓冲区)
- 字符串的组成原理就是通过该类实现的。
- StringBuffer可以对字符串内容进行增删。
- StringBuffer是一个容器。
- 很多方法与String相同。
- 特点:1,StringBuffer是可变长度的。2,可以直接操作多个数据类型。3,最终会通过toString方法变成字符串。//当数据个数和类型都不确定时使用StringBuffer最方便。
c(create)u(update)r(read)d(delete)
1.存储。
StringBuffer append():将指定的数据作为参数添加到已有数据的结尾处。
StringBuffer insert(int index,shuju):可以将数据插入到指定index位置上。
2.删除。
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。//清空缓冲区:sb.delete(0,sb.length())
StringBuffer deleteCharAt(int index):删除指定位置的字符。
3.获取。
char charAt(int index):根据角标获取字符。
int indexOf(str string):根据字符串获取位置。
int lastIndexOf(str string):根据字符串往后第一次出现的位置。
int length():获取字符串长度。
String substring(int start):从start开始获取子串。
String substring(int start,int end):从start开始到end结尾获取子串,包含头,不包含尾,返回的类型是String。
4.修改。
StringBuffer replace(int start,int end,String str):将指定位置的内容替换为str。
viod setCharaAt(int index,chat ch):将index上的内容替换为ch,不返回任何内容。
5.反转。
StringBuffer reverse();
6.void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):将缓冲区中指定数据存储到指定字符数组中。
(将srcBegin到srcEnd位置的内容从dstBegin存入dst字符数组中。)
JDK1.5 版本之后出现了StringBuilder。
StringBuffer是线程同步的。StringBuilder是线程不同步的。
Java升级的三个目的(因素):
- 提高效率。
- 简化书写。
- 提高安全性。
以后开发建议使用StringBuilder
.