第十课 Java基础篇——API&字符串

一、API:应用程序编程接口

Java APl:指的就是JDK中提供的各种功能的Java类

这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。

API帮助文档

API文档练习:

需求:按照帮助文档的使用步骤学习Scanner类的使用,并实现接收键盘录入一个小数,最后输出在控制台

package cn.nwafu.APIHelpDocument;

import java.util.Scanner;

public class test1 {
    public static void main(String[] args) {
//        API文档练习:
//        需求:按照帮助文档的使用步骤学习Scanner类的使用,并实现接收键盘录入一个小数,最后输出在控制台
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字");
        double num = sc.nextDouble();
        System.out.println(num);
    }
}

二、字符串 String:

  1. Strin是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。
  2. Java程序中的所有字符串文字,都被实为此类的对象。
  3. 字符串不可变,它们的值在创建后不能被更改

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。

不存在:创建新的

存在:复用

当用new时,每new一次,都会在堆上开辟一次内存空间,地址值各不相同,与是否存在无关

三、String类 Java常用方法

1、比较

==号到底比什么?

基本数据类型比较的是数据值

引用数据类型比较的是地址值

boolean equals方法(要比较的字符串) 完全一样结果才是true,否则为false

boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较

注意:键盘录入字符串是new出来的;

案例1、用户登录:

需求:已知正确的用户名和密码,请用程序实现模拟用户登录。

总共给三次机会,登录之后,给出相应的提示

package cn.nwafu.StringTest;

import java.util.Scanner;

public class test4 {
    public static void main(String[] args) {
        //1、定义两个变量表示正确的用户名和密码
        String rightUserName = "lihua";
        String rightPassWord =  "123456";

//        //2、键盘录入用户名和密码
//        Scanner sc = new Scanner(System.in);
//        System.out.println("请输入用户名");
//        String username = sc.next();
//        System.out.println("请输入用户密码");
//        String password = sc.next();

        //2、键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);

        //3、比较
        //统计思想
        int count = 0;
        while(true) {

            System.out.println("请输入用户名");
            String username = sc.next();
            System.out.println("请输入用户密码");
            String password = sc.next();

            if (username.equals(rightUserName) && password.equals(rightPassWord)) {
                System.out.println("登录成功!");
                break;
            } else {
                System.out.println("登录失败,用户名或密码错误");
                count++;
                if (count < 3) {
                    System.out.println("剩余" + (3 - count) + "次机会!");
                } else {
                    System.out.println("连续三次输入错误,请稍后重试!");
                    break;
                }
            }
        }
    }
}

2、遍历

案例2、遍历字符串

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

package cn.nwafu.StringTest;

import java.util.Scanner;

public class test5 {
    public static void main(String[] args) {
        //1.键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        //2.进行遍历
        for (int i = 0; i < str.length(); i++) {
            //i 以此表示字符串的每一个索引
            char c = str.charAt(i);
            System.out.print(c+" ");

        }
    }
}

统计字符次数

键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数

(不考虑其他字符)

package cn.nwafu.StringTest;

import java.util.Scanner;

public class test5 {
    public static void main(String[] args) {
        //1、键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        //2、统计思想
        //定义三个计数器
        int bigCount = 0;
        int smallCount = 0;
        int numberCount = 0;
        for (int i = 0; i < str.length(); i++) {
            char c =str.charAt(i);
            //System.out.println(c);
            if(c >= 'a'&& c <= 'z' ){
                //char类型变量在参与计算的时候自动类型提升为int,查询ASCII表
                smallCount++;
            }else if (c >= 'A' && c <= 'Z'){
                bigCount++;
            }else if (c >= '0' && c <= '9'){
                numberCount++;
            }
        }
        //3、输出打印
        System.out.println("大写字母有:"+bigCount+"个");
        System.out.println("小写字母有:"+smallCount+"个");
        System.out.println("数字字母有:"+numberCount+"个");

    }
}

3、拼接

拼接字符串

定义一个方法,把 int数组中的数据按照指定的格式拼接成一个字符串返回,

调用该方法,并在控制台输出结果。例如:

数组为int[]arr = {1,2,3};

执行方法后的输出结果为:[1,2,3]

package cn.nwafu.StringTest;

public class test6 {
    public static void main(String[] args) {

        int[] arr = {1,2,3};
        String result = arrToString(arr);
        System.out.println(result);
    }
    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;
    }
}

4、反转

字符串反转

一个方法,实现字符串反转。

键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入abc,输出结果cba

package cn.nwafu.StringTest;

public class test6 {
    public static void main(String[] args) {

        int[] arr = {1,2,3};
        String result = arrToString(arr);
        System.out.println(result);
    }
    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 cn.nwafu.StringTest;

import java.util.Scanner;

public class test8 {
    public static void main(String[] args) {
        //键盘录入一个金额
        Scanner sc  =new Scanner(System.in);
        int money;
        while (true) {
            System.out.println("请输入一个金额");
            money = sc.nextInt();
            if (money >= 0 && money <= 9999999){
                break;
            }else{
                System.out.println("金额无效");
            }
        }
        //把小写变成大写数字
        String moneyStr = "";
        while (true){
            int ge = money % 10;
            String capitalNumber = getCapitalNumber(ge);
            moneyStr = capitalNumber + moneyStr;
            money = money / 10;
            if(money == 0){
                break;
            }
        }
        //System.out.println(money);

        //补0凑齐7位
        int count = 7-moneyStr.length();
        for (int i = 0; i < count; i++) {
            moneyStr = "零" + moneyStr;
        }
        //System.out.println(moneyStr);

        //插入单位
        //定义一个字符串数组放入单位
        String[] arr = {"佰","拾","万","千","佰","拾","元"} ;
        String result = "";
        for (int i = 0; i < moneyStr.length(); i++) {
            char c = moneyStr.charAt(i);
            result = result + c + arr[i];
        }
        //打印结果
        System.out.println(result);
    }

    //定义一个方法,大写数字与小写数字一一对应,方便后续转换
    public static String getCapitalNumber(int number){
        String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        return arr[number];
    }

}

5、截取与替换

案例、手机号屏蔽

package cn.nwafu.StringTest;

public class test9 {
    public static void main(String[] args) {
        //1、获取一个手机密码
        String phoneNumber = "13146245768";
        //2、截取前3位
        String start = phoneNumber.substring(0,3);
        //3、截取后四位
        String end = phoneNumber.substring(7);
        //4、拼接
        String result = start + "****" + end;
        //5、打印
        System.out.println(result);
    }
}

身份证信息查看

package cn.nwafu.StringTest;

public class test10 {
    public static void main(String[] args) {
        //1、定义字符串存放身份证号
        String arr = "220302201604090248";
        //2、截取年月日和性别
        String year = arr.substring(6,10);
        String month = arr.substring(10,12);
        String day = arr.substring(12,14);
        char gender = arr.charAt(16);

        //打印对应信息
        System.out.println("人物信息为:");
        System.out.println("出生年月日:"+year+"年"+month+"月"+day+"日");

        //3、把字符变成数字‘3’-->3
        //并且进行男女判断

        //ASCII表
        //'0'-->48
        //'1'-->49
        //'2'-->50
        //'3'-->51
        //'4'-->52
        //'5'-->53
        //'6'-->54
        //'7'-->55
        //'8'-->56
        //'9'-->57    差值就是真正的数字
        int num = gender - 48;
        if(num % 2 == 0){
            System.out.println("性别为:女");
        }else{
            System.out.println("性别为:男");
        }
    }
}

 

敏感词替换

package cn.nwafu.StringTest;

public class test11 {
    public static void main(String[] args) {
        //1.获取到说的话
        String talk = "你玩的真好,以后不要再玩了,TMD,SB!";

        //2.定义一个敏感词库
        String[] arr = {"TMD","CNM","SB","XSWL"};
        //3.遍历每一个敏感词进行替换
        for (int i = 0; i < arr.length; i++) {
            talk = talk.replace(arr[i],"***");
        }

        System.out.println(talk);
    }
}

四、StringBuilder类 用法

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

作用:提高字符串的操作效率

对称字符串

需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是

对称字符串:123321、111

非对称字符串:123123

package cn.nwafu.StringBulider;

import java.util.Scanner;

public class test4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("键盘录入一个字符串");
        String input = sc.next();

        String result = new StringBuilder().append(input).reverse().toString();

        if(input.equals(result)){
            System.out.println("当前字符串是对称字符串");
        }else{
            System.out.println("当前字符串不是对称字符串");
        }
    }
}

拼接字符串(用StringBuilder方法)

定义一个方法,把 int数组中的数据按照指定的格式拼接成一个字符串返回,

调用该方法,并在控制台输出结果。例如:

数组为int[]arr = {1,2,3};

执行方法后的输出结果为:[1,2,3]

 

package cn.nwafu.StringBulider;

public class test5 {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        String result = arrToString(arr);
        System.out.println(result);
    }
    public static  String arrToString(int[] arr){
        StringBuilder sb = new StringBuilder("[");
        //sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if(i == arr.length-1){
                sb.append(arr[i]);
            }else{
                sb.append(arr[i]+",");
            }
        }
        return sb.append("]").toString();
    }
}

五、StringJoiner类 用法JDK8

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

作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。

 

 

六、字符串原理

字符串拼接无变量

 

 

字符串拼接有变量JDK8以前的原理

 

 

s4先预估总长度再建立数组放入内容再将整体变成字符串

 

 

 

 

字符串原理小结

 

常见面试题

 

七、综合练习

练习1.转换罗马数字

键盘录入一个字符串,

要求1:长度为小于等于9

要求2:只能是数字

将内容变成罗马数字

下面是阿拉伯数字跟罗马数字的对比关系:

1-Ⅰ、2-Ⅱ、3-Ⅲ、4-Ⅳ、5-Ⅴ、6-Ⅵ、7-Ⅶ、8-Ⅷ、9-Ⅸ

注意点:罗马数字里面是没有0的

如果键盘录入的数字包含0,可以变成””(长度为0的字符串)

package cn.nwafu.Test;

import java.util.Scanner;

public class test1 {
    public static void main(String[] args) {
//        练习1.转换罗马数字
//        键盘录入一个字符串,
//        要求1:长度为小于等于9
//        要求2:只能是数字
//                将内容变成罗马数字
//        下面是阿拉伯数字跟罗马数字的对比关系:
//       1-Ⅰ、2-Ⅱ、3-Ⅲ、4-Ⅳ、5-Ⅴ、6-Ⅵ、7-Ⅶ、8-Ⅷ、9-Ⅸ
//        注意点:罗马数字里面是没有0的
//        如果键盘录入的数字包含0,可以变成””(长度为0的字符串)

        //1.键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        String str;
        while (true) {
            System.out.println("请输入一个字符串");
            str = sc.next();

            //2.校验字符串
            boolean flag = checkStr(str);
            //System.out.println(flag);
            if(flag){
                break;
            }else{
                System.out.println("当前字符串不符合规则,请重新输入");
                continue;
            }
        }
        //将内容变成罗马数字
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            int number = c - 48;
            String s = changeLuoMa(number);
            //System.out.println(s);
            sb.append(s);
        }
        System.out.println(sb);

    }
    //罗马数字表的方法
    public static String changeLuoMa(int number){
        String[] arr = {"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ"};
        return arr[number];
    }

    //校验字符串的方法
    public static boolean checkStr(String str){
        if (str.length()>9){
            return  false;
        }
        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i) < '0' || str.charAt(i) > '9'){
                return false;
            }
        }
        //只有全部判断完毕才能返回true
        return true;
    }
}

练习2.调整字符串

给定两个字符串,A和B。

A的旋转操作就是将A最左边的字符移动到最右边。例如,若A= 'abcde',在移动一次之后结果就是'bcdea'。

如果在若干次调整操作之后,A能变成B,那么返回True。如果不能匹配成功,则返回false

package cn.nwafu.Test;

public class test2 {
    public static void main(String[] args) {
//        练习2.调整字符串
//        给定两个字符串,A和B。
//        A的旋转操作就是将A最左边的字符移动到最右边。
//        例如,若A= 'abcde',在移动一次之后结果就是'bcdea'。
//        如果在若干次调整操作之后,A能变成B,那么返回True。
//        如果不能匹配成功,则返回false

        //1.定义两个字符串
        String str1 = "eabcd";
        String str2 = "cdeab";

        //2.旋转字符串
        //str1 = rotate(str1);

        //3.比较
        boolean flag = check(str1,str2);
        System.out.println(flag);
    }
    //比较
    public static boolean check(String str1,String str2){
        for (int i = 0; i < str1.length();i++) {
            str1 = rotate(str1);
            if(str1.equals(str2)){
                return true;
            }

        }
        return false;
    }
    //旋转字符串
    public static String rotate(String str){
        //套路:
        //如果我们看到要修改字符串的内容
        //可以有两个办法:
        //1.用substring进行截取,把左边的字符截取出来拼接到右侧去
        //2.可以把字符串先变成一个字符数组,然后调整字符数组里面数据,最后再把字符数组变成字符串。

        //截取思路
        char first = str.charAt(0);
        String end = str.substring(1);
        return end + first;
    }
}

练习3.

键盘输入任意字符串,打乱里面的内容

package cn.nwafu.Test;

import java.util.Random;
import java.util.Scanner;

public class test3 {
    public static void main(String[] args) {
        //键盘输入任意字符串,打乱里面的内容

        //1.键盘输入字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();

        //2.打乱内容
        //用第二种思路,变成字符数组
        char[] arr = str.toCharArray();

        //3.打乱数组里面的内容
        //从0索引开始,跟一个随机索引进行位置的交换
        //当数组里面的每一个元素都跟一个随机索引进行交换完毕之后,那么内容就打乱了
        for (int i = 0; i < arr.length; i++) {
            Random r = new Random();
            int index = r.nextInt(arr.length);
            char temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        //4.把字符数组再变回字符串
        String result = new String(arr);
        System.out.println(result);
    }
}

练习4.生成验证码

内容:可以是小写字母,也可以是大写字母,还可以是数字

规则:

长度为5

内容中是四位字母,1位数字。

其中数字只有1位,但是可以出现在任意的位置。

package cn.nwafu.Test;

import java.util.Random;

public class test4 {
    public static void main(String[] args) {
//        练习4.生成验证码
//        内容:可以是小写字母,也可以是大写字母,还可以是数字
//        规则:
//        长度为5
//        内容中是四位字母,1位数字。
//        其中数字只有1位,但是可以出现在任意的位置。

        //1.可以把所有的大写字母,小写字母都放到一个数组当中
        char[] arr = new char[52];
        for (int i = 0; i < arr.length; i++) {
            if (i<26){
                arr[i] = (char) (97+i);
            }else{
                arr[i] = (char)(65+i-26);
            }
        }
        //2.从数组中随机获取4次
        //3.生成一个0~9之间的随机数拼接到最后
        // ACFG7I
        Random r =new Random();
        String str = "";
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(arr.length);
            str = str + arr[index];
        }
        //System.out.println(str);
        int num = r.nextInt(10);
        str = str + num;
        System.out.println(str);

        //思考,我们把7放到前面,修改了字符串的内容
        // 把生成的验证码先变成一个字符数组
        //再让最后一个元素跟前面的随机位置的元素进行交换

        char[] chs = str.toCharArray();
        int randomIndex = r.nextInt(chs.length);
        char temp = chs[randomIndex];
        chs[randomIndex] = chs[chs.length-1];
        chs[chs.length-1] = temp;

        //交换完毕之后再变成字符串就可以了。
        String result = new String(chs);
        System.out.println(result);
    }
}

练习5.

给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:需要用已有的知识完成。

不需要考虑乘积过大之后的结果

就认为乘积一定是小于int的最大值的

package cn.nwafu.Test;

public class test5 {
    public static void main(String[] args) {
//        给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:需要用已有的知识完成。
//        不需要考虑乘积过大之后的结果
//        就认为乘积一定是小于int的最大值的

        String num1 = "1234";
        String num2 = "0123";

        //1.把num1和num2变成对应的整数才可以
        先遍历字符串依次得到每一个字符  '0' 1’ '2''3’'4''5’'6''7''8''9'
        // 再把字符变成对应的数字即可0 1 2 3 4 5 6 7 8 9
        // 把每一个数字组合到一起1234
        int number1 = getNumber(num1);
        //System.out.println(number1);
        int number2 = getNumber(num2);
        //2.利用整数进行相乘
        int resultNum = number1 * number2;
        //3.把整数变回字符串
        System.out.println(resultNum+"");
    }
    public static int getNumber(String num){
        //num == "1234"
        int result = 0;
        for (int i = 0; i < num.length(); i++) {
            char c = num.charAt(i);
            //System.out.println(c);
            int number =c - 48;
            result = result * 10 + number;
        }
        return result;
    }
}

练习6.

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。

单词是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例1:输入: s = "Hello world" 输出:5

解释:最后一个单词是"world”,长度为5。

示例2:输入: s = "fly me to the moon" 输出:4

解释:最后一个单词是"moon”,长度为4。

示例3:输入: s = "luffy is still joyboy" 输出:6

解释:最后一个单词是“joyboy”,长度为6。

package cn.nwafu.Test;

public class test6 {
    public static void main(String[] args) {
//        练习6.
//                给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
//        单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
//        示例1:输入: s = "Hello world" 输出:5
//        解释:最后一个单词是"world”,长度为5。
//        示例2:输入: s = "fly me to the moon" 输出:4
//        解释:最后一个单词是"moon”,长度为4。
//        示例3:输入: s = "luffy is still joyboy" 输出:6
//        解释:最后一个单词是“joyboy”,长度为6。

        String str = "Hello World joyboy";
        //倒着遍历
        //直到遇到空格为止
        //那么遍历的次数就是单词的长度
        int count = 0;
        for (int i = str.length()-1; i >= 0; i--) {
            char c = str.charAt(i);
            //System.out.println(c);

            if(c == ' '){
                break;
            }else{
                count++;
            }
        }
        System.out.println(count);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值