I love Java(2)

I love Java


前言

大家好!我是小笙!我以后想走的方向是Java后端开发的工程师,我最近想要进一步深入学习Java,主要是想巩固基础,所以想和大家一起来谈谈Java.同时我再次申明以下内容是我通过学习黑马程序猿等视频的总结,但是都是纯手打和加入个人的总结!这次我探讨的是字符串有关的知识点

Java02 API String StringBuilder

一、API

1.1 API概述

我知道很多初学者对API这个概念还是很不理解!所以今天我来说一说
API(Application Programming Interface,应用程序接口)
指的是JDK中提供的各种功能功能java类,这些类将底层的实现封装了起来,我们不关心怎么实现的,我们的更加关心如何去使用!

1.2 帮助文档

Java 11在线中文文档
你可以下载jdk的官方文档去下载!我觉得是非常有用的!建议!

1.3 API使用练习(以Scanner为例)

学会看API文档对程序员来说很重要!很重要!很重要!!

I love Java(2)
很多方法,你都可以尝试,我举一例:

package javase_Scanner_use;

import java.util.Scanner;

/**
 * @author Al_tair
 * @date 2021/6/29-21:33
 */
/**
 * Scanner : 用于获取键盘录入数据( primitive types and strings)
 * public String nextLine(); 获取键盘录入的字符串数据
 * Advances this scanner past the current line and returns the input that was skipped.
 * This method returns the rest of the current line, excluding any line separator at the end.
 * The position is set to the beginning of the next line.
 * 
 * 注意:
 * 调用方法的时候,如果方法有明确的返回值,我们用变量接受可以手动完成
 * 也可以使用快捷键(Ctrl+Alt+V)
 */
public class ScannerDemo {
    public static void main(String[] args) {
        // 创建对象
        Scanner sc = new Scanner(System.in);

        // 接受数据
        System.out.print("输入一段字符串:");
        String string = sc.nextLine();
        
        // 输出结果
        System.out.println("输入的字符串:"+string);

    }
}

二、String

2.1 String概述

    /**
     * String 概述
     * The String class represents character strings.
     * All string literals in Java programs,such as "abc",
     * are implemented as instances of this class.
     * 意思是:String类代表字符串 ,所有"..."都是String类的实现对象
     */

I love Java(2)

2.11 字符串的特点

  1. 字符串是不可变,他们的值在创建后不能被更改
  2. 虽然String的值是不可以变的,但是他们是可以被共享的
  3. 字符串的效果上相当于字符数组(char[]),但是底层实现上是字节数组(byte[])
    I love Java(2)

2.2 String构造函数

I love Java(2)

2.21 String类的运用

I love Java(2)

2.3 String 对象的特点

        /**
         * String 对象的特点
         */
        /**
         *  1.通过new创建的对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值是不相同的,因为是两个对象
         *    System.identityHashCode(S1) 只能确定引用的不同,不能用于查询内存地址,只是对象的唯一标识符号
         */
        char[]ch = {'A','l','_','t','a','i','r'};
        String S1 = new String(ch);
        String S2 = new String(ch);
        System.out.println(System.identityHashCode(S1));
        System.out.println(System.identityHashCode(S2));

        System.out.println("**********************************");

        /**
         * 2.直接赋值方式的字符串,只要字符内容相同,无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池进行维护
         *   2.0 解释一下字符串池的概念 位置是在方法区的常量池中
         *   2.1在JVM层面为字符串提供字符串常量池,可以理解为是一个缓存区;
         *   2.2创建字符串常量时,JVM会检查字符串常量池中是否存在这个字符串;
         *   2.3若字符串常量池中存在该字符串,则直接返回引用实例;若不存在,先实例化该字符串,
         *      并且,将该字符串放入字符串常量池中,以便于下次使用时,直接取用,达到缓存快速使用的效果。
         */
         String S3 = "AL_tair";
         String S4 = "AL_tair";
         System.out.println(System.identityHashCode(S3));
         System.out.println(System.identityHashCode(S4));

I love Java(2)

2.4 String类 代码的运行内存分布

2.41 常量池存放的历史

I love Java(2)
I love Java(2)

2.5 字符串的比较

1.做==比较

  • 基本类型:比较的是数据值是否相同
  • 引用类型:比较的是地址值是否相同

2.比较字符串的值是否相同,是用一个方法实现的:equals()
I love Java(2)
代码的实现

package javase_String_use;

import java.sql.SQLOutput;

/**
 * @author Al_tair
 * @date 2021/6/30-16:11
 */
public class StringCompare {
    /**
     * 字符串的地址和数据的比较实现
     */
    public static void main(String[] args) {
        // 构造方法获得对象
        char[]c = {'A','l','_','t','a','i','r'};
        String S1 = new String(c);
        String S2 = new String(c);
        // 直接赋值的方式获得对象
        String S3 = "Al_tair";
        String S4 = "Al_tair";

        // 比较字符串地址是否相同
        System.out.println(S1==S2);
        System.out.println(S1==S3);
        System.out.println(S3==S4);

        System.out.println("**********************************");

        // 比较字符串数据是否相同
        System.out.println(S1.equals(S2));
        System.out.println(S1.equals(S3));
        System.out.println(S3.equals(S4));
    }
}

案例:用户登录

需求:已知用户名和密码,请用程序实现模拟用户登入,总共给三次机会,登入之后,给出相应的提示信息
思路
1.已知用户名和密码,定义两个字符串即可
2.键盘录入要登入的用户名和密码,Scanner实现
3.拿键盘录入的用户名,密码与已知的用户名和密码进行比较,给出相应的提示。比较用方法.equals()实现
用循环实现多次机会,使用break结束循环

package javase_String_Test;

import java.util.Scanner;

/**
 * @author Al_tair
 * @date 2021/7/2-20:04
 */
public class StrgingTest {
    /**
     *  案例:用户登录
     *
     * 需求:已知用户名和密码,请用程序实现模拟用户登入,总共给三次机会,登入之后,给出相应的提示信息
     * 思路:
     * 1.已知用户名和密码,定义两个字符串即可
     * 2.键盘录入要登入的用户名和密码,Scanner实现
     * 3.拿键盘录入的用户名,密码与已知的用户名和密码进行比较,给出相应的提示。比较用方法.equals()实现
     * 4.用循环实现多次机会,使用break结束循环
     */
    public static void main(String[] args) {
        // 1.已知用户名和密码,定义两个字符串就可以了
        String Username = "Al_tair";
        String Password = "I love Java";

        // 2.键盘录入要登入的用户名和密码,Scanner实现
        for (int i = 0; i < 3; i++) {
            System.out.println("***********************************************");
            System.out.print("请输入用户名:");
            Scanner sc = new Scanner(System.in);
            String username = sc.nextLine();
            System.out.print("请输入密码:");
            String password = sc.nextLine();

        // 3.拿键盘录入的用户名,密码与已知的用户名和密码进行比较
            if(Username.equals(username) && Password.equals(password)) {
                System.out.println("登入成功");
                break;
            }else if(i == 3){
                System.out.println("登入失败,没有尝试机会了!!");
            }else {
                System.out.println("登入失败,你还有"+(2-i)+"次机会");
            }
            System.out.println("***********************************************");
        }
    }
}

案例:遍历字符串

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
思路
1.键盘录入一个字符串用Scanner实现
2.遍历字符串,首先能够获取到字符串中的每一个字符 public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始
3.遍历字符串,其次要能够获取到字符串的长度 public int length():返回此字符串的长度 数组的长度:数组名.length 字符串的长度: 字符串对象.length()
4.遍历字符串的通用格式 for(int i=0;i<s.length();i++){
s.charAt(i); //就是指定索引处的字符值 }

package javase_String_traversal;

import java.util.Scanner;

/**
 * @author Al_tair
 * @date 2021/7/15-23:07
 */
public class StringTraversal {
    /**
     * 需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
     * 思路:
     * 1.键盘录入一个字符串用Scanner实现
     * 2.遍历字符串,首先能够获取到字符串中的每一个字符
     *  public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始
     * 3.遍历字符串,其次要能够获取到字符串的长度
     *  public int length():返回此字符串的长度
     *  数组的长度:数组名.length
     *  字符串的长度: 字符串对象.length()
     * 4.遍历字符串的通用格式
     *  for(int i=0;i<s.length();i++){
     *      s.charAt(i); //就是指定索引处的字符值
     *  }
     */
    public static void main(String[] args) {
        // 1.键盘录入一个字符串用Scanner实现
        System.out.print("请输入一个字符串:");
        Scanner sc = new Scanner(System.in);
        String string = sc.nextLine();

        // 2.遍历字符串,首先能够获取到字符串中的每一个字符
        // 3.遍历字符串,其次要能够获取到字符串的长度
        for (int i = 0; i < string.length(); i++) {
            System.out.println("第"+(i+1)+"个字符是:"+string.charAt(i));
        }
    }
}

案例:统计字符次数

需求:键盘录入一个字符串,统计字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
思路
1.键盘录入一个字符串,用Scanner实现
2.要统计三种类型的字符个数,需定义三个统计变量,初始值为0
3.遍历字符串,得到每一个字符
4.判断该字符属于哪种类型,然后对应类型的统计变量+1
5.输出三种类型的字符个数

package javase_String_count;

import java.util.Scanner;

/**
 * @author Al_tair
 * @date 2021/7/19-12:58
 */
public class StringCount {
    /**
     * 需求:键盘录入一个字符串,统计字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
     * 思路:
     * 1.键盘录入一个字符串,用Scanner实现
     * 2.要统计三种类型的字符个数,需定义三个统计变量,初始值为0
     * 3.遍历字符串,得到每一个字符
     * 4.判断该字符属于哪种类型,然后对应类型的统计变量+1
     * 5.输出三种类型的字符个数
     */
    public static void main(String[] args) {
        // 1.键盘录入一个字符串,用Scanner实现
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String string = sc.nextLine();

        // 2.要统计三种类型的字符个数,需定义三个统计变量,初始值为0
        int CountA = 0,Counta = 0,Count0 = 0;

        // 3.遍历字符串,得到每一个字符
        // 4.判断该字符属于哪种类型,然后对应类型的统计变量+1
        for (int i = 0; i < string.length(); i++) {
            if(string.charAt(i) >= 'A' && string.charAt(i) <= 'Z'){
                CountA++;
            }else if(string.charAt(i) >= 'a' && string.charAt(i) <= 'z'){
                Counta++;
            }else if(string.charAt(i) == (int)string.charAt(i) ){
                Count0++;
            }
        }

        // 5.输出三种类型的字符个数
        System.out.println("大写字母字符个数:"+CountA);
        System.out.println("小写字母字符个数:"+Counta);
        System.out.println("数字字符个数:"+Count0);
    }
}

案例:拼接字符串

需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
思路:
1.定义一个int了类型的数组,用静态初始化完成数组元素的初始化
2.定义一个方法,用于把int数组中的数据按照指定格式拼接成一个字符串返回,返回类型String,参数列表int[] arr
3.在方法中遍历数组,按照要求进行拼接
4.调用方法,用一个变量接收数据
5.输出结果

package javase_String_concat;

/**
 * @author Al_tair
 * @date 2021/7/19-15:32
 */
public class StringConcat {
    /**
     * 需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
     * 思路:
     * 1.定义一个int了类型的数组,用静态初始化完成数组元素的初始化
     * 2.定义一个方法,用于把int数组中的数据按照指定格式拼接成一个字符串返回,返回类型String,参数列表int[] arr
     * 3.在方法中遍历数组,按照要求进行拼接
     * 4.调用方法,用一个变量接收数据
     * 5.输出结果
     */
    public static void main(String[] args) {
        // 1.定义一个int了类型的数组,用静态初始化完成数组元素的初始化
        int []arr = {1,2,3,4,5};
        
        // 4.调用方法,用一个变量接收数据
        // 5.输出结果
        String string = concat(arr);
        System.out.println(string);
    }

    //  2.定义一个方法,用于把int数组中的数据按照指定格式拼接成一个字符串返回,返回类型String,参数列表int[] arr
    public static String concat(int []arr) {
        String sum = "[";
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            if(i != arr.length-1)
                sum += ",";
            else{
                sum += "]";
            }
        }
        return sum;
    }
}

案例:字符串反转

需求:定义一个方法,实现字符串的反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
思路
1.键盘录入一个字符串,用Scanner实现
2.定义一个方法,实现字符串反转。返回值类型String,参数String s
3.在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符串并返回
4.调用方法,用一个变量接收结果
5.输出结果

package javase_String_invert;

import java.util.Scanner;

/**
 * @author Al_tair
 * @date 2021/7/19-16:21
 */
public class StringInvert {
    /**
     * 需求:定义一个方法,实现字符串的反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
     * 思路:
     * 1.键盘录入一个字符串,用Scanner实现
     * 2.定义一个方法,实现字符串反转。返回值类型String,参数String s
     * 3.在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符串并返回
     * 4.调用方法,用一个变量接收结果
     * 5.输出结果
     */

    public static void main(String[] args) {
        // 1.键盘录入一个字符串,用Scanner实现
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String string = sc.nextLine();

        // 4.调用方法,用一个变量接收结果
        // 5.输出结果
        string = invert(string);
        System.out.println(string);


    }
    // 2.定义一个方法,实现字符串反转。返回值类型String,参数String s
    // 3.在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符串并返回
    public static String invert(String s){
        String sum = "";
        for (int i = s.length()-1; i >= 0;i--) {
            sum += s.charAt(i);
        }
        return sum;
    }
}

三、StringBuilder

3.1 StringBuilder概述

StringBuilder 是一个可变的字符串类,我们把它看成是一个容器,这里的可变指的是StringBuilder对象的内容是可变的
详情见API文档
I love Java(2)

3.2 StringBuilder的构造方法

I love Java(2)

3.3 StringBuilder的添加和反转方法

public StringBuilder append();
// 链式编程
StringBuilder strb = new StringBuilder();
strb.append("hello ").append("world! ").append(Java!);

I love Java(2)

public StringBuilder reverse();

I love Java(2)

3.4 StringBuilder和String相互转换

3.41 StringBuilder转换为String

// 通过toString()就实现把StringBuilder转换成String
public String toString();

3.42 String转换为StringBuilder

// 通过构造方法就可以实现把String转换成StringBuilder
public StringBuilder(String s)
package javase_StringBuilder_String;

/**
 * @author Al_tair
 * @date 2021/7/20-13:26
 */
public class StringBuilderTurn {
    /**
     * 通过toString()就实现把StringBuilder转换成String
     * public String toString();
     * 通过构造方法就可以实现把String转换成StringBuilder
     * public StringBuilder(String s)
     */
    public static void main(String[] args) {
        // StringBuilder 转换成 String
        StringBuilder sb = new StringBuilder();
        sb.append("hello ").append("world!");

        String s = sb.toString();
        System.out.println(s);

        // String 转换成 StringBuilder
        String s1 = new String("I Love Java!");
        StringBuilder sb1 = new StringBuilder(s1);
        sb1.append(" Please Join me!");
        System.out.println(sb1);

    }
}

上一篇:好听的微信号


下一篇:[Codeforces 1523D] Love-Hate