String类型(重中之重)

  • String类的equals方法

    boolean equals(Object anObject)
    用于比较字符串内容是否相等并返回.

    boolean equalsIgnoreCase(String anotherString)
    用于比较字符串内容是否相等并返回,不考虑大小写,如:'A’和’a’是相等.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.Scanner;

public class StringEqualsTest {

public static void main(String[] args) {

// tab键可以实现向右缩进, 使用shift+tab键可以实现向左撤回
Scanner sc = new Scanner(System.in);
for(int i = 3; i > 0; i--) {
// 1.提示用户输入用户名和密码信息并使用变量记录
System.out.println("请输入用户名和密码信息:");
String userName = sc.next();
String passWord = sc.next();

// 2.判断用户输入的内容是否为"admin"和"123456"并给出对应的提示
if("admin".equalsIgnoreCase(userName) && "123456".equals(passWord)) {
System.out.println("登录成功,欢迎使用!");
break;
} else {
// 3.当用户输入3次依然错误时给出对应的提示
if(1 == i) {
System.out.println("账户已冻结,请联系客服人员!");
} else {
System.out.println("用户名或密码错误,还有"
+ (i-1) + "次机会!");
}
}
}
}
}
  • String类的indexOf方法

    int indexOf(String str)
    在字符串中检索str,返回第一出现的位置,如果找不到则返回-1.

    int indexOf(String str,int formIndex)
    类似indexOf(String),但是是从字符串的formIndex位置开始检索.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class StringIndexTest {

public static void main(String[] args) {

// 1.构造String类型的对象
String str1 = new String("Good Good Study, Day Day Up!");
// 2.调用成员方法查找指定的字符串内容
int pos = str1.indexOf("good");
System.out.println("pos = " + pos); // -1 查找失败
pos = str1.indexOf("Good");
System.out.println("pos = " + pos); // 0
// 表示从下标0开始的索引位置查找Good
pos = str1.indexOf("Good", 0);
System.out.println("pos = " + pos); // 0
pos = str1.indexOf("Good", 1);
System.out.println("pos = " + pos); // 5
System.out.println("-----------------------------------");

// 练习:编写通用代码实现将字符串str1中所有"Day"出现的位置找到并打印出来
// 查找"Day"第一次出现的索引位置
pos = str1.indexOf("Day");
while(-1 != pos) {
System.out.println("pos = " + pos); // 17 21
// 继续查找"Day"下一次出现的索引位置
pos = str1.indexOf("Day", pos+1);
}
System.out.println("-----------------------------------");

// 查找"Day"第一次出现的索引位置
pos = 0;
while((pos = str1.indexOf("Day", pos)) != -1) {
System.out.println("pos = " + pos); // 17 21
// 继续查找"Day"下一次出现的索引位置
pos += "Day".length();
}
}
}
  • String类的subString方法

    String subString(int beginIndex,int endIndex)
    返回字符串中从下标beginIndex(包括)开始到endIndex(不包括)结束的子字符串.

    String subString(int beginIndex)
    返回字符串中从下标benginIndex(包括)开始到字符串结尾的子字符串.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class StringSubTest {

public static void main(String[] args) {
// 1.构造String类型的对象并初始化
String str1 = new String("Happy Wife, Happy Life!");
// 2.调用成员方法实现字符串中内容的获取
// 表示从下标3开始一直到10之间的所有内容取出来
String str2 = str1.substring(3, 10);
System.out.println("str2 = " + str2); // py Wife
String str3 = str1.substring(3);
System.out.println("str3 = " + str3); // py Wife, Happy Life!
}
}

StringBuilder类和StringBuffer类

  • 基本概念

    由于String类型描述的字符串内容是个常量不可更改,当程序中出现大量类似的字符串时都需要单独存储,从而造成内存空间的浪费。

    为了解决上述问题,可以使用StringBuilder类取代String类来描述字符串内容,该类型描述的字符串内容是可以改变的。

    其中StringBuffer类是从jdk1.0开始存在,支持线程安全,因此访问效率比较低;

    其中StringBuilder类是从jdk1.5开始存在,不支持线程安全,因此访问效率比较高;

  • StringBuilder类的构造方法

    public StringBuilder()

    public StringBuilder(String Str)

    构造方法StringBuilder()将创建不含任何字符序列的StringBuilder对象,而StringBuilder(String str)将创建包含参数字符串str的StringBuilder对象。

  • StringBuilder类的常用方法

    StringBuilder insert(int offset,String str) - 插入字符串

    StringBuilder append(String str) - 追加字符串

    StringBuilder delete(int start,int end) - 删除字符串

    StringBuilder replace(int start,int end,String str) - 替换字符串

    StringBuilder reverse() - 字符串反转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class StringBuilderTest {

public static void main(String[] args) {
// 1.构造StringBuilder类型的对象
StringBuilder sb1 = new StringBuilder("hello");
System.out.println("sb1 = " + sb1); // hello

// 2.打印字符串对象的容量和长度
System.out.println("当前字符串对象的容量是:" + sb1.capacity()); //21
System.out.println("当前字符串对象的长度是:" + sb1.length()); // 5
System.out.println("--------------------------------------------");

String str1 = new String("hello");
String str2 = str1.toUpperCase();
System.out.println("str2 = " + str2); // HELLO
System.out.println("str1 = " + str1); // hello

// 3.实现向字符串中指定索引位置插入指定的字符串内容
// 向下标为0的位置插入字符串"abcd" 插入开头位置
StringBuilder sb2 = sb1.insert(0, "abcd");
System.out.println("sb2 = " + sb2); // abcdhello
System.out.println("sb1 = " + sb1); // abcdhello
// 向中间位置插入
sb1.insert(4, "1234");
System.out.println("sb1 = " + sb1); // abcd1234hello
// 向末尾位置插入
sb1.insert(sb1.length(), "ABCD");
System.out.println("sb1 = " + sb1); // abcd1234helloABCD

System.out.println("--------------------------------------------");
// 4.实现向字符串的末尾追加字符串内容
sb1.append("world");
System.out.println("sb1 = " + sb1); // abcd1234helloABCDworld
// 当字符串对象中的字符超过初始容量时,该对象会自动扩容
// 具体扩容算法需要查看源码
System.out.println("当前字符串对象的容量是:" + sb1.capacity()); //44
System.out.println("当前字符串对象的长度是:" + sb1.length()); // 22

System.out.println("--------------------------------------------");
// 5.实现字符串内容的删除操作,从下标8开始一直到下标13,但取不到13
sb1.delete(8, 13);
System.out.println("sb1 = " + sb1); // abcd1234ABCDworld
sb1.delete(0, sb1.length());
System.out.println("全删除后的结果是:" + sb1); // 啥也没有
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class StringBuilderModifyTest {

public static void main(String[] args) {

// 1.构造StringBuilder类型的对象并初始化
StringBuilder sb1 = new StringBuilder("GoodMorning!");

// 2.实现查找和修改的功能并打印
int pos = sb1.indexOf("Good");
System.out.println("pos = " + pos); // 0
System.out.println("-------------------------------");

sb1.replace(4, 9, "12345");
System.out.println("sb1 = " + sb1); // Good12345ng!
System.out.println("-------------------------------");

// 3.实现反转的过程并打印
sb1.reverse();
System.out.println("反转后的结果是:" + sb1); // !gn54321dooG
// 思考:既然这些方法的返回值与当前对象的数值一样,为啥还要设计返回值呢?
// 解析:为了连续调用
//sb1.reverse().append("1").reverse().insert(0, "2");
System.out.println("-------------------------------");

// 4.实现String类型和StringBuilder类型之间的转换
// 实现StringBuilder类型向String类型的转换
String str1 = sb1.toString();
// 实现String类型向StringBuilder类型的转换
StringBuilder sb2 = new StringBuilder(str1);
}
}

字符串加字符逗号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 1.构造StringBuilder类型的对象
StringBuilder sb1 = new StringBuilder("ABCD");

// 2.将逗号插入到字符串中合理的位置上
// 实现方式一:直接插入逗号
/*
sb1.insert(1, ","); // A,BCD
sb1.insert(3, ","); // A,B,CD
sb1.insert(5, ","); // A,B,C,D
*/
/*
for(int i = 1; i <= 5; i += 2) {
sb1.insert(i, ",");
}
*/
// 实现方式二:将字符串中的每个字符取出来,然后使用逗号进行拼接
/*
StringBuilder sb2 = new StringBuilder();
for(int i = 0; i < sb1.length(); i++) {
// 将第一个字符串中的每个字符取出放入第二个字符串并跟随逗号
sb2.append(sb1.charAt(i)).append(",");
}
// 将最后一个多余的逗号删除
sb2.deleteCharAt(sb2.length()-1);
*/
// 实现方式三:将字符串中的每个字符取出来,
// 当取出最后一个字符时不要追加逗号
StringBuilder sb2 = new StringBuilder();
for(int i = 0; i < sb1.length(); i++) {
if(sb1.length()-1 == i) {
sb2.append(sb1.charAt(i));
} else {
// 将第一个字符串中的每个字符取出放入第二个字符串并跟随逗号
sb2.append(sb1.charAt(i)).append(",");
}
}