概述
String的特性
- String类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现
- String是一个final类,代表不可变的字符序列
- 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改
- String对象的字符内容是存储在一个字符数组value[]中的
package String类的使用;
import org.junit.Test;
/**
* @BelongsProject: untitled
* @BelongsPackage: String类的使用
* @Author: mcc
* @CreateTime: 2020-10-22 07:57
* @Description: 不可变性的理解
*/
public class StringTest {
@Test
public void test1() {
//当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
String s1 = "abc";//字面量的定义方式
String s2 = "abc";
System.out.println(s1 == s2);//比较s1与s2的地址值
s2 = "hello";
System.out.println(s1 == s2);
System.out.println("s1:" + s1);
System.out.println("s2:" + s2);
System.out.println("************************");
//当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
String s3 = "abc";
s3 += "def";
System.out.println("s3:" + s3);
System.out.println("************************");
//当调用String的replace方法修改字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println("s4:" + s4);
System.out.println("s5:" + s5);
System.out.println(s4 == s5);
}
}
1.构造方法
方法 | 功能 |
---|---|
String(String original) | 把字符串数据封装成字符串对象 |
String(char[] value) | 把字符数组的数据封装成字符串对象 |
String(char[] value, int index, int count) | 把字符数组中的一部分数据封装成字符串对象 |
//常用的4中封装成(创建)字符串对象方法
public class StringDemo {
public static void main(String[] args) {
//方法1:String(String original):把字符串数据封装成字符串对象
String str1 = new String("hello");
System.out.println("str1:"+str1);
System.out.println("----------");
//方法2:String(char[] value):把字符数组的数据封装成字符串对象
char[] chs = {'h','e','l','l','o'};
String str2 = new String(chs);
System.out.println("str2:"+str2);
System.out.println("----------");
//方法3:String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象
String str3 = new String(chs,1,3);
System.out.println("str3:"+str3);
System.out.println("----------");
//方法4:"abc"是String类的一个实例,或者成为String类的一个对象
String str4 = "hello";
System.out.println("str4:"+str4);
}
}
2.创建字符串两种方式的区别
public class Test1 {
public static void main(String[] args) {
//构造方法创建
String s1 = new String("hello");
//直接赋值
String s2 = "hello";
String s3 = "hello";
System.out.println("s1==s2: " + (s1 == s2));//false
System.out.println("s1==s3: " + (s1 == s3));//false
System.out.println("s2==s3: " + (s2 == s3));//true
}
}
内存分配:
结论:
- 当通过“=”赋值时,JVM检查字符串常量池中是否存在相同内容的字符串对象的引用,如果存在则将这个引用返回;否则创建新的字符串对象,然后将这个引用存入字符串常量池,并返回该引用
- 当使用了new来构造字符串对象时,不管字符串常量池中有没有相同内容的对象的引用,新的字符串对象都会创建
3.String类的功能
3.1判断功能
方法 | 功能 |
---|---|
boolean equals(Object obj) | 比较字符串的内容是否相同 |
boolean equalsIgnoreCase(String str) | 比较字符串的内容是否相同,忽略大小写 |
boolean startsWith(String str) | 判断字符串对象是否以指定的str开头 |
boolean endsWith(String str) | 判断字符串对象是否以指定的str结尾 |
public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = "Hello";
//boolean equals(Object obj)
//boolean equalsIgnoreCase(String str)
System.out.println("str1==str2:"+str1.equals(str2));
System.out.println("str2==str3:"+str2.equals(str3));
System.out.println("str2==str3:"+str2.equalsIgnoreCase(str3));
//boolean startsWith(String str)
System.out.println(str1.startsWith("h"));
//boolean endsWith(String str)
System.out.println(str1.endsWith("oo"));
}
}
案例:模拟用户登录
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//定义两个字符串对象,用于存储已经存在的用户名和密码
String username = "admin";
String password = "admin";
//给三次机会用for循环实现
for (int i = 0; i < 3; i++) {
//键盘录入用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
//拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
if (name.equals(username) && pwd.equals(password)) {
System.out.println("登录成功!");
break;
} else {
if (i == 3) {
System.out.println("你的用户名和密码已被锁定,请联系管理员!");
} else {
System.out.println("登录失败,你还有" + (2 - i) + "次机会");
}
}
}
}
}
3.2获取功能
方法 | 功能 |
---|---|
int length() | 获取字符串的长度,其实也就是字符个数 |
char charAt(int index) | 获取指定索引处的字符 |
int indexOf(String str) | 获取str在字符串对象中第一次出现的索引 |
String substring(int start) | 从start开始截取字符串 |
String substring(int start,int end) | 从start开始,到end结束截取字符串。包括start,不包括end |
案例:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//键盘录入一个字符串数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串数据:");
String str = sc.nextLine();
//定义三个统计变量,初始化值都是0
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
//遍历字符串,得到每一个字符
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
//拿字符进行判断
if (ch >= 'A' && ch < 'Z') {
bigCount++;
} else if (ch >= 'a' && ch <= 'z') {
smallCount++;
} else if (ch >= '0' && ch <= '9') {
numberCount++;
}
}
//输出结果
System.out.println("大写字符:" + bigCount);
System.out.println("小写字符:" + smallCount);
System.out.println("数字字符:" + numberCount);
}
}
3.3转换功能
方法 | 功能 |
---|---|
char[] toCharArray() | 把字符串转换为字符数组 |
String toLowerCase() | 把字符串转换为小写字符串 |
String toUpperCase() | 把字符串转换为大写字符串 |
案例:键盘录入一个字符串,把该字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
public class Test {
public static void main(String[] args) {
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
//截取首字符
String s1 = s.substring(0, 1);
//截取其余字符
String s2 = s.substring(1);
//首字符大写加上其余字符小写
String s3 = s1.toUpperCase() + s2.toLowerCase();
//输出
System.out.println(s3);
}
}
3.4其他功能
方法 | 功能 |
---|---|
String trim() | 去除字符串两端空格 |
String[] split(String str) | 按照指定符号分割字符串 |
案例1:方法实现把数组中的元素按照指定的格式拼接成一个字符串
public class Test {
public static void main(String[] args) {
//定义数组
int[] arr = {1, 2, 3};
//写方法实现把数组中的元素按照指定的格式拼接成一个字符串
String s = Test.arrayToString(arr);
System.out.println(s);
}
public static String arrayToString(int[] arr) {
String s = "";
s += "[";
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
s += arr[i];
} else {
s += arr[i];
s += ", ";
}
}
s += "]";
return s;
}
}
案例2:字符串反转
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
//String ss = Test.reserve1(s);
String ss = Test.reserve2(s);
System.out.println(ss);
}
/**
* 把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
*
* @param s:原字符串
* @return:返回逆序后的字符串
*/
private static String reserve2(String s) {
//将字符串转为字符数组
char[] chs = s.toCharArray();
//将数组逆序
for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {
char tmp = chs[start];
chs[start] = chs[end];
chs[end] = tmp;
}
//将数组转为字符串
String ss = new String(chs);
return ss;
}
/**
* 方法一:把字符串倒着打印
*
* @param s:原字符串
* @return:返回逆序后的字符串
*/
private static String reserve1(String s) {
String ss = "";
for (int i = s.length() - 1; i >= 0; i--) {
ss += s.charAt(i);
}
return ss;
}
}