String类
String类中的方法介绍:
1、获取方法:
获取长度
length() 返回字符串中拥有的字符个数
String类中的length是方法,调用时必须加上括号,而数组对象中的length是数组这个对象的一个成员属性。访问类中的成员属性不需要加括号
获取指定的字符
charAt( int index ); 根据指定的下标,获取字符串中的字符,注意如果给定的下标不在字符串的下标有效范围内,会字符串下标越界
根据字符(字符串)获取下标
indexOf( 字符 ) 根据指定的字符,获取这个字符在字符串中的下标(第一次开始)。如果没有这个字符,会返回-1
indexOf( 字符,起始位置 ) 从起始位置开始查找指定的字符第一次出现的位置,没有也会返回-1
indexOf( 短的字符串 ) 获取短的字符串在另外一个字符串中第一次出现的位置,没有会返回-1
indexOf( 短的字符串 ,起始位置 ) 从起始位置开始获取短的字符串在另外一个字符串中第一次出现的位置,没有会返回-1
lastIndexOf(int ch)
从后往前找第一次出现的位置
获取一个长串中的子串
String类中有这个方法,返回的类型一定是String。
substring(int beginIndex)
从beginIndex位置截取子串,一直截取到末尾。
substring(int beginIndex, int endIndex)
从指定beginIndex位置开始截取子串,到endIndex停止,注意:包含头下标上的字符,但不包含结束下标上的字符
/*
需求:
有一个长的字符串,要求按照长度递减的形式,截取出多个子串出来
“abcdefghk” length-2
第一次 “abcdefghk”
第二次 “abcdefgh” "bcdefghk"
第三次 “abcdefg” "bcdefgh" “cdefghk”
。。。。。
最后一次 “a” “b” “c” .. "k"
这个题目肯定需要使用substring来截取。 substring(start,end)
重点需要确定截取的起始位置和结束位置
共计需要截取字符串的length次,随着截取的次数增多,截取的子串也在增多。
第一次截取: 0 length-0
第二次截取: 0 length-1 1 length
第三次截取: 0 length-2 1 length-1 2 length
第三次截取: 0 length-3 1 length-2 2 length-1 3 length
* /
publicclassSubstringTest {
publicstaticvoidmain(String[] args) {
Strings = "abcdefghk";
//截取子串
//书写循环控制共计要截取到少次
for( inti=0;i<s.length();i++ ){
//需要提供每次截取的起始位置和结束位置,使用循环控制到底每次要截取多少子串出来
for( intj=0,k=s.length()-i ; k<=s.length() ; j++,k++ ){
Stringsub = s.substring(j, k);
System.out.println(sub);
}
}
}
}
2、判断方法
判断方法返回值都是boolean类型
contains(
CharSequence s)
判断指定的s字符串是否在当前调用这个方法的字符串中存在
endsWith(
String suffix)
判断当前调用这个方法的字符串是否以指定的字符串结尾
startsWith(
String prefix)
判断当前调用这个方法的字符串是否以指定的字符串开始
equals(
Object anObject)
比较两个字符串是否相同 ,根据是字符串中的字母进行比较的
equalsIgnoreCase(
String anotherString)
忽略大小写进行比较
isEmpty()
判断当前字符串是否为null String s = new String() String s = “”;
3、字符串转数组,数组转成字符串
要把一个其他数据转成字符串,最终我们想得到是一个字符串对象。要的一个类对象,这时一般都会通过这个类的构造方法来创建这个类的对象,如果这个类中没有可以i使用的构造方法,这时就查找看这个类有没有静态方法能够得到这个类的对象。
数组转成字符串:
先找String的构造方法:
在创建String对象的时候,可以给构造方法传递字节数组或者字符数组,或者int类型的数组。把这些数组转成一个字符串对象
String(char[] value, int offset, int count)
String(byte[] bytes, int offset, int length)
String类中也提供了静态的方法可以把一个数组转成字符串对象
copyValueOf(char[] data)
copyValueOf(char[] data, int offset, int count)
把字符串转成数组:
只能去查找String类中提供的方法。
byte[]
getBytes()
将一个字符串转成字节数组
String[]
split(
String regex)
把一个字符串按照指定的字符串进行切割,切割后会得到一个字符串数组。
“abc,bbb,ccc,xxxx,dddd” 把一个字符串切割成多个字符串
char[]
toCharArray()
把一个字符串变成字符数组
把基本类型数据转成字符串:
使用valueOf方法可以把一个基本类型的数据转成字符串
需求:
有一个字符串,要求按照其中的字母的顺序进行从小到大排序。
“kzaAbCTqposdhsASEFERFVRsdjflk234245456”
对于排序我们会,在学习数组的时候,学习过对数组中的数据进行排序。
现在要对字符串进行排序,我们如果把这个字符串转成数组之后,那么就可以对这个数组进行排序了。
可以使用String类中的toCharArray方法把字符串变成字符数组。char[]
publicclassStirngSortTest {
publicstaticvoid main(String[]args) {
stringSort_2();
}
publicstaticvoidstringSort_2() {
Strings = "kzaAbCTqposdhsASEFERFVRsdjflk234245456";
//把这个字符串变成字符数组
char[] chs = s.toCharArray();
//api中提供了一个类,可以专门对数组进行排序 Arrays
Arrays.sort(chs); //它会对数组进行从小到大的排序
//把数组转成字符即可
Stringsort_str = String.valueOf(chs,0,chs.length);
System.out.println(sort_str);
}
publicstaticvoidstringSort_1() {
Strings = "kzaAbCTqposdhsASEFERFVRsdjflk234245456";
//把这个字符串变成字符数组
char[] chs = s.toCharArray();
//对这个字符数组进行排序
for( inti=0;i<chs.length-1;i++ ){
for( intj=i+1;j<chs.length;j++ ){
if( chs[i] > chs[j] ){
chartemp = chs[i];
chs[i] = chs[j];
chs[j] = temp;
}
}
}
//把排序后的字符数组变成字符串
Stringsort_str = newString(chs);
System.out.println(s);
System.out.println(sort_str);
}
}
4、String类中的其他方法
大小写转换的方法:
toLowerCase()
把所有的字母都转成小写
toUpperCase()
把所有的字母都转成大写
trim()
去除字符串两端的空格
“ abc dsss ” “abc dsss”
replace(char oldChar, char newChar)
替换,把字符串中的一个字符使用另外一个字符进行替换
replace(
CharSequence target,
CharSequence replacement)
把原串中的某个子串替换新的子串
compareTo(
String anotherString)
比较2个字符串的大小。
equals比较是两个字符串是否相同,它无法来区分谁大谁小。
compareTo
比较原理:
当需要比较两个字符串的大小时,调用了compareTo方法之后,就会按照两个字符串中字母的位置开始进行比较,
在比较的过程中,取出相同位置上的字母,然后按照它们的字典顺序,当那个字符大,这时就认为这个字符所在的那个串就大。
在使用compareTo方法的时候,我们需要根据返回的数据是负数 零 正数来确定到底谁大谁小。
String s_1 = "abcd";
Strings_2 = "z";
Strings_3 = "aBcd";
System.out.println(s_1.compareTo(s_2));
System.out.println(s_1.compareTo(s_3));
System.out.println(s_2.compareTo(s_3));
当s_1.compareTo(s_2)返回的值如果是负数,就说明 s_1 小于 s_2
当s_1.compareTo(s_2)返回的值如果是零,就说明 s_1 等于 s_2
当s_1.compareTo(s_2)返回的值如果是正数,就说明 s_1 大于 s_2
不仅仅字符串这类对象可以比较大小,其他的任何对象都有可能需要进行大小的比较。这时就需要任何对象都要对外提供比较大小的功能。
在Java中它定义了一个接口,专门使用这个接口来描述比较2个对象大小的功能。
Comparable接口,这个接口是专门负责对象进行大小比较。这个接口就是一个规则。当前某个类创建的对象需要比较大小的时候,就要求这个类必须去实现这个接口。
一旦这个类实现了这个接口,那么这个类创建的对象就可以进行大小的比较。
publicclassCompareToDemo {
publicstaticvoidmain(String[] args) {
Strings_1 = "abcd";
Strings_2 = "z";
Strings_3 = "aBcd";
System.out.println(s_1.compareTo(s_2));
System.out.println(s_1.compareTo(s_3));
System.out.println(s_2.compareTo(s_3));
if( s_1.compareTo(s_2) > 0 ){
System.out.println("s_1大于s_2");
}elseif( s_1.compareTo(s_2) == 0 ){
System.out.println("s_1等于s_2");
}else{
System.out.println("s_1小于s_2");
}
}
}
“aaa bbbb zba AAA ABC Abac sjlkdfjlks werew”
进行排序。
StringBuffer和StringBuilder
String表示的字符串。并且这个对象一旦存在就是一个常量,不能被修改。
只要是对字符串进行修改,那么原字符串依然会存在,这时修改后,又会生产一个新的字符串。
StringBuffer:它是一个容器,这个容器主要用来处理字符串数据的。它中可以存放任意的数据,最后会把其中存放的所有数据变成一个字符串。
其中定义了很多方法,都是围绕操作这个容器中的数据。
其中定义了
1、StringBuffer中的常用方法
构造方法
空参数的构造方法,可以创建一个初始容量为16个字符的容器、
其他方法:
增加:
append 功能是把当前的value值添加sb容器中
insert 在指定的位置上的添加数据。如果当前这个位置上有数据,那么原来的数据就需要向后移动
在使用insert插入数据的时候,指定的下标,之前必须有数据。
删除:
delete(int start, int end) 从start位置开始删除,包好start位置上的字符,到end位置,但不包含end位置上的字符
deleteCharAt(int index) 删除指定位置删的字符
获取
capacity() 容器的容量
length() 容器中数据的个数
indexOf( str )
indexOf( str ,index )
lastIndexOf( str )
lastIndexOf( str ,index)
toString()把容器中的数据全部变成字符串
设置/修改
setCharAt(int index, char ch) 把指定位置上的字符修改为新的字符
setLength(int newLength) 设置长度
reverse() 反转
2、StringBuffer练习
/*
* 需求,有一个字符数组,现在需要把这个数组中的数据进行反转
* 思路:
* 1、可以采用数组的方式,定义头和尾的下标,然后取出头和尾位置上的字符进行交换,知道交换到中间停止。
* 2、在StringBuffer类中有个reverse方法,这个可以把容器中的数据进行反转。
* 方法是,首先需要把字符数组中的数据存储到容器中,然后调用容器反正功能,将其进行反转。
* 当反转完成之后,在把这些数据从新变成字符数组即可。
*/
publicclassStringBufferTest {
publicstaticvoid main(String[] args) {
char[] chs = {'a','r','1','3','n','c','d','k','m','A'};
/*
* 要把字符数组中的数据添加到字符串缓冲区容器中:
* 1、可以遍历字符数组,然后取出每个字符,调用StringBuffer的append方法,将每个字符添加进去
* 2、StringBuffer容器在创建对象的时候,构造方法可以接收一个字符串对象。
* 如果我们把字符数组变成String对象,这就可以在创建StringBuffer容器的时候,把这个字符串
* 对象直接传递给容器即可。
*/
//把字符数组变成字符串对象
String str = new String(chs);
//把这些字符串对象中字符数据在添加到StringBuffer中
StringBuffer sb = new StringBuffer(str);
//调用容器的反转功能
sb.reverse();
//在把反转后的数据变成字符串
String re_str = sb.toString();
//把反转后的字符串变成字符数组
char[] re_arr = re_str.toCharArray();
/*for(int i = 0; i < re_arr.length; i++) {
if(i!=re_arr.length-1 ){
System.out.print(re_arr[i]+",");
}else{
System.out.println(re_arr[i]);
}
}*/
System.out.println(Arrays.toString(re_arr));
}
}
3、StringBuilder类介绍
StringBuffer是线程安全的,多线程使用时,需要考虑使用StringBuffer,如果在程序中是 单线程程序,我们优先考虑使用StringBuilder。
StringBuilder类中的方法和StringBuffer相同。
StringBuffer效率低,原因在使用时需要判断同步的锁问题。
StringBuffer效率高,原因不同步。