String常用类

String类

String是定义在java.lang包的一个类,(lang包的类)使用时不用导包。
所有字符串文字如"abc"、"请输入"都是String类的对象
字符串不可变,它们的值在创建后不能被更改。

String name1="a";
String name2="b";
System.out.println(name1+name2);
//有3个字符串,name1、name2、name1+name2
String name3="c";
String name3="d";
//有2个字符串

创建String对象的两种方法

  • 直接赋值
String name="name";
  • new
public static void main(String[] args) {
        //1.直接赋值
        String s1 = "abc";
        System.out.println("s1=" + s1);

        //2.1 获取一个空白字符串对象
        String s2 = new String();
        System.out.println("s2="+s2);//" "

        //2.2 根据传入的字符串创建字符串对象(不推荐)
        String s3 = new String("123");
        System.out.println("s3="+s3);

        //2.3 根据传入的字符数组创建一个字符串对象
        char[] chs = {'a', 'b', 'c'};
        String s4 = new String(chs);
        System.out.println("s4="+s4);
        /*应用场景:可以通过改变数组,实现改变字符串的内容
        chs:{'a', 'b', 'c'}→{'q', 'b', 'c'},s4:abc→qbc
        */

        //2.4 根据传入的字节数组创建一个字符串对象
        byte[] bytes = {97,98,99};
        String s5=new String(bytes);
        System.out.println("s5="+s5);
        //应用场景:在网络中传输的数据一般是字节信息,需要用到此构造
    }

内存分析

  • 直接赋值的,会先在字符串常量池中找有没有对应的字符串,如"abc"
    如果没有就添加进常量池中,再将对应的地址如0x0011赋值给s1。如果有就直接将对应的地址赋值给对应的String对象,如s2。
  • new出来的,每个new出来的对象会单独在堆中开辟一个小空间来存放字符串,这样尽管字符串内容相同,其对应的地址不同。

==号

==比较的是什么?

字符串比较

只要比较字符串的内容就必须使用String里面的方法
equals方法

public static void main(String[] args) {
        String s1=new String("abc");
        String s2="abc";
        System.out.println(s1==s2);
        boolean result2=s1.equals(s2);
        System.out.println(result2);
    }


不区分大小写,equalsIgnoreCase方法

public static void main(String[] args) {
        String s1=new String("abc");
        String s2="Abc";
        boolean result=s1.equalsIgnoreCase(s2);
        System.out.println(result);
    }



因为scanner.next()是new出来的

模拟用户登录

package StringTest;

import java.util.Scanner;

public class t3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String rightUser = "Benson";
        String rightKey = "123456";
        for (int i = 0; i < 3; i++) {
            System.out.print("请输入用户名:");
            String user = scanner.next();
            System.out.print("请输入密码:");
            String key = scanner.next();
            if (rightUser.equals(user) && rightKey.equals(key)) {
                System.out.println("登录成功");
                break;
            } else {
                System.out.println("密码错误或用户不存在");
                if (i <= 1) {
                    System.out.println("剩余次数:" + (2 - i) + "次");
                } else {
                    System.out.println("密码错误过多,请24小时后再次登录");
                }
            }
        }
        scanner.close();
    }
}

字符串索引

charAt()方法

public static void main(String[] args) {
        String s1="abc";
        System.out.println(s1.charAt(0));//a
}

字符串索引与数组下标类似,字符串abc的0索引是a,1索引是b,2索引是c

统计字符串的大小写字母和数字的个数

package StringTest;

import java.util.Scanner;

public class t4 {
    public static void main(String[] args) {
        //统计字符串的大小写字母和数字的个数
        int bigCount = 0;
        int smallCount = 0;
        int numCount = 0;
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入字符串:");
        String s1 = scanner.next();
        for (int i = 0; i < s1.length(); i++) {
            //i表示每个字符串的索引
            char c = s1.charAt(i);
            //char类型的变量在参与计算时会自动提升为int类型
            if (c >= 'a' && c <= 'z') {
                smallCount++;
            } else if (c >= 'A' && c <= 'Z') {
                bigCount++;
            } else if (c >= '0' && c <= '9') {//要带上''
                numCount++;
            }
        }
        System.out.println("大写的字母有" + bigCount + "个");
        System.out.println("小写的字母有" + smallCount + "个");
        System.out.println("数字有" + numCount + "个");
    }
}

{,,}变成[,,]

package StringTest;

public class t5 {
    public static void main(String[] args) {
        int[] array1={1,2,3};
        String s1=arrToString(array1);
        System.out.println(s1);
    }
    public static String arrToString(int[] arr){
        if (arr==null){
            return "";
        }
        if (arr.length==0){
            return "[]";
        }
        String result="[";
        for (int i=0;i<arr.length;i++){
            if (i==arr.length-1){
                result=result+arr[i];//字符串拼接
            }else{
                result=result+arr[i]+",";
            }
        }
        result=result+"]";
        return result;
    }
}

字符串反转

package StringTest;

import java.util.Scanner;

public class t6 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入字符串:");
        String s1=scanner.next();
        String a=reverse(s1);
        System.out.println(a);
    }
    public static String reverse(String str){
        String result="";
        for (int i=str.length()-1;i>=0;i--){
            char c=str.charAt(i);
            result=result+c;
        }
        return result;
    }
}

手机号屏蔽 substring方法

package StringTest;

import java.util.Scanner;

public class t7 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入电话号码:");
        String phoneNumber=scanner.next();
        //截取前三位
        String font=phoneNumber.substring(0,3);
        //截取后四位
        String end=phoneNumber.substring(7);
        String result=font+"****"+end;
        System.out.println(result);
    }
}

敏感词屏蔽 replace方法

package StringTest;

public class t8 {
    public static void main(String[] args) {
        String s1 = "cnm,你给我去spa!";
        String s2 = s1.replace("cnm", "**");
        System.out.println(s2);

        //现实中是通过敏感词库来检测敏感词的
        String[] arr = {"cnm", "spa", "wdnmd", "sb", "jb"};
        for (int i = 0; i < arr.length; i++) {
            s1 = s1.replace(arr[i], "**");
        }
        System.out.println(s1);
    }
}

StringBuilder


如果按一般方法来拼接字符串一百万次,那么速度会很慢,每次拼接后在内存层面都会产生一个新的字符串
但使用StringBuilder会能在短时间内解决

  • 构造方法
  • 常用方法

    StringBuilder可以看做一个容器,里面的内容可以发送改变。
  • 应用场景
    1.字符串拼接
    2.字符串反转
    public static void main(String[] args) {
        //1.创建StringBuilder对象
        StringBuilder sb1=new StringBuilder();
        System.out.println("sb1="+sb1);//sb1=
        //结果是空的,而不是地址值。
        //因为java对StringBuilder类做了特殊处理,使其对象打印出的值是属性值而非地址值

        //2.添加元素
        StringBuilder sb2=new StringBuilder("abc");
        sb2.append(3.14);
        sb2.append("d");
        sb2.append(true);
        System.out.println("sb2="+sb2);//abc3.14dtrue
        // 但sb2还不是字符串,只是StringBuilder的内容

        //3.反转
        sb2.reverse();
        System.out.println("sb2反转后="+sb2);

        //4.获取长度
        int a=sb2.length();
        System.out.println("sb2的长度="+a);

        //5.转为字符串
        String str=sb2.toString();//此时把sb2转回了字符串
        System.out.println(str.equals("abc"));
    }

链式编程

package StringTest;

import java.util.Scanner;

public class t10 {
    public static void main(String[] args) {
        //链式编程
        //当在调用一个方法时不需要用变量接收它的结果,可以继续在此基础上调用其他方法
        int length=getString().substring(1).replace("b","q").length();
        //=左边就是一串链式编程
        System.out.println(length);
    }
    public static String getString(){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入字符串:");
        String str=scanner.next();
        return str;
    }
}


append返回的还是StringBuilder对象,所以也可以采用链式编程

StringBuilder sb3=new StringBuilder("cba");
        sb3.append(3.14).append("d").append(false);
        System.out.println("sb3="+sb3);//sb3=cba3.14dfalse

判断字符串是否对称

package StringTest;

import java.util.Scanner;

public class t11 {
    public static void main(String[] args) {
        //判断字符串是否对称
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入字符串:");
        String str=scanner.next();

        String result=new StringBuilder().append(str).reverse().toString();
        if (result.equals(str)){
            System.out.println("对称");
        }else{
            System.out.println("不对称");
        }
    }
}

StringBuilder实现{}→[]

    public static void main(String[] args) {
        int[] array1 = {1, 2, 3};
        String str = arrToString(array1);
        System.out.println(str);//[1,2,3]
    }

    public static String arrToString(int[] arr) {
        StringBuilder sb = new StringBuilder();

        if (arr == null) {
            return sb.toString();
        }
        if (arr.length == 0) {
            return sb.append("[").append("]").toString();
        }
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                sb.append(arr[i]);
            } else {
                sb.append(arr[i]).append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

StringJoiner

  • 应用场景
    用于字符串拼接时的添加间隔、开头、结尾的字符
  • 构造方法
  • 成员方法
        //1.创建对象
        StringJoiner sj=new StringJoiner(",");
        //2.添加元素,只能是字符串
        sj.add("a").add("b").add("c");
        //3.打印
        System.out.println(sj);//a,b,c

        //用,间隔 用[拼接在开头 用]拼接在末尾
        StringJoiner sj1=new StringJoiner(",","[","]");
        sj1.add("a").add("b").add("c");
        System.out.println(sj1);//[a,b,c]

        //获取长度
        System.out.println(sj1.length());//7

        //变成String类型
        System.out.println(sj1.toString());
posted @ 2022-09-13 17:26  ben10044  阅读(48)  评论(0)    收藏  举报