说起字符串,开发中,经常需要对字符串进行转换操作,而Java中定义了String类以及StringBuffer、StringBuilder类来封装字符串,提供了一系列操作字符串的方法,位于java.lang包中。
1.初始化
String 变量名=字符串;
String str1 = null;//初始化为空
String str2 = "";//初始化为空字符串
String str3 = "abc";//初始化为abc,其中abc为字符串常量
null与空字符串主要区别如下:
(1)null不指向任何对象,相当于没有任何值;而“”代表一个长度为0的字符串
(2)null不分配内存空间;而“”会分配内存空间
2.String的构造方法初始化字符串对象
String 变量名 = new String(字符串);
String()
String(String value)
String(char[] value)
public static void main(String[] args) {
// 创建一个空字符串
String str1 = new String();
// 创建一个内容为abc的字符串
String str2 = new String("abc");
char[] charArray = new char[] {'A','B','C','D'};
// 创建一个内容为字符数组的字符串
String str3 = new String(charArray);
System.out.println("a"+str1+"b");
System.out.println(str2);
System.out.println(str3);
}
方法声明 | 功能描述 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现的索引 |
int lastIndex(int ch) | 返回指定字符在此字符串中最后一次出现的索引 |
int indexOf(String str) | 返回指定子字符在此字符串中第一次出现的索引 |
int lastIndexOf(String str) | 返回指定子字符在此字符串中最后一次出现的索引 |
char charAt(int index) | 返回字符串中index位置上的字符,index的取值范围是[0,字符串长度-1] |
boolean endsWith(String suffix) | 判断此字符串是否以suffix结尾 |
int length() | 返回此字符串的长度 |
boolean equals(Object anObject) | 将此字符串和指定字符串比较 |
boolean isEmpty() | 当且仅当此字符串为空时返回true |
boolean startsWith(String prefix) | 判断此字符串是否以指定的字符串开始 |
boolean contains(CharSequence cs) | 判断此字符串中是否包含指定的字符串序列 |
String toLowerCase() | 使用默认语言环境的规则将String中的所有字符都转换为小写 |
String toUpperCase() | 使用默认语言环境的规则将String中的所有字符都转换为大写 |
static String valueOf(int i) | 返回int参数的字符串表示形式 |
char[] toCharArray() | 将此字符串转换为一个字符数组 |
String replace(CharSequence oldstr,CharSequence newstr) | 返回一个新的字符串,是将此字符串中oldstr换成newstr得到的 |
String[] split(String regex) | 根据regex(regex是一个正则表达式,用来限定分割规则)将字符串分割为若干个子字符串 |
String substring(int beginIndex) | 返回一个新字符串,它包含从指定的eginIndex下标开始,直到此字符串末尾的所有字符 |
String substring(int beginIndex,int endIndex) | 返回一个新字符串,它包含从指定的beginIndex下标处开始,直到索引endIndex-1下标处的所有字符 |
String trim() | ,返回一个新字符串,它去除了原字符串首尾的 |
字符串转换操作
1.[]数组
char[] toCharArray()
String[] split(" ");
2.int 数字
使用int类型的封装类Integer中的static int parseInt(字符串)
String中的valueOf(其他类型)方法转换成String类型
public static void main(String[] args) {
// String转换成char字符数组
String str = "java";
char[] charArray = str.toCharArray();
for (int i = 0; i < charArray.length; i++) {
if (i != charArray.length - 1) {
System.out.print(charArray[i] + ",");
} else {
System.out.println(charArray[i]);
}
}
// String转换成int类型
String str1 = "123";
int n = Integer.parseInt(str1);
System.out.println("String转换成int类型:"+n);
// int类型转换成String类型的
System.out.println("int类型转换成String类型的:"+String.valueOf(12));
// 转换成大写
String s = str.toUpperCase();
System.out.println("转换成大写:"+s);
// 转换成小写
System.out.println("转换成小写:"+s.toLowerCase());
// 将输入的字符串变成字符串数组
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
// 变成String数组
String[] strings = line.split(" ");
for(String k:strings){
System.out.println(k);
}
}
字符串的替换和去空格操作
使用replace()和trim()
public static void main(String[] args) {
String s = " http:// localhost : 8080 ";
System.out.println("使用trim方法去除空格"+s.trim());
System.out.println("使用replace方法替换空格"+s.replace(" ",""));
}
字符串的判断操作
public static void main(String[] args) {
String s1 = "string";
String s2 = "str";
System.out.println("是否以字符串st开始:"+s1.startsWith("st"));
System.out.println("是否以字符串in结尾:"+s1.endsWith("in"));
System.out.println("是否包含字符串ab:"+s1.contains("ab"));
System.out.println("s1是否为空:"+s1.isEmpty());
System.out.println("判断s1和s2是否相等:"+s1.equals(s2));
}
注:在所使用的方法中,equals()方法是比较重要的,在String类中重写了父类Object中的equals()方法。
在程序中可以通过==和equals()两种方式对字符串进行比较,但这两种方式有明显的区别。equals()方法用于比较两个字符串中的字符值是否相等,==方法用于比较两个字符串对象的内存地址是否相同。对于两个字符串对象,当它们的字符值完全相同时,使用equals()判断结果会是true,但使用==判断是,结果一定为false。
StringBuffer类
在Java中,由于String类是final类型的,所以使用String定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的,如果对一个字符串进行修改,则只能创建新的字符串。于是StringBuffer类,其实StringBuilder类也可以操作字符串,和StringBuffer功能相似,而StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。通常情况下,如果创建一个内容可变的字符串对象,应该优先考虑StringBuilder类。
StringBuilder类的添加append(),插入insert(),替换replace(),删除delete()同StringBuffer
方法声明 | 功能描述 |
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 |
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 |
StringBuffer delete(int start,int end) | 将StringBuffer对象中指定范围的字符或字符串 |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进行替换 |
void setCharAt(int index,char ch) | 修改指定位置index处的字符 |
String toString() | 返回StringBuffer缓冲区中的字符串对象 |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
append()和insert()方法是最常用的,并且这两个方法有很多重载形式,都用于添加字符。append()方法始终将这些字符添加到缓冲区的末尾,而insert()方法则可以在指定的位置添加字符。delete()方法用于删除指定位置的字符,包含起始索引,不包含结束索引,setCharAt()和replace()方法用于替换指定位置的字符。
StringBuffer类和String类的区别
1.String类定义的字符是常量,一旦创建后,内容和长度都是无法改变的。StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串式,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类或者StringBuilder类
2.String类重写了Object类的equals()方法,而StringBuffer类没有重写Object类的equals()方法。
3.String类对象可以用操作符+进行连接,而StringBuffer对象之间不能。