【无标题】

常用API(String、ArrayList)

API(Application Programming Interface):应用程序接口

  • java写好的技术(功能代码),可以直接调用
  • API文档

String类

String是字符串类型,可以定义字符串变量指向字符串对象。

  • String常被称为不可变字符串类型,它的对象在创建后不能被更改

String变量每次的修改其实都是产生并指向了新的字符串对象,原来的字符串对象都是没有改变的,所以称为不可变字符串。

字符串对象的特点有哪些?

  • 双引号创建的字符串对象,在字符串常量池中存储同一个
  • 通过new构造器创建的字符串对象,在堆内存中分开存储

String.equals

String s1 = “abc”//字符串对象存储在字符串常量池中

Scanner sc = new Scanner(System.in);

String s2 = sc.next()//后面接的非” “里的内容,存储在堆内存中

用==判断不了

String(引用数据类型)采用equals判断字符串内容是否一样,只关心内容一样就返回true

==在基本数据类型比较时使用

String常用API

String生成验证码

public class StringRandom {
    public static void main(String[] args) {
        String code = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random r = new Random();
        String s = "";
        for (int i = 0; i < 5; i++) {
            char c = code.charAt(r.nextInt(code.length()));
            s += c;
        }
        System.out.println("验证码为:" + s);
    }
}

String加密手机号:

public class StringTel {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String tel = sc.next();
        String beforeThree = tel.substring(0, 3);//截取前三位手机号
        String after = tel.substring(7);//截取之后的手机号
        System.out.println("手机号为:" + tel);
        System.out.println("加密过的手机号为:" + beforeThree + "****" + after);
    }
}

统计字符串所含字符类型数量:

public class StringCount {
    public static void main(String[] args) {
        System.out.println("请输入一个字符串:");
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int bigNumber = 0, smallNumber = 0, Number = 0;
        for (int i = 0; i < str.length(); i++) {//遍历该字符串
            char c = str.charAt(i);
            if (c >= 'a' && c <= 'z') {
                smallNumber++;
            } else if (c >= 'A' && c <= 'Z') {
                bigNumber++;
            } else {
                Number++;
            }
        }
        System.out.println("大写字母数量为:" + bigNumber);
        System.out.println("小写字母数量为:" + smallNumber);
        System.out.println("数字数量为:" + Number);
    }
}

字符串遍历+反转字符串:

public class StringPracticeArray {
    public static void main(String[] args) {
        System.out.println("请输入一个数组!");
        Scanner sc = new Scanner(System.in);
        int[] a = new int[3];
        for (int i = 0; i < a.length; i++) {
            a[i] = sc.nextInt();
        }
        traverseArray(a);//遍历数组
        //反转字符串
        System.out.println("请输入需要反转的字符串!");
        String str = sc.next();
        backArray(str);
    }

    private static void backArray(String str) {
        String backStr = "";
        for (int i = str.length() - 1; i >= 0; i--) {
            backStr += str.charAt(i);
        }
        System.out.println("反转后的字符串为:" + backStr);
    }

    public static void traverseArray(int[] a) {
        String str = "[";
        for (int i = 0; i < a.length; i++) {
            if (i != a.length - 1) {
                str += a[i] + ",";
            } else {
                str += a[i];
            }
        }
        str += "]";
        System.out.println("遍历后的数组是:" + str);
    }
}

打印大写数字发票单:

public class StringMoneyTransform {
    public static void main(String[] args) {
        System.out.println("请输入一串金额:");
        Scanner sc = new Scanner(System.in);
        int money = sc.nextInt();
        String result = "";
        while (true) {
            int single = money % 10;
            money = money / 10;
            result = getBigMoney(single) + result;
            if (money == 0) {
                break;
            }
        }
        int j = result.length();
        for (int i = 0; i < (7 - j); i++) {
            result = "零" + result;
        }
        String[] array = {"佰", "拾", "万", "千", "佰", "拾", "元"};
        String r = "";
        for (int i = 0; i < array.length; i++) {
            char c = result.charAt(i);
            r = r + c + array[i];
        }
        System.out.println("转换后的金额为:" + r);
    }

    private static String getBigMoney(int single) {
        String str;
        String[] BigMoney = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        str = BigMoney[single];
        return str;
    }
}

提取身份证信息:

public class StringCard {
    public static void main(String[] args) {
        System.out.println("请输入身份证号码:");
        Scanner sc = new Scanner(System.in);
        String card = sc.next();//获取身份证 501234200010131373
        System.out.println("您的身份证号码为:" + card);
        String birthday = getBirthday(card);
        System.out.println("您的出生年月日:" + birthday);
        Boolean sex = judgeSex(card);
        if (sex) {
            System.out.println("您的性别为男!");
        } else {
            System.out.println("您的性别为女!");
        }
    }

    private static Boolean judgeSex(String card) {
        Boolean sex;//定义性别
        char c = card.charAt(16);//0对应ASCII表48,不难直接判断C%2==0,C会转换为对应的ASCII值,逻辑错误
        int num = c - 48;
        sex = num % 2 != 0;
        return sex;
    }

    private static String getBirthday(String card) {
        String birthday = "";
        birthday = card.substring(6, 10) + "年";
        birthday += card.substring(10, 12) + "月";
        birthday += card.substring(12, 14) + "日";
        return birthday;
    }
}

替换敏感词:

public class StringReplace {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请发言:");
        String[] arr = new String[3];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.next();//记录说的话
        }
        String[] dirty = {"tmd", "妈", "b"};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < dirty.length; j++) {
                arr[i] = arr[i].replace(dirty[j], "*");
            }
            System.out.println(arr[i]);
        }
    }
}

StringBuilder

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

一般用在字符串的拼接与反转。

StringBuilder打印对象不是地址值而是属性值

  • 提高字符串的操作效率

tips:

链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

String result = new StringBuffer(input).reverse().toString();

判断是否为对称字符串:

public class StringBuilderT1 {
    public static void main(String[] args) {
        System.out.println("请输入一个字符串:");
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        String result = new StringBuffer(input).reverse().toString();
        if (result.equals(input)) {
            System.out.println(input + "是对称字符串");
        } else {
            System.out.println(input + "不是对称字符串");
        }
    }
}

​ 遍历字符串:

public class TraverseArr {
    public static void main(String[] args) {
        System.out.println("请输入一个数组:");
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[3];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
        String str = traverseAarry(arr);
        System.out.println(str);
    }

    private static String traverseAarry(int[] arr) {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < arr.length - 1; i++) {
            sb.append(arr[i] + ",");
        }
        sb.append(arr[arr.length - 1] + "]");
        return sb.toString();
    }
}

StringJoiner

  • StringJoiner和StringBuffer一样,可看成一个容器,创建之后里面的内容是可变的
  • 作用:提高字符串的操作效率,而且代码编写特别简洁
  • JDK8才出现
public class StringJo {
    public static void main(String[] args) {
        StringJoiner sj = new StringJoiner(",", "[", "]");//(间隔符号,开始符号,结束符号)
        sj.add("aaa").add("bbb").add("ccc");
        System.out.println(sj.length());
        String str = sj.toString();
        System.out.println(str);
        System.out.println(sj);
    }
}

字符串原理

  1. 字符串存储的内存原理

    • 直接赋值会复用字符串常量池中的
    • new出来不会复用,而是开辟一个新的空间
  2. ==号比较的到底是什么?

    • 基本数据类型比较数据值
    • 引用数据类型比较地址值
  3. 字符串拼接的底层原理

    • 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
    • 如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
  4. StringBuilder提高效率原理图

    • 所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
  5. StringBuilder源码分析

    • 默认创建一个长度为16的字节数组
    • 添加的内容长度小于16,直接存
    • 添加的内容大于16会扩容(原来的容量*2+2)
    • 如果扩容之后还不够,以实际长度为准

leetcode算法之罗马数字练习:

public class LuoMaNumber {
    public static void main(String[] args) {
        System.out.println("请输入一串阿拉伯数字:");
        String str;
        Scanner sc = new Scanner(System.in);
        while (true) {
            str = sc.next();//获得输入的阿拉伯数字
            boolean flag;//true为符合要求的数字
            flag = checkNumber(str);
            if (flag) {
                System.out.println(str + "输入正确!");
                break;
            } else {
                System.out.println("输入不符,请重新输入!");
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char number = str.charAt(i);
//            int number = c - 49;
            sb.append(changeNumber(number));
        }
        System.out.println("转换后的字符串为:" + sb);
    }

    public static String changeNumber(char number) {
        String str;
        switch (number) {
            case '1':
                str = "Ⅰ";
                break;
            case '2':
                str = "Ⅱ";
                break;
            case '3':
                str = "Ⅲ";
                break;
            case '4':
                str = "Ⅳ";
                break;
            case '5':
                str = "Ⅴ";
                break;
            case '6':
                str = "Ⅵ";
                break;
            case '7':
                str = "Ⅶ";
                break;
            case '8':
                str = "Ⅷ";
                break;
            case '9':
                str = "Ⅸ";
                break;
            default:
                str = "";
                break;
        }
        ;
        return str;
    }

    public static char changeNumber(int number) {
        char[] luoMa = {'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅳ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ'};
        return luoMa[number];
    }

    public static boolean checkNumber(String str) {
        if (str.length() > 9) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c <= '0' || c > '9') {
                return false;
            }
        }
        return true;
    }
}

如果需要修改字符串的内容,一般两种方法:

  1. 用subString进行截取,把左边的字符截取出来拼接到右侧去
  2. 可以把字符串先变成一个字符数组,然后调整字符数组里面数据,最后再把字符数组变成字符串。
public class AdjustString {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串A:");
        String a = sc.next();
        System.out.println("请输入字符串B:");
        String b = sc.next();
        boolean flag = check(a, b);
        if (flag) {
            System.out.println("B可由A翻转得到");
        } else {
            System.out.println("B不可由A翻转得到");
        }
    }

    //    public static String rotate(String str) {
//    法一:
//        //翻转字符串
//        char first = str.charAt(0);//获取字符串第一位字符
//        String s = str.substring(1);//获取字符串第一位之后的字符串
//        return s + first;
//    }
    public static String rotate(String str) {
        char first = str.charAt(0);
        char[] c = str.toCharArray();
        for (int i = 1; i < c.length; i++) {
            c[i - 1] = c[i];
        }
        c[c.length - 1] = first;
        String st = new String(c);
        return st;
    }

    public static boolean check(String a, String b) {
        //检验若干次
        for (int i = 0; i < a.length(); i++) {
            a = rotate(a);
            if (a.equals(b)) {
                return true;
            }
        }
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值