# String 类
# String 类的特点
String 类在 java.lang 包下,这个包使用的时候不需要导包, String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例,也就是说,java 程序中所有的双引号字符串,都是 String 类的对象,字符串值不可变,它的值保存在内存的常量池中,在内存中创建后不能被更改
以“”方式给出的字符串,只要字符串相同,无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串常量池中维护。
# String 的创建
创建字符串的方式有两种:
直接使用“”创建 : 双引号方式创建“hello”字符串首先jvm会检查堆内存里面的字符串常量池是否有"hello"字符串,如果没有会在字符串常量池中去创建一个“hello”字符串对象,如果已经存在则不会再创建,直接返回字符串常量池的内存地址。
new String("")创建: 首先还是会在字符串常量池中检查是否有hello的字符串,如果没有在字符串常量池中创建对应的字符串对象。
然后由于是new String,这时候还是会在堆内存中创建一个新的字符串对象,并且把字符串常量池中的字符串内容拷贝过去,然后返回新创建的
字符串对象的内存地址。
public class Demo2 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
//注意: 如果是引用类型使用==比较的都是两个变量存储的内存地址是否一致。
System.out.println("str1与str2是同一个对象吗?"+(str1==str2));//true true
System.out.println("str1与str3是同一个对象吗?"+(str1==str3)); //false false
System.out.println("str3与str4是同一个对象吗?"+(str3==str4)); // false false
}
}
# String 对象比较
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
字符串是引用类型,它使用 == 做比较时比较的是地址值,如果想要比较字符串的内容是否相同,需要使用方法:public boolean equals(Object anObject):将此字符串与指定对象进行比较
示例:
/*
String类
*/
public class Demo1 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
System.out.println("==比较的结果:"+(str1==str2)); //比较的是内存地址
System.out.println("equals比较的结果:"+(str1.equals(str2))); //比较的是字符串内容是否相等
}
}
# String 遍历
可以使用遍历来访问字符串的每一个字符 字符串变量需要用到以下两个方法:
- public char charAt(int index):返回指定索引处的char值(字符串的索引也是从0开始的)
- public int length(): 返回此字符串的长度
示例代码:
/*
字符串对象常用的方法:
charAt(int index) 指定字符串的索引值,然后返回指定的字符.
length() 返回字符串的字符个数
*/
public class Demo1 {
public static void main(String[] args) {
String str = "abcdefg";
//指定字符串的索引值,然后返回指定的字符.
char ch = str.charAt(5);
System.out.println("索引值2号字符:"+ch); //f
int length = str.length();
System.out.println("字符个数:"+length);
//遍历该字符串的每一个字符
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
}
}
# 对比对比数组的遍历和String的遍历
# String类的其他方法
- String substring(int begin, int end) 从 begin 索引位置开始截取,截取到 end 索引位置,得到新字符串并返回(包含头,不包含尾)
- String substring(int begin): 从传入的索引位置处开始,一直截取到末尾,得到新的字符串并返回
- String replace(CharSequence target, CharSequence replacement): 将当前字符串中的target (旧值 )内容,使用replacement (新值) 进行替换,返回新的字符串
示例代码:
public class Demo1 {
public static void main(String[] args) {
String str = "hello java";
//截取字符串,根据开始的索引值与结束的索引值截取字符串 包头不包尾
String newStr = str.substring(0, 5);
System.out.println("截取到的内容:"+newStr); //hello
String newStr2 = str.substring(6);//指定开始索引值截取字符串
System.out.println("新截取到的内容:"+newStr2); //java
String str2 = "我爱您";
//把“爱”替换成"不爱", 替换完毕之后会返回最新的内容
String newStr3 = str2.replace("爱", "不爱");
System.out.println("替换后的内容:"+ newStr3);
}
}
# 案例
# 模拟用户登陆
已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
import java.util.Scanner;
/*
需求:
已知用户名和密码,请用程序实现模拟用户登录。
总共给三次机会,登录之后,给出相应的提示
*/
public class Demo4 {
public static void main(String[] args) {
// 1. 已知用户名和密码,定义两个字符串表示即可
String username="admin";
String password="123";
// 2. 键盘录入要登录的用户名和密码,用 Scanner 实现
Scanner sc = new Scanner(System.in);
//定义一个变量做登录成功标记
boolean flag = false; //false代表登录失败,true登录成功
for (int i = 0; i <3 ; i++) {
System.out.println("请输入用户名:");
String inputName= sc.next();
System.out.println("请输入密码:");
String inputPass = sc.next();
// 3. 拿键盘录入的用户名、密码和已知的用户名、密码进行比较 字符串的内容比较,用equals() 方法实现
if(username.equals(inputName) && password.equals(inputPass)){
System.out.println("登录成功");
flag = true;
break;
}else{
System.out.println("用户名或者密码错误,请重新输入");
}
}
if(flag==false) {
System.out.println("登录失败");
}
}
}
# 统计字符
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;
/*
*/
public class Case1 {
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入一串字符串:");
String line = sc.next();
// 2. 要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
int bigCount = 0;
int smallCount = 0;
int numCount = 0;
// 3. 遍历字符串,得到每一个字符
for (int i = 0; i <line.length() ; i++) {
//获取到字符串
char ch = line.charAt(i);
if(ch>='A' && ch<='Z'){
bigCount++;
}else if(ch>='a' && ch<='z'){
smallCount++;
}else if(ch>='0' && ch<='9'){
numCount++;
}
}
// 4. 判断该字符属于哪种类型,然后对应类型的统计变量+1
// 5. 输出三种类型的字符个数
System.out.println("大写个数:"+bigCount);
System.out.println("小写个数:"+smallCount);
System.out.println("数字个数:"+numCount);
}
}
# 手机号替换
以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽效果:156****1234
import java.util.Scanner;
/*
需求:
以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽
效果:156****1234
*/
public class Demo5 {
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的手机号:");
String phone = sc.next(); // 180 0011 0011
// 2. 截取字符串前三位
String start = phone.substring(0,3); //180
// 3. 截取字符串后四位
String end = phone.substring(7); //0011
// 4. 将截取后的两个字符串,中间加上****进行拼接
String newPhone = start+"****"+end;
// 5. 输出结果
System.out.println(newPhone);
}
}
# 替换脏话
键盘录入一个 字符串,如果字符串中包含(TMD),则使用***替换
import java.util.Scanner;
/*
需求:
键盘录入一个 字符串,如果字符串中包含(TMD),则使用***替换
*/
public class Demo6 {
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入一句脏话:");
String line = sc.next();
// 2. 使用replace()方法替换敏感词
String newLine = line.replace("TMD","****");
// 3. 输出结果
System.out.println("替换后的内容:"+newLine);
}
}
# 面试题目


“”的字符串之间进行拼接,在编译的时候,就会将"ab" + "c" 拼接为 "abc"。变量字符串进行拼接,代码内部会自动使用 new String 创建新的字符串。
# StringBuilder类
# StringBuilder的概述
StringBuilder 是一个可变的字符串类(是一个字符串的容器)作用:提高字符串的操作效率
# StringBuilder的构造器

/*
StringBuilder的构造方法
StringBuilder() 创建一个空白的字符串
StringBuilder(String str) 根据字符串的内容创建一个可变的字符串
StringBuilder存在的意义: 后期如果一个字符串经常需要发生修改,建议你们使用StringBuilder,而不是使用String类。Stirng类每修改一次都会有一个
新的对象。StringBuilder修改多次还是同一个对象。
*/
public class Demo1 {
public static void main(String[] args) {
//1.创建一个空白的字符串
StringBuilder sb = new StringBuilder();
System.out.println(sb);
StringBuilder sb2= new StringBuilder("hello");
System.out.println(sb2);
}
}
# 常用的方法

public class Demo2 {
public static void main(String[] args) {
//1. 创建一个可变的字符串对象
StringBuilder sb = new StringBuilder();
//2. 添加内容
sb.append("hello");
//3.得到里面的内容
String content = sb.toString();
System.out.println("字符串的内容:"+content);
//4 内容反转
StringBuilder reverse = sb.reverse();
System.out.println("翻转后的内容:"+reverse.toString());
//5. 获取字符串的个数
System.out.println("字符串的字符个数:"+ content.length());
}
}
# String与StringBuilder的区别
# 案例
键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是对称字符串:123321、111非对称字符串:123123
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String line = sc.next();
// 2. 将字符串转成StringBuilder类型
StringBuilder sb = new StringBuilder(line);
// 3. 对StringBuilder进行反转
sb.reverse();
// 4. 把反转后的StringBuilder变回成String字符串
String reverseLine = sb.toString();
// 5. 使用反转后的字符串,和原字符串进行比对
if (reverseLine.equals(line)) {
System.out.println("是对称字符串");
}else{
System.out.println("不是对称字符串");
}
// 6. 如果相同,则输出是对称字符串,反之输出不是对称字符串
}
}
# 快捷建
s.charAt(1).var 可以自动加 char c
