回顾:上节的字符串与字符之间的函数是非常有用的函数,开发中也比较常见。
目标:下面总结出绝大部分String类的常用的方法,当然在实际的开发中涉及到字符串的时候,还需要去查询相关的文档,然后进行先关函数,和逻辑安排,实现自己的算法。
- 字节和字符串之间的函数
字节主要是用来完成数据的传输或者编码的转换。
而String类提供了字符串变为字节数组的方法正是为了开发中 完成数据的传输和编码的要求而存在的,
ps:系统提供方法的实现的部分,不要求记住(当然具体的实现的算法可以查看源码)
构造方法(字节数组转换为字符串的方法):
public String(byte[] bytes){}
public String(byte[] bytes,int offset,int length){}
普通的方法:
//将字符串转换为字节的数组的普通方法
public byte[] getBytes(){}
//编码的转换的方法
public byte[] getBytes(String charsetName) throws UnsupportedEcodingException{}
- 练习:使用方法1,2和方法3完成字符串的操作,大小写和打印全部转换为大写以后的部分字符串
package function1.it.cast01;
import java.util.Scanner;
public class ByteString {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("输入字符串:要求全部由小写字母组成");
String input = sc.nextLine() ;
boolean result = isCharacter(input);
String finalResult = toUpper(result, input);
System.out.println(finalResult);
}
public static boolean isCharacter(String strs) {
boolean flag = true ;
byte[] bytes = strs.getBytes() ;
for(int x = 0;x<bytes.length;x++) {
if(!(bytes[x] >= 'a' && bytes[x] <= 'z')) {
flag = false ;
}
}
return flag ;
}
public static String toUpper(boolean cdt,String input) {
String str = "" ;
if(cdt) {
byte[] bts = input.getBytes();
for(int x = 0;x<bts.length;x++) {
bts[x] -= 32 ;
}
str = new String(bts);
}else {
str = "你输入的不是字母组成的字符串" ;
}
return str ;
}
}
//测试结果1
输入字符串:要求全部由小写字母组成
fdadf1222
你输入的不是字母组成的字符串
//测试结果2
输入字符串:要求全部由小写字母组成
dfsdf
DFSDF
上面的逻辑是:先输入字符串,然后先对输入的字符串的每一个组成的字符进行判断,只有当全部是小写的字母组成的字符串的时候,才会将判断的结果和输入的字符串当做两个参数然后使用转换成大写字符串的方法,完成要求。
ps:上述的结果仍然有提高的部分,可以增加,转换成一部分的要求提供给用户,你想转换哪一部分字符串为大写的形式,当然,随着学习的深入,我们还会使用到正则表达式的方法完成这些操作。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 字符串的比较的方法
1:字符串内容的比较
public boolean equals(String anObject){} //区分大小写的字符串内容的比较
public boolean equalsIgnoreCase(String anObject){}//不区分大小写的字符串的比较
2:比较两个字符串的大小
public int compareTo(Strigng anotherString){}
这个比较是按照字符编码的方式比较的。调用函数的字符串和括号之内的参数的字符串之间的比较。
==0表示的是要比较的字符串的内容相同,
>0表示大于结果
<0表示小于结果
练习:
package function1.it.cast01;
public class ComapreString {
public static void main(String[] args) {
String strz = "hello2" ;
String stra = "hello" ;
System.out.println(stra.equals(strz));
String strb = "Hello" ;
System.out.println(stra.equalsIgnoreCase(strb));
System.out.println(stra.compareTo(strb));
}
}
false
true
32
- 字符串的查找
字符串的查找根据返回值的类型分为两大类:
- 第一类
public boolean contains(String anotherString){}
public boolean startsWith(String anotherString){}
public boolean startsWith(String anotherString,int toffset){}
public boolean andsWith(String suffix){}
- 第二类
public int indexOf(String str){}
public int indexOf(String str,int fromIndex){}
public int lastOf(String str){}
public int lastOf(String str,int fromIndex){}
上面的二类的方法,第一类方法返回值是布尔值(不存在,或者不以指定的字符串开头或者结尾的话,返回值是false),第二类是返回的是索引值(字符串中不存在指定的字符串的时候,返回值是-1)。所以可以利用上述的两类8中方法判断字符串中是否存在指定的字符串,指定判断的条件略有不同,一个是是不是true,一个是判断是否是-1.
- 字符串的替换的操作方法
package function1.it.cast01;
public class ReplaceString {
public static void main(String[] args) {
String str = "HelloWorld" ;
str.replace("l", "_");
System.out.println(str);
System.out.println(str.replace("l", "_"));
}
}
HelloWorld
He__oWor_d
//上述结果也就说明了public String replaceAll(String oldString,String replacement){}
//返回的是一个新的字符串,原来的字符串并没有改变。
//同样的public String replaceFirst(String regex,String replacement){} 的这个函数也是函数也是返回的新的字符串,原来的字符串也没有改变
- 字符串的截取的方法
public String subString(int beginIndex){}
//从指定的索引的位置截取到末尾。原来的字符串并没有改变
public String subString(int beginIndex,int endIndex){}
//截取部分字符串,并且特点是最后面 的字符串的索引处的字符串(字符)不被截取到。
ps:注意字符串的开头是0索引开始的,传递给截取函数的参数只能是正的数字,不能是负数。
- 字符串的拆分
public String[] split(String regex){}
//按照指定的字符串的形式进行拆分,返回值是一个字符串的数组。基本上是和正则表达式可以结合使用的。
public String[] split(String regex,int linmit){} 按照指定的字符串拆分成,制定限制长度的字符串。
- ps:空字符串和空格是不一样的概念。
按照空格进行字符串的拆分,是将整个的字符串中的空格分开为各个小的字符串,保存在一个字符串的数组中。
而按照空字符串进行拆分的是将字符换中的所有的字母每一个都进行拆分。
package function1.it.cast01;
public class SplitString {
public static void main(String[] args) {
String str = "Hello World My honey!" ;
//空格拆分
String[] strArray1 = splitEmpty(str) ;
print(strArray1);
//空的字符串的拆分
String[] strArray2 = split(str);
print(strArray2);
}
public static String[] splitEmpty(String sourceString) {
//按照空格进行拆分
return sourceString.split(" ") ;
}
public static String[] split(String sourceString) {
return sourceString.split("");
}
public static void print(String[] temp) {
//遍历数组中的每一元素,以查看拆分的特点和结果。
for(int x = 0;x<temp.length;x++) {
System.out.print(temp[x]+",");
}
System.out.println();
}
}
Hello,World,My,honey!,
H,e,l,l,o, ,W,o,r,l,d, ,M,y, ,h,o,n,e,y,!,
通过上面代码我们也学会了,怎么样去拆分一个字符串,获得的是字符串中的每一个的字符组成的字符串数组。sourceString.split("");
- 按照字符串的拆分格式,还有长度限制的拆分。
package function1.it.cast01;
public class SplitString {
public static void main(String[] args) {
String str = "Hello World My honey!" ;
//空格拆分
String[] strArray1 = splitEmpty(str) ;
print(strArray1);
//空的字符串的拆分
String[] strArray2 = split(str);
print(strArray2);
//长度限制的拆分
String[] strArray3 = split(str,3);
print(strArray3);
}
public static String[] splitEmpty(String sourceString) {
//按照空格进行拆分
return sourceString.split(" ") ;
}
public static String[] split(String sourceString) {
return sourceString.split("");
}
public static String[] split(String sourceString,int limit) {
return sourceString.split(" ", limit) ;
}
public static void print(String[] temp) {
//遍历数组中的每一元素,以查看拆分的特点和结果。
for(int x = 0;x<temp.length;x++) {
System.out.print(temp[x]+",");
}
System.out.println();
}
}
Hello,World,My,honey!,
H,e,l,l,o, ,W,o,r,l,d, ,M,y, ,h,o,n,e,y,!,
Hello,World,My honey!,
- java中转义字符的使用,避免正则表达式的影响。
要求拆分IP地址192.168.1.1。我们要按照每一个小的.进行拆分,要求使用的格式是: \\.
\\ 表示的是一个\,所以\\.表示的是\.表示按照 . 进行拆分
package function1.it.cast01;
public class SplitString {
public static void main(String[] args) {
String str = "Hello World My honey!" ;
//空格拆分
String[] strArray1 = splitEmpty(str) ;
print(strArray1);
//空的字符串的拆分
String[] strArray2 = split(str);
print(strArray2);
//长度限制的拆分
String[] strArray3 = split(str,3);
print(strArray3);
//转义字符的使用避免正则表达式的影响
String[] strArray4 = splitZ("192.168.1.1");
print(strArray4);
}
public static String[] splitEmpty(String sourceString) {
//按照空格进行拆分
return sourceString.split(" ") ;
}
public static String[] split(String sourceString) {
return sourceString.split("");
}
public static String[] split(String sourceString,int limit) {
return sourceString.split(" ", limit) ;
}
public static String[] splitZ(String sourceString) {
return sourceString.split("\\.");
}
public static void print(String[] temp) {
//遍历数组中的每一元素,以查看拆分的特点和结果。
for(int x = 0;x<temp.length;x++) {
System.out.print(temp[x]+",");
}
System.out.println();
}
}
Hello,World,My,honey!,
H,e,l,l,o, ,W,o,r,l,d, ,M,y, ,h,o,n,e,y,!,
Hello,World,My honey!,
192,168,1,1,
- 复杂的拆分要求:拆分"张三:120|李四:100|王五:110" ,
拆分成:
张三:120
李四:100
王五:110
public static void complexSplit(String sourceString){
String[] str = sourceString.split("\\|");
for(int x = 0;x<str.length;x++) {
String[] str2 = str[x].split(":") ;
for(int y =0;y<str2.length;y++) {
if(y==1) {
System.out.print(":"+str2[y]);
}else {
System.out.print(str2[y]);
}
}
System.out.println();
}
complexSplit("张三:120|李四:100|王五:110");
张三:120
李四:100
王五:110
总结:上面的这种做法是不好的,因为每一次进去第一个循环都会创建一个新的数组,在次进入到数组的时候,原来的数组就不得指向发生了改变,并且,一般函数里面是不会允许做输出的方法的,
- 改进应该做成二维的数组形式
- 其他的方法
在使用其他的方法之前,我们一定要明白的是String类对象是一个引用的数据类型,不管是直接赋值的方式,还是否早方法的方式实例化的,它都是可以调用String类中的方法的。
public String conact(String str){}//字符串的连接方法,和"+"类似。
public String toLowerCase(){}//转小写
public String toUpperCase(){}//转大写
public String trim(){}//去掉两边的空格,中间的空格不管。
public int length(){}//取得字符串的长度
public String intern(){}//手工的将String类对象入池
public boolean isEmpty(){}//判断是否是空的字符串,不是null,而是""。
ps:
1:concat方法,字符串的连接的顺序是调用字符串在前,被连接部分在方法中参数中。
2:可以使用replaceAll(" ","");将所有的空格去除掉。
3:length()和数组的length属性要区分开。
4:大小写转换的方法对字符串中非字母的部分不做更改。
5:上面的函数中返回值是String类对象的,返回的是是一个新的字符串,原来的字符串并没有改变。所以要想将连接的,去掉两边空格的,转成大写和小写的字符串输出,就要使用直接输出,或者显示构造一个对象引用指向这个新的字符串,然后进行输出操作。