字符串 API

API和API帮助文档

API:

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

API就是别人写好的东西 我们不需要自己写 直接使用即可

Java API :目前是JDK中提供的各种功能的Java类

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

API帮助文档

帮助开发人员更好的使用API和查询API的一个工具

如何使用帮助文档

1 打开API帮助文档

2 找到右上角显示点击 找到索引下面的输入框

3 输入类名回车点显示

4 查看类所在包

5 查看类描述

6 查看构造方法

7 查看成员方法

API文档练习

需求:

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

package com.wide;

import java.util.Scanner;

public class Role {
    public static void main(String[] args) {
        //创建对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个小数");
        //接收一个小数
        double result = sc.nextDouble();

        //输出打印
        System.out.println(result);
    }


}

字符串

String

Java.lang.String类代表字符串,Java程序中的所有字符串文字(例如"abc")都为此类的对象

String是Java定义好的一个类 定义在Java.lang包中 所以使用的时候不需要导包

字符串不可变 它们的值在创建后不能被更改

注意点

字符串的内容是不会发生改变的 它的对象在创建后不能被更改

创建String对象的两种方式

1 直接赋值

2 new

package com.wide;

public class StringDemo01 {
    public static void main(String[] args) {
        //1 使用直接赋值的方式获取一个字符串对象
        String s1 = "abc";
        System.out.println(s1);

        //2 使用new的方式来获取一个字符串对象
        //空参构造:可以获取一个空白的字符串对象
        String s2 = new String();
        System.out.println("@" + s2 + "|");

        //快递一个字符串 根据传递的字符串内容在创建一个新的字符串对象
        String s3 = new String("abc");
        System.out.println(s3);

        //传递一个字符数组,根据字符数组的内容再创造一个新的字符串对象
        char[] chs = {'a','b','c','d'};
        String s4 = new String(chs);
        System.out.println(s4);
        
        //快递一个字节数组 根据字节数组的内容再创造一个新的字符串对象
        //应用场景:以后在网络当中传输的数据其实都是字节信息
        //我们一般要把字节信息进行转换 转换成字符串 此时就要用到这个构造了
        byte[] bytes = {97,98,99,100};
        String s5 = new String(bytes);
        System.out.println(s5);
    }
}

Java的常用方法(比较)

==号比较的到底是什么?

基本数据类型​​​​​​​

int a = 10;
int b = 20;

System.out.println(a==b); //false

  基本数据类型比较的是数据值;//具体的数据值

引用数据类型

String s1 = new String("abc");
String s2 = new String("abc");

System.out.println(s1==s2); //false

数据类型比较的是地址值

字符串比较

package com.wide;

public class StringDemo02 {
    public static void main(String[] args) {
        //1创建两个字符串对象
        String s1 = new String("abc");
        String s2 = "Abc";

        //2 ==号比较
        //基本数据类型比的是数据值
        //引用数据类型比的是地址值
        System.out.println(s1 == s2);

        //3 比较字符串中对象中的内容是否相等
        boolean result1 = s1.equals(s2);
        System.out.println(result1);

        //4比较字符串对象中的内容是否相等 忽略大小写
        boolean result2 = s1.equalsIgnoreCase(s2);
        System.out.println(result2);
    }
}

案例用户登录

需求:

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

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

package com.wide;

import java.util.Scanner;

public class StringDemo02 {
    public static void main(String[] args) {
        //1键盘录入用户名和密码
        String rightUsername = "Alacan";
        String rightPassword = "5201314";
        
        //键盘录入用户名和密码
        for (int i = 0; i < 3; i++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名");
            String username = sc.next();
            System.out.println("请输入密码");
            String password = sc.next();

            //3 比较
            if (username.equals(rightUsername) && password.equals(rightPassword)){
                System.out.println("用户登录成功");
                break;
            }else{
                System.out.println("用户登录失败用户名或密码有误");
            }
        }
    }
}

案例 遍历字符串

需求:

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

package com.wide;

import java.util.Scanner;

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

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串");
        String str = sc.next();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            System.out.println(c);

        }

    }
}

案例 统计字符次数

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

(不考虑其他字符)

package com.wide;

import java.util.Scanner;

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

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串");
        String str = sc.next();

        int bigCount = 0;
        int smallCount = 0;
        int numberCount = 0;
        for (int i = 0; i < str.length(); i++) {
            //i 表示字符串中每一个索引
            char c = str.charAt(i);
            if (c >= 'a' && c <= 'z'){
                smallCount++;
            }else if (c >= 'A' && c <= 'Z'){
                bigCount++;
            }else if (c >= '1' && c >= '9'){
                numberCount++;
            }
        }
        System.out.println("小写字母有"+smallCount+"个");
        System.out.println("大写字母有"+bigCount+"个");
        System.out.println("数字有"+numberCount+"个");
    }
}

案例 拼接字符串

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

调用该方法 并在控制台输出结果

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

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

package com.wide;


public class StringDemo02 {
    public static void main(String[] args) {
        int[] arr = {1,2,3};

        String str = arrToString(arr);
        System.out.println(str);

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

案例 字符串反转

定义一个方法 实现字符串反转

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

例如 键盘录入abc 输出结果 cba

package com.wide;


public class StringDemo02 {
    public static void main(String[] args) {
        String result = reveser("abc");
        System.out.println(result);

    }
    public static String reveser(String str){
        String result = " ";
        for (int i = str.length()-1;i >= 0; i--) {
            char c = str.charAt(i);
            result = result + c;
        }
        return result;
    }

}

案例 金额转换

package com.wide;

import java.util.Scanner;

public class StringDemo02 {
    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 <= 999999999){
                 break;
            }else {
                System.out.println("金额无效");
            }
        }
        //定义一个变量用来表示钱的大写
        String moneyStr = "";

        //得到money里面扽每一个数
        while(true){
            //从右往左获取数据 因为右侧是数据的个位
            int ge = money % 10;
            String capitalNumber = getCapitalNumber(ge);
           //转换之后的大写拼接到moneyStr中
            moneyStr = capitalNumber + moneyStr;
            //去掉刚刚获取的数据
            money = money / 10;


            if(money == 0){
                break;
            }
        }
        //3在前面补零补齐七位
        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 = result + c + arr[i];

        }
        System.out.println(result);

    }
    public static String getCapitalNumber(int number){
        //定义数组 让数字跟大写中文产生对应关系
        String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        //返回结果
        return arr[number];
    }
}

案例 手机号屏蔽

String substring(int beginIndex,int endIndex) //截取

//注意点:包头不包尾 包左不包右 只有返回值才是截取的小串


String substring(int beginIndex).  //截取到末尾
package com.wide;


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

        //获取一个手机号码
        String phoneNumber = "13112349468";

        //2 截取手机号码前三位
        String start = phoneNumber.substring(0,3);

        //3 截取手机号码后面四位
        String end = phoneNumber.substring(7);

        //4 拼接
        String result = start + "****" + end;

        System.out.println(result);

    }
}

案例 身份证查看

package com.wide;


import java.util.Locale;

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

        //定义一个字符串记录身份证号码
        String id = "321281202001011234";

        //获取出生年月日
        String year = id.substring(6,10);
        String mouth = id.substring(10,12);
        String day = id.substring(12,14);

        System.out.println("人物信息为:");
        System.out.println("出生年月日为:" + year + "年" + mouth + "月" + day + "日");

        //获取性别
        char gender = id.charAt(16);

        int num = gender - 48;
        if (num % 2 == 0){
            System.out.println("性别为女");
        }else{
            System.out.println("性别为男");
        }

    }
}

案例 敏感词替换

String replace(旧值,新值)// 替换

注意点:只有返回值才是替换之后的结果

基本写法

package com.wide;

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

        //获取要说的话
        String talk = "你玩的真好,TMD";

        //把里面敏感词换成***
        String result = talk.replace("TMD","***");

        System.out.println(result);
    }

}
package com.wide;

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

        //获取要说的话
        String talk = "你玩的真好呢,TMD,我CNM";
        //定义一个敏感库
        String[] arr = {"TMD","CNM","SB","MLGB"};
        //循环得到数组中每一个敏感词 依次进行替换
        for (int i = 0; i < arr.length; i++) {

            talk = talk.replace(arr[i],"***");


        }

        //把里面敏感词换成***

        System.out.println(talk);
    }

}

StringBuilder

StringBuilder概述:

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

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

StringBuilder构造方法

方法名

public StringBuilder()  

说明创建一个空白可变字符串对象 不含有任何内容

​​​​​​​方法名

public StringBuilder(String str)

说明根据字符串的内容 来创建可变字符串对象

StringBuilder常用方法

方法名:

public  StringBuilder  append(任意类型)

说明:

添加数据 并返回对象本身

方法名:

public  StringBuilder  reverse()

说明:

反转容器中的内容

方法名:

public  int  length()

说明:

返回长度(字符出现的个数)

方法名:

public  String  toString()

说明:

通过toString()就可以实现吧StringBuilder转换为String

使用StringBuilder场景:

字符串的拼接

字符串的反转
 

package com.wide;

public class StringDemo02 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder("abc");

        //添加元素
        sb.append(1);
        sb.append(2.3);
        sb.append(true);
        
        //反转
        sb.reverse();
        
        //获取长度
        int len = sb.length();
        System.out.println(len);


        System.out.println(sb);
    }

}
package com.wide;

public class StringBuilderDemo03 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();

        //添加字符串
        sb.append("aaa");
        sb.append("bbb");
        sb.append("ccc");

        System.out.println(sb);

        //把StringBuilder变回字符串
        String str = sb.toString();
        System.out.println(str);


    }
}

链式编程

package com.wide;

import java.util.Scanner;

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

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

        int len = getString().substring(1).replace("A","Q").length();
        System.out.println(len);

    }
    public static String getString(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        return str;
    }
}

public class StringBuilderDemo03 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();

        //添加字符串
        sb.append("aaa").append("bbb").append("ccc");

        System.out.println(sb);

        //把StringBuilder变回字符串
        String str = sb.toString();
        System.out.println(str);


    }
}

练习 对称字符串

需求:

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

对称字符串:123321     111

非对称字符串:   123123

package com.wide;

import java.util.Scanner;

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

        //反转键盘录入字符串
        String result = new StringBuilder().append(str).reverse().toString();

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

练习 拼接字符串

需求:

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

调用该方法 并在控制台输出结果

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

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

package com.wide;

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

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

        String str = arrToString(arr);

        System.out.println(str);

    }
    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]).append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}

StringJoiner

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

作用:

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

JDK8 出现的

StringJoiner的构造方法

方法名:

public StringJoiner(间隔符号)

说明:

创建一个StringJoiner对象 指定拼接时的间隔符号

方法名:

public StringJoiner(间隔符号 ,开始符号, 结束符号)

说明:
创建一个StringJoiner对象 指定拼接时的间隔符号、开始符号、结束符号;

StringJoiner的成员方法

方法名:

public StringJoiner add(添加的内容)

说明:

添加数据 并返回对象本身

方法名:

public int length()

说明:

返回长度(字符出现个数)

public String toString

说明:

返回一个字符串(该字符串就是拼接之后的结果)

package com.wide;

import java.util.StringJoiner;

public class StringBuilderDemo03 {
    public static void main(String[] args) {
        //创建一个对象
        StringJoiner sj = new StringJoiner("====");

        //添加元素
        sj.add("aaa").add("bbb").add("ccc");

        System.out.println(sj);

    }
}
package com.wide;

import java.util.StringJoiner;

public class StringBuilderDemo03 {
    public static void main(String[] args) {
        //创建一个对象
        StringJoiner sj = new StringJoiner(", ","[","]");

        //添加元素
        sj.add("aaa").add("bbb").add("ccc");

        int len = sj.length();
        System.out.println(len);

        System.out.println(sj);

        String str = sj.toString();
        System.out.println(str);

    }
}

总结:

String:

表示字符串的类 定义了很多操作字符串的方法

StringBuilder:

一个可变的操作字符串的容器

可以高效的字母拼接字符串 还可以将容器里面的内容反转

StringJoiner:

JDK8出现的一个可变的操作字符串的容器 可以高效 方便的拼接字符串

在拼接的时候 可以指定间隔符号 开始符号 结束符号

字符串原理

底层原理 1 : 字符串存储的内存原理

直接赋值会复用字符串常量池中的

new出来不会复用 而是开辟一个新空间

底层原理 2 : ==号比较的到底是什么

基本数据类型比较数据值

引用数据类型比较地址值

底层原理 3 :字符串拼接的底层原理

拼接的时候没有变量 都是字符串

触发字符串的优化机制

在编译的时候就已经是最终结果了

在拼接的时候有变量

JDK8以前底层会使用StringBuilder

字符串拼接的时候有变量参与:

在内存中创建了很多的对象

浪费空间 时间也非常慢

结论:

如果很多字符串变量拼接 不要直接➕ 在底层创建多个对象 浪费时间 浪费性能

如果没有变量参与 都是字符串直接相加 编译之后就是拼接之后的结果 会复用串池中的字符串

如果有变量参与 每一行拼接的代码 都会在内存中创建新的字符串 浪费内存

底层原理 4 :StringBuilder提高效率原理图

字符串拼接的时候 如果有变量:

JDK8以前:系统底层会自动创建一个StringBuilder对象 然后在调用其append方法完成拼接

拼接后 在调用其 toString方法转换为String类型 而toString方法的底层是直接new了一个字符串对象

JDK8版本:系统会预估要字符串拼接之后的总大小 把要拼接的内容都放在数组中 此时也是产生了一个新的字符串

所有要拼接的内容都会往StringBuilder中放 不会创建很多无用的空间 节约内存

底层原理 5 :StringBuilder源码分析

默认创建一个长度为16的字节数组

添加的小于16直接存储

大于16(容量16*2+2)

扩容之后还不够 以实际长度为准

package com.wide;

public class StringBuilderDemo03 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        //容量是最多可以装多少
        //长度是已经装了多少
        System.out.println(sb.capacity());
        System.out.println(sb.length());
          
        // sb.append("abc");
        // sb.append("abcdefghijklmnopqrstuvwxyz");  
        sb.append("abcdefghijklmnopqrstuvwxyz0123456789");

        System.out.println(sb.capacity());
        System.out.println(sb.length());
    }
}

综合练习 转换罗马数字

键盘录入一个字符串

要求1:长度小于等于9

要求2:只能是数字

将内容变成罗马数字

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

I  - 1、II - 2、III - 3、IV - 4、V - 5、VI - 6 、VII - 7 、VIII - 8、IX - 9;

注意点:

罗马数字里面没有零

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

package com.wide;

import java.util.Scanner;

public class StringBuilderDemo03 {
    public static void main(String[] args) {
        //System.out.println('0'+0);

        Scanner sc = new Scanner(System.in);
        //ctrl+alt+t
        String str;
        while (true) {
            System.out.println("请输入一个字符串");
            str = sc.next();

            //校验字符串是否满足规则
            boolean flag = checkStr(str);
            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 = changLouMa(number);
           sb.append(s);
        }

        System.out.println(sb);

    }
    public static String changLouMa(int number){
        //定义一个数组让索引跟罗马数组产生一个对应关系
        String[] arr = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
        return arr[number];
    }


    public static boolean checkStr(String str){
        //长度小于等于9
        if (str.length() > 9){
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);//0-9
            if (c < '0'|| c > '9'){
                return false;
            }else{
                return true;
            }
        }

        return true;
    }
}

综合练习 调整字符串

给定两个字符串 A 和 B

A的旋转操作就是将A最左边的字符移动到最右边

例如,若A=‘abcde',在移动一次之后结果是’bcdea‘

如果在若干次调整操作之后 A能变成B 那么返回True

如果不能匹配成功 则返回false

package com.wide;

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

        String strA = "abcde";
        String strB = "cdeab";


      boolean result = check(strA,strB);
        System.out.println(result);


    }
    public static boolean check(String strA,String strB){
        for (int i = 0; i < strA.length(); i++) {
            strA = rotate(strA);
            if (strA.equals(strB)){
                return true;
            }
        }
        return false;
    }
    public static String rotate(String str){

        //截取思路
        //获取最左侧字符
        char first = str.charAt(0);
        //获取到剩余字符
        String end = str.substring(1);

        return end + first;
    }
}
package com.wide;

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

        String strA = "abcde";
        String strB = "cdeab";


      boolean result = check(strA,strB);
        System.out.println(result);


    }
    public static boolean check(String strA,String strB){
        for (int i = 0; i < strA.length(); i++) {
            strA = rotate(strA);
            if (strA.equals(strB)){
                return true;
            }
        }
        return false;
    }
    public static String rotate(String str){

        char[] arr = str.toCharArray();

        
        //拿到0索引字符
        char first =arr[0];
        //获取到剩余字符
        for (int i = 1; i < arr.length; i++) {
            arr[i-1] = arr[i];
        }
        arr[arr.length-1] = first;

        String result = new String(arr);
        return result;
    }
}

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值