Java笔记_06(字符串)

一、字符串

1.1、API和API帮助文档

API:应用程序编程接口

简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
Java API:指的就是JDK中提供的各种功能的Java类
这些类将底层的实现封装起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具

  • 如何使用API帮助文档
    • ①打开API帮助文档
    • ②点击显示,并找到索引下面的输入
    • ③在输入框中输入类名并点击显示
    • ④查看类所在的包
    • ⑤查看类的描述
    • ⑥查看构造方法
    • ⑦查看成员方法

1.2、String概述

java.lang.String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都为此类的对象
字符串的内容是不会发生改变的,它的对象在创建后不能被更改
String是Java定义好的一个类,定义在java.lang包中,所以使用的时候不需要导包

1.3、String构造方法代码实现和内存分析

  • 创建String对象的两种方式
    • 直接赋值:String 变量 = "字符串"
    • new
      在这里插入图片描述
  • 当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在
    • 不存在:创建新的
    • 存在:复用
  • 非双引号直接赋值的字符串,每次赋值都会创建一个新的字符串

1.4、字符串的比较

  • ==号比的到底是什么
    • 基本数据类型:比较的是数据值
    • 引用数据类型:比较的是地址值
  • 字符串的比较
    • boolean equals方法(要比较的字符串):完全一样结果才是true,否则为false
    • boolean equalsIgnoerCase(要比较的字符串):忽略大小写的比较
boolean result1 = s1.equals(s2);
System.out.println(result1);
//如果返回是true则说明相同
//如果返回是false则说明是不同的

1.5、用户登录

已知正确的用户名和密码,请用程序实现模拟用户登录,总给三次机会,登录之后,给出相应的提示

import java.util.Scanner;

public class StringTest1 {
    public static void main(String[] args) {
        String rightUserName = "zhangsan";
        String rightPassWord = "123456";
        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();
            if (UserName.equals(rightUserName) && PassWord.equals(rightPassWord)){
                System.out.println("用户登录成功");
                break;
            }else {
                if (i == 2){
                    System.out.println("该用户已锁定");
                }else {
                    System.out.println("用户名或密码错误,请重新输入");
                }
            }
        }
    }
}

1.6、遍历字符串和统计字符串个数

  • 需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
  • public char charAT(int index):根据索引返回字符
  • public int length():返回此字符串的长度
  • 数组的长度:数组名.length
  • 字符串的长度:字符串对象.length()
import java.util.Scanner;

public class StringTest2 {
    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);
        }
    }
}

统计字符次数

  • 键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;

public class StringTest2 {
    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++) {
            char c = str.charAt(i);
            if (c >= 'a' && c <= 'z'){
                smallCount++;
            }else if (c >= 'A' && c <= 'Z'){
                bigCount++;
            }else if (c >= '0' && c <= '9'){
                numberCount++;
            }
        }
        System.out.println("大写字母有" + bigCount + "个");
        System.out.println("小写字母有" + smallCount + "个");
        System.out.println("数字字母有" + numberCount + "个");
    }
}

1.7、字符串的拼接和反转

拼接字符串

  • 定义一个方法,把int数组中的数据按照指定格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
  • 例如:
    • 数组为int[] arr = {1,2,3};
    • 执行方法后的输出结果为:[1,2,3]
package itheimaTest;

public class StringTest3 {
    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 itheimaTest;

public class StringTest3 {
    public static void main(String[] args) {
        
    
        String str = reverser("123");
        System.out.println(str);
    }
    public static String reverser (String str){
        String result = " ";
        for (int i = str.length() - 1; i >= 0; i--) {
            char c = str.charAt(i);
            result = result + c;
        }
        return result;
    }
}

1.8、金额转换

package itheimaTest;

import java.util.Scanner;

public class StringTest4 {
    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 number = getCapitalNumber(ge);
            moneyStr = number + moneyStr;
            money = money / 10;
            //当金额为0时,所有数字获取完毕,跳出循环
            if (money == 0){
                break;
            }
        }


        //将没满七位的地方用零代替
        int count = 7 - moneyStr.length();
        for (int i = 0; i < count; i++) {
            moneyStr = "零" + moneyStr;
        }
        System.out.println(moneyStr);

        //将单位加入数字当中
        //定义一个数组来记录单位
        //定义一个字符串来拼接
        String result = "";
        String[] arr = {"佰","拾","万","仟","佰","拾","元"};
        for (int i = 0; i < moneyStr.length(); i++) {
            char c = moneyStr.charAt(i);
            result = result + c + arr[i];

        }

        //打印结果
        System.out.println(result);


    }




    //定义一个方法使数字变成大写 --- 1变成壹
    public static String getCapitalNumber (int number){
        String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        String result = arr[number];
        return result;

    }
}

1.9、手机号屏蔽

  • String substring(int beginIndex,int endIndex)截取
    • 包头不包尾,包左不包右
    • 只有返回值才是截取值
  • String substring(int beginIndex)截取到末尾
package itheimaTest;

public class StringTest5 {
    public static void main(String[] args) {
        //定义一个字符串来记录手机号码
        String phoneNumber = "13112344685";
        //截取手机号码前三位
        String start = phoneNumber.substring(0,3);
        //截取手机号码后三位
        String end = phoneNumber.substring(7,11);
        //拼接
        String result = start + "****" + end;
        //打印结果
        System.out.println(result);
    }
}

身份证号码信息查看

package itheimaTest;

public class StringTest5 {
    public static void main(String[] args) {
        //定义一个字符串用来记录身份证号码
        String id = "321281202001011234";
        //将身份证号码中的年月日截取出来
        String year = id.substring(6,10);
        String month = id.substring(10,12);
        String day = id.substring(12,14);
        //打印该人物的出生日期
        System.out.println("该人物信息为:");
        System.out.println("出生年月日:" + year + "年" + month + "月" + day + "日");
        //获取表达性别的数字
        char gender = id.charAt(16);
        int num = gender - 48;
        if (num % 2 == 0){
            System.out.println("性别为:女");
        }else {
            System.out.println("性别为:男");
        }


    }
}

敏感词替换

  • String replace(旧值,新值)替换
    • 注意点:只有返回值才是替换之后的结果
package itheimaTest;

public class StringTest5 {
    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);
    }
}

1.10、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

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

对称字符串

  • 需求:键盘接收一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是
  • 对称字符串:123321、111
  • 非对称字符串:123123
package itheimaTest;

import java.util.Scanner;

public class StringBuilderTest5 {
    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("该字符串不是对称字符串");
        }

    }
}

1.11、StringJoiner

StringJoiner概述

  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
  • 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用

StringJoiner的构造方法

方法名说明
public StringJoiner(间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号

StringJoiner的成员方法

方法名说明
public StringJoiner add(添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串(该字符串就是拼接之后的结果)

1.12、字符串原理

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

  • 直接赋值会复用字符串常量池中的
  • new出来不会复用,而是开辟一个新的空间

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

  • 基本数据类型比较数据值
  • 引用数据类型比较地址值

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

  • 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
  • 字符串拼接的时候有变量参与:在内存中创建了很多对象浪费空间,时间也非常慢
  • 结论:如果很多字符串变量拼接,不要直接+。在底层会创建多个对象,浪费时间,浪费性能。

字符串拼接的时候,如果有变量:
JDK8以前:

  • 系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。
  • 拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象。

JDK8版本:

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

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

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

扩展底层原理5:StringBuilder源码分析

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

1.13、罗马数字的两种方法

键盘录入一个字符串,

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

要求2:只能是数字将内容变成罗马数字

下面是阿拉伯数字跟罗马数字的对比关系
Ⅰ-1、Ⅱ -2、Ⅲ- 3、Ⅳ- 4、Ⅴ - 5、Ⅵ- 6、Ⅶ- 7、Ⅷ- 8、Ⅸ- 9
注意点:

罗马数字里面是没有0的

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

package itheimaTest;

import java.util.Scanner;

public class StringTest6 {
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        String str;
        while (true) {
            System.out.println("请输入一个字符串");
            str = sc.next();
            boolean check = checkStr(str);
            if(check){
                break;
            }else {
                System.out.println("输入的字符串不符合要求");
            }

        }

        //遍历字符串并将其转化为罗马数字
        String result = "";
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            int number = c - 48;
            String a = toLuoMa(number);
            result = result + a;
        }
        System.out.println(result);


    }

   //定义一个方法的将数字转变成罗马数字
    //Ⅰ-1、Ⅱ -2、Ⅲ- 3、Ⅳ- 4、Ⅴ - 5、Ⅵ- 6、Ⅶ- 7、Ⅷ- 8、Ⅸ- 9
    public static String toLuoMa(int number){

        String[] arr = {"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ"};

        String luoMa = arr[number];
        return luoMa;

    }


    //定义一个方法判断录入的字符串是否符合要求
    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);
            if (c <= '0' || c >= '9'){
                return false;
            }
        }
        return true;
    }


}

1.14、调整字符串

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

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

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

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

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

package String;

public class moveString {
    public static void main(String[] args) {
        String str1 = "asdfg";
        String str2 = "dfgas";

        System.out.println(flag (str1,str2));
    }
//判断字符串是否与旋转后的相同
    public static boolean flag (String strA,String strB){
        for (int i = 0; i < strA.length(); i++) {
            strA =  roate (strA);
            if(strA.equals(strB)){
                return true;
            }
        }
        return false;
    }
    //方法一:通过字符串截取的方法旋转字符串
    public static String roate (String str){

        char first = str.charAt(0);
        String end = str.substring(1);

        return end+first;
    }
/*
    //方法二:通过字符数组的方式旋转字符串
     public static String roate (String str){
       char[] arr =  str.toCharArray();

        char first = arr[0];
         for (int i = 1; i < str.length(); i++) {
             arr[i-1] = arr[i];
         }
         arr[arr.length-1] = arr[0];
         String str2 = new String(arr);
         return str2;
    }
*/
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值