String概述
String 类在 java.lang 包下,所以使用的时候不需要导包
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例
也就是说,Java*程序中所有的双引号字符串,都是String类的对象
String类的特点
-
字符串不可改变、它的值在创建后不可更改
-
虽然值不可改变、但是值可以被共享使用
注意:String这个类比较特殊, 打印其对象名的时候, 不会出现内存地址,而是该对象所记录的真实内容
String类常见构造方法
public String() // 创建一个空白字符串对象,不含任何内容
public String(char[] chs) // 根据字符数组的内容,来创建字符串对象
public String(String original) // 根据传入的字符串内容,来创建字符串对象
public s = "abc" // 直接赋值的方式创建字符串对象,内容就是abc
String类构造方法创建字符串对象的特点
构造方法每创建一次对象,都会在堆内存中开辟不同的对象空间,所以每new一次,都是不同的对象
直接定义字符串变量的方式特点
直接定义的字符串内容会存储到堆内存中的常量池里,字符串内容如果相同,则直接共享使用
不同的比较情况
public class Test1 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//运行结果为true
}
}
public class Test2 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);//运行结果为false
}
}
public class Test3 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3);//运行结果为false
}
}
当字符串之间使用 + 号串联(拼接)的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toString方法转换为String类型
public class Test4 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a" + "b" + "c";
System.out.println(s1 == s2);//运行结果为true
}
}
Java存在常量优化机制,在编译的时候,就会将"a"、"b"、"c"拼接为 "abc"
字符串的比较
==号的功能
==号如果比较的是基本数据类型,比较的是具体的值
==号如果比较的是引用数据类型,比较的是对象的地址值
字符串内容比较
equals(String s) : 比较字符串内容是否相同,严格区分大小写
equalsIgnoreCase(String s) : 比较字符串内容是否相同,忽略大小写
用户登录案例
public static void main(String[] args) {
String useName = "亚索";
String password = "eqeqeqfr";
for (int i = 1; i <= 3 ; i++) { // 设置3次机会
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的用户名");
String scUseName = sc.nextLine();
System.out.println("请输入您的密码");
String scPassword = sc.nextLine();
if (scUseName.equals(useName) && scPassword.equals(password)) {
System.out.println("登录成功"); // equals 比较字符串是否相同
break; // 登录成功后停止循环
} else {
if (i==3) {
System.out.println("您的机会已用完,请明天再试");
} else {
System.out.println("登录失败,你还剩下"+(3-i)+"次机会");
}
}
}
}
字符串的遍历
第一种方法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入");
String sChar = sc.nextLine();
char[] chars = sChar.toCharArray();
for (int i = 0; i < sChar.length(); i++) {
System.out.println(chars[i]);
}
}
第二种方法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入");
String sChar = sc.nextLine();
for (int i = 0; i < sChar.length(); i++) {
char ch = sChar.charAt(i);
System.out.println(ch);
}
}
}
统计字符的个数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入");
String s = sc.nextLine();
int bigCount = 0; // 定义三个计数器
int smallCount = 0;
int numCount = 0;
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) { // 遍历字符串
char c = chars[i];
if (c >= 'A' && c <= 'Z') {
bigCount++;
}else if(c >= 'a' && c <= 'z'){
smallCount++;
}else{
numCount++;
}
}
System.out.println("大写字母的个数为:"+bigCount);
System.out.println("小写字母的个数为:"+smallCount);
System.out.println("数字字母的个数为:"+numCount);
}
字符串截取(手机号屏蔽)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号:");
String tel = sc.nextLine();
String start = tel.substring(0, 3);//截取字符串前三位
String end = tel.substring(7);//截取字符串最后四位
System.out.println(start + "****" + end);
}
字符串替换(敏感词替换)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入");
String s = sc.nextLine();
String result = s.replace("TMD", "***");
System.out.println(result);
}
字符串切割
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生信息:"); // 张三 23
String stu = sc.nextLine();
String[] sArr = stu.split(",");
System.out.println(sArr[0]);
System.out.println(sArr[1]);
}
String方法小结
public boolean equals(Object anObject) // 比较字符串的内容,严格区分大小写
public boolean equalsIgnoreCase(String anotherString) // 比较字符串的内容,忽略大小写
public int length() // 返回此字符串的长度
public char charAt(int index) // 返回指定索引处的 char 值
public char[] toCharArray() // 将字符串拆分为字符数组后返回
public String substring(int beginIndex, int endIndex) // 根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾)
public String substring(int beginIndex) // 从传入的索引处截取,截取到末尾,得到新的字符串
public String replace(CharSequence target, CharSequence replacement) // 使用新值,将字符串中的旧值替换,得到新的字符串
public String[] split(String regex) // 根据传入的规则切割字符串,得到字符串数组