# String 类

# String 类的特点

String 类在 java.lang 包下,这个包使用的时候不需要导包, String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例,也就是说,java 程序中所有的双引号字符串,都是 String 类的对象,字符串值不可变,它的值保存在内存的常量池中,在内存中创建后不能被更改

以“”方式给出的字符串,只要字符串相同,无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串常量池中维护。

如果不存在:创建;如果存在:不会重新创建,而是直接复用
1646145890272.png

# String 的创建

创建字符串的方式有两种:

  1. 直接使用“”创建 : 双引号方式创建“hello”字符串首先jvm会检查堆内存里面的字符串常量池是否有"hello"字符串,如果没有会在字符串常量池中去创建一个“hello”字符串对象,如果已经存在则不会再创建,直接返回字符串常量池的内存地址。

  2. 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的遍历

回顾数组的遍历方式
1646211265185.png
字符串遍历的代码
1646211293124.png

# 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);
    }
}

# 面试题目

1646146111256.png
1646146120587.png
“”的字符串之间进行拼接,在编译的时候,就会将"ab" + "c" 拼接为 "abc"。变量字符串进行拼接,代码内部会自动使用 new String 创建新的字符串。

# StringBuilder类

# StringBuilder的概述

StringBuilder 是一个可变的字符串类(是一个字符串的容器)作用:提高字符串的操作效率

# StringBuilder的构造器

1646218496126.png

/*
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);
    }
}

# 常用的方法

1646218709518.png

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的区别

1646219166951.png

# 案例

键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是对称字符串: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