Java 第九天(纯干货)(Api 、String 、StringBuilder)(带你14天了解并掌握Java SE)

今日内容

  • API概述与Object类的功能介绍
  • String类的功能介绍
  • StringBuilder类的功能介绍

01. API的概述和使用步骤

  • 1. 什么是API?
  • 2. 如何使用API?
总结:
    1: Application Parmgring Interface  (应用程序编程接口)

            大白话: 其实就是学习java已经写好的类, 这些类中的功能

    2:
        A:打开帮助文档
        B:点击显示,找到索引,看到输入框
        C:你要学习什么内容,你就在框框里面输入什么内容
              举例:Random
        D:看包
        java.lang包下的类在使用的时候是不需要导包的
        E:看类的描述
            Random类是用于生成随机数的类
        F:看构造方法
            Random():无参构造方法
                Random r = new Random();
        G:看成员方法
               public int nextInt(int n):产生的是一个[0,n)范围内的随机数
                调用方法:
                    看返回值类型:人家返回什么类型,你就用什么类型接收
                    看方法名:名字不要写错了
                    看形式参数:人家要几个参数,你就给几个,人家要什么数据类型的,你就给什么数据类型的
                    int number = r.nextInt(100);

02. 通过Scanner获取字符串数据

  • next方法与nextLine的区别
  • nextInt与nextLine的注意事项
总结:
    1. 
        共同点: 都是用于键盘接受字符串.
        不同点:    
                结束标记不一样
                next() : 遇到了空格或者是tab键, 就不再录入了
                nextLine() : 遇到了回车换行就不再录入了
    2.

        现象: nextInt与nextLine配合使用的话, nextLine将不会再有键盘录入的机会

                原因: 键盘录入了10之后, 实际上在内存中记录的是10\r\n

                        10被整数变量num所记录了, \r\n被nextLine遇到了, 遇到了结束标记之后, 就结束自己的任务, 所以第二次录入的机会就没有了

                System.out.println("请输入一个整数:");
                int num = sc.nextInt();         // 10
                                                // \r\n

                System.out.println("请输入一个字符串:");
                String s = sc.nextLine();       // 回车换行

        解决:

                今后无论是字符串还是整数, 所有的数据都以nextLine字符串的形式进行接收

                    如果想要进行数学的四则运算, 可以使用包装类, 将字符串转换为数字

                            int num = Integer.parseInt("123");

03. Object类的toString()方法

  • 什么是Object类?
  • Object类中的toString方法返回的是什么?
总结:
    1. Object类是所有类父类, 所有的类都直接或者间接的继承到了Object

            换句话来说, Object类中的方法, 所有的类都可以进行使用.

    2. Object类中的toString方法, 默认返回            ->  全类名@十六进制地址值

            默认返回的地址值对我们来说没有意义, 我们希望数据展示的更加方便, 就可以去重写Object类的toString方法

    3. toString方法存在的意义:

            单独使用Object类默认的toString没有意义, 一般我们会重写Object类的toString方法, 在方法内部输出本对象的属性

                为了[让数据展示的更加方便]

练习:
    5分钟, 编写标准学生类, 加入toString方法
        alt + shift + s + s   : 自动生成toString方法

结论:
    如果打印一个对象的引用, 结果不是全类名 + 16进制哈希值的话, 说明该对象就重写了toString方法

04. Object类的equals()方法

  • equals方法的作用?
  • equals方法跟==号的区别?
总结:
    1. equals方法是用于对象之间做比较的.

    2.
        ==号可以比较基本数据类型, 也能比较引用数据类型
                基本数据类型: 具体的值
                引用数据类型: 地址值

        equals方法只能比较引用数据类型

                细节: 如果直接使用Object类的equals比较, 默认比较的还是地址值

                        我们需要重写equals方法, 方法内部根据属性进行比较.

                代码:
                        @Override
                        public boolean equals(Object obj) {     // Object obj = p2;
                                                                // 错误: Object obj = new Demo2_Equals();

                            if(obj instanceof Person){
                                // 为了调用子类特有的属性和行为, 需要向下转型
                                Person p = (Person) obj;    
                                return this.age == p.age && this.name.equals(p.name);
                            }else{
                                return false;
                            }

                        }



分析eclipse自动生成的equals方法, 要求能够看得懂.   alt + shift + s + h 

    @Override
    public boolean equals(Object obj) {
        if (this == obj)                // 如果当前对象和传入对象的地址值相同, 直接返回true
            return true;
        if (obj == null)                // 如果传入的对象为null, 那就说明当前对象有值, 传入对象没值, 没有可比性了, 返回false
            return false;
        if (getClass() != obj.getClass()) // 如果当前对象的字节码和传入对象的字节码不一致, 说明类型不一样, 没有可比性, 返回false
            return false;
        Person other = (Person) obj;    // 向下转型
        if (age != other.age)           // 年龄不同, 直接返回false
            return false;

        if (name == null) {
            if (other.name != null)     // 当前对象的name如果为null, 传入对象的name不是null, 直接返回false
                return false;
        } else if (!name.equals(other.name))  // 如果姓名不一样, 返回false;
            return false;


        return true;
    }

练习:
    5分钟, 编写标准学生类, 加入toString和equals方法

05. String类的概述和构造方法

  • 1. 什么是String类? 跟普通的类对比,有什么特殊之处?
  • 2. 构造方法
总结:
    1:  String指的就是字符串, 但是String类比较特殊, 直接写一个双引号, 就相当于是创建了一个对象.
            必须掌握的概念: String是一个不可改变的字符序列

                // String是一个不可改变的字符序列
                String s = "abc";
                s = "def";      // 这里是使用新对象的地址值, 去替换了原对象, 原对象中的数据没有发生任何改变.


    2:
        String(String original):把字符串数据封装成字符串对象

        String(char[] value):把字符数组的数据封装成字符串对象

        String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象

    注意:
            String s = "123";                               
            String s = new String("123");

06. String创建对象的特点

  • 看图说话
字符串常量池:

        每一次使用双引号创建对象的时候, 都会先检查字符串常量池中, 是否有该对象

                没有: 创建

                有 : 不再创建, 而是直接复用已经存在的

构造方法创建和直接赋值的区别:

        String s = new String("123");  // 这一步是创建了两个对象       1. 字符串常量池       2. 堆内存      s变量记录的是堆内存
        String s = "123"; // s记录的是字符串常量池


jdk1.8版本之后, 字符串常量池从方法区移动到了堆内存

07. String的练习之模拟用户登录

  • 需求: 模拟登录,给三次机会,并提示还有几次
  • 分析:
1. 定义两个字符串对象,用于存储(已经存在)的用户名和密码
2. 键盘录入用户名和密码
3. 拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
    拿谁比? equals
4. 如果内容相同,提示登录成功
5. 如果内容不同,提示登录失败,并提示还有几次机会
  • 7分钟时间实现

08. String的练习之字符串遍历

  • 需求: 获取字符串中的每一个字符
第一种遍历方式:
     * int length():获取字符串的长度,其实也就是字符个数
     * char charAt(int index):获取指定索引处的字符
         * // StringIndexOutOfBoundsException --> 字符串索引越界异常

        for(int i = 0; i < s.length(); i++){
            System.out.println(s.charAt(i));
        }

第二种遍历方式:
    * char[] toChatArray()  : 将字符串拆分成字符数组

        char[] cArr = s.toCharArray();
        for (int i = 0; i < cArr.length; i++) {
            System.out.println(cArr[i]);
        }
  • 3分钟时间练习

09. String的练习之数组元素拼接成指定格式的字符串

  • 需求: 方法接收一个int类型数组, 将数组中的数字拼接成字符串

    • 例如: int[] arr = {1,2,3}; --> [1, 2, 3]
  • 案例演示

10. String的练习之字符串反转

  • 需求: 键盘录入abc字符串 输出结果cba
  • 分析:
A:键盘录入一个字符串
B:写方法实现字符串的反转
    a:把字符串倒着遍历,得到的每一个字符拼接成字符串。
    // b:把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
C:调用方法
D:输出结果
  • 5分钟时间练习

11. StringBuilder的概述以及与String的区别

  • 1. 什么是StringBuilder - StringBuffer
  • 2. String跟StringBuilder的区别是?
总结:
    1. StringBuilder字符串的缓冲区(提高字符串的操作效率)
    2. String是一个[不可改变]的字符序列
       StringBuilder是一个[可以改变]的字符序列
  • 3. StringBuilder怎么样提高效率的?
    画图解释

    字符串的拼接: 每一次用+号串联的时候, 底层都会重新创建一个StringBuilder, 然后再通过append方法完成链接, 最后通过toString方法转换成字符串
                        ---这个步骤, 是每一次相加都会进行的步骤---           所以说非常消耗内存

    StringBuilder的拼接: 单独在堆内存中创建一块空间, 所有的数据拼接, 都在这一块空间内进行. 
                            如果想转成字符串, 可以在拼接结束后, 手动调用toString方法进行转换.

12. StringBuilder的构造方法

  • A:构造方法: StringBuilder() : 创建字符串缓冲区, 缓冲区中没有数据 StringBuilder(String str) : 创建字符串缓冲区, 缓冲区中最开始带有传入的字符串

  • B:成员方法: public int length():返回长度(已经存储的字符个数)

13. StringBuilder的添加和反转方法

  • public StringBuilder append(任意类型):添加数据,并返回自身对象
    * StringBuilder是一个可以改变的字符序列
            // 链式编程 : 当一个方法返回的是一个对象, 对象就可以继续向下调用方法
            sb.append("123").append("456").append("789");
  • public StringBuilder reverse():反转功能

14. StringBuilder和String的相互转换

  • StringBuilder -- String
    • public String toString():通过toString()就可以实现把StringBuilder转成String
        StringBuilder sb = new StringBuilder();
        sb.append("itheima");
        String str = sb.toString();
  • String -- StringBuilder
    • StringBuilder(String str):通过构造方法就可以实现把String转成StringBuilder
        StringBuilder sb = new StringBuilder("123");

15. StringBuilder的练习之数组元素拼接成指定格式的字符串

  • 需求: int[] arr = {1, 2, 3} --> [1, 2, 3]

    • StringBuilder实现
  • 5分钟练习

16. StringBuilder的练习之字符串反转

  • 需求: 键盘录入一个字符串将内容反转
  • 5分钟练习

17. StringBuilder和StringBuffer的区别

  • 1. StringBuilder是jdk1.5版本的, StringBuffer是jdk1.0版本的
  • 2. StringBuilder是线程不安全的, StringBuffer是线程安全的.
    线程安全(线程同步):

            效率低

    线程不安全(线程不同步):

            效率高
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章