A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 xiekai_sjz 于 2018-9-9 09:54 编辑

day07 Scanner类, Random类, ArrayList类    我们已经学习了面向对象的基本知识,接下来我们将要学习java中API的使用。今天我们来学习用于键盘录入的Scanner,用于生成随机数的Random,和ArrayList集合。


以下是今天的学习目标:
  • 能够明确API的使用步骤
  • 能够使用Scanner类获得键盘录入数据
  • 能够使用Random类生成随机数
  • 能够使用数组存储自定义类型并遍历
  • 能够使用ArrayList集合的构造方法创建ArrayList集合对象
  • 能够使用ArrayList集合存储数据
  • 能够使用ArrayList集合中常用的方法
  • 能够使用ArrayList集合存储字符串并遍历
  • 能够使用ArrayList集合存储自定义对象并遍历
  • 能够使用ArrayList类作为形式参数和返回值类型




以下是今天的详细笔记:

Scanner类&匿名对象
API概述和使用步骤
API: Application Programming Interface, 应用程序编程接口
        其实就是JDK中定义好的类和方法

API文档: 就是这些类和方法的说明. 类似于说明书, 字典
Scanner概述及其API文档的使用
引用类型的一般使用步骤:
    1. 导包: 实际上是导入包中的类  import 包名.类名;
        同一个包中的类不用导包
        java.lang包中的类不需要手动导包
        2. 创建对象
                类名 对象名 = new 类名();
        3. 使用方法
                对象名.成员方法名();
Scanner的使用步骤
java.util.Scanner: 可以解析基本类型和字符串的简单文本扫描器
        构造方法
                Scanner(InputStream source): 创建对象并指定输入流
        成员方法
                int nextInt(): 获取键盘录入的整数, 以int形式返回
                String next(): 获取键盘录入的数据, 以字符串形式返回 (以空白字符作为录入结束)
        补充:
                String nextLine(): 获取键盘录入的一行数据, 以字符串形式返回. (以换行符作为录入结束)
               
Scanner使用步骤:
        1. 导包
                import java.util.Scanner;
        2. 创建对象
                Scanner sc = new Scanner(System.in);
        3. 调用方法
                int num = sc.nextInt();
                String str = sc.next();
补充:
[Java] 纯文本查看 复制代码
// 导包
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // 创建Scanner类的对象. System.in表示从标准输入流(键盘)获取数据
                Scanner sc = new Scanner(System.in); 
                // 使用对象调用方法获取键盘录入的整数
                int i = sc.nextInt(); 
                // 使用对象调用方法获取键盘录入的字符串
                String s = sc.next();
    }
}

Scanner练习一: 键盘输入两个数字求和
5分钟练习:
需求: 键盘输入两个int数字,求和并打印结果
代码:
[Java] 纯文本查看 复制代码
import java.util.Scanner;

/*
需求: 键盘输入两个int数字,求和并打印结果
 */
public class Test {
    public static void main(String[] args) {
        // 创建Scanner对象
        Scanner sc = new Scanner(System.in);

        // 提示输入
        System.out.println("请输入第一个数字:");
        int a = sc.nextInt();
        System.out.println("请输入第二个数字:");
        int b = sc.nextInt();

        // 计算结果并打印
        int result = a + b;
        System.out.println("结果是:" + result);
    }
}

Scanner练习二: 键盘输入三个数字求最大值5分钟练习:
需求: 键盘输入三个int数字,求最大值并打印
代码:
[Java] 纯文本查看 复制代码
import java.util.Scanner;

/*
需求: 键盘输入三个int数字,求最大值并打印
 */
public class Test {
    public static void main(String[] args) {
        // 创建Scanner对象
        Scanner sc = new Scanner(System.in);

        // 提示输入
        System.out.println("请输入第一个数字:");
        int a = sc.nextInt();
        System.out.println("请输入第二个数字:");
        int b = sc.nextInt();
        System.out.println("请输入第三个数字:");
        int c = sc.nextInt();

        // 利用三元运算符比较
        int temp = a > b ? a : b;
        int max = temp > c ? temp : c;

        System.out.println("最大值:" + max);
    }
}

匿名对象的说明
匿名对象: 没有变量名的对象
    // 普通创建对象
    Person p = new Person();

    // 匿名对象
    new Person();

注意事项:
        匿名对象只能使用一次

使用场景:
        如果一个对象只使用一次, 就可以用匿名对象的形式

匿名对象的用途:
    1. 调用成员变量或成员方法
    2. 作为参数传递
    3. 作为返回值返回
匿名对象应用场景: 作为方法的参数和返回值
匿名对象也是对象, 所以也可以作为 参数 和 返回值
[Java] 纯文本查看 复制代码
public static void method(Scanner sc) {
        //...
}

// 调用方法 
Scanner sc = new Scanner(System.in);
method(sc);   // 能否简化?
method(new Scanner(System.in));


public static Scanner method() {
    Scanner sc = new Scanner(System.in);
    return sc;  // 能否简化?
    return new Scanner(System.in);
}



[Java] 纯文本查看 复制代码
import java.util.Scanner;

public class Demo02Anonymous {

    public static void main(String[] args) {
        // 普通创建对象方式
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();

        // 匿名对象直接调用方法
        int num = new Scanner(System.in).nextInt();

        // 匿名对象作为参数
        methodParam(new Scanner(System.in));

                // 匿名对象作为方法返回值
        Scanner sc = methodReturn();
    }

    public static void methodParam(Scanner sc) {
        int num = sc.nextInt();
        System.out.println("输入的是:" + num);
    }

    public static Scanner methodReturn() {
        return new Scanner(System.in);
    }
}


Random类&对象数组Random概述和基本使用
java.util.Random: 用于生成随机数
        构造方法
                Random(): 创建对象
        成员方法
                int nextInt(): 生成范围是int范围的随机数, 包含正负
                int nextInt(int n): 生成一个 0~n (包含0不包含n)范围的随机数

使用步骤:
    1. 导包
    2. 创建对象
    3. 对象调用方法

[Java] 纯文本查看 复制代码
// 导包
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        // 创建Random类的对象
        Random r = new Random();
        // 调用方法生成随机数
        int i = r.nextInt();
    }
}

Random生成指定范围的随机数
int nextInt(int n): 生成一个 0~n (包含0不包含n)范围的随机数

[Java] 纯文本查看 复制代码
// 导包
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        // 创建Random类的对象
        Random r = new Random();
        // 调用方法生成随机数
        int i = r.nextInt(10);  // [0, 9]
    }
}

Random练习一: 生成1-n之间的随机数
知识点:
如何调整随机数的范围
[0-9] r.nextInt(10);
[1-10] r.nextInt(10) + 1;
[1-9] [0-8] + 1   r.nextInt(9) + 1;

总结:
通过 nextInt(参数) + 偏移量 来控制范围    Random r = new Random();    r.nextInt(n) + 1;
补充:
[Java] 纯文本查看 复制代码
// 说出随机数范围
r.nextInt(10);      // [0,9], [0,10)
r.nextInt(10) + 1;  // [1,10]
r.nextInt(10) - 1;  // [-1, 8]
r.nextInt(11);      // [0, 10]

Random练习二: 猜数字小游戏

5分钟练习:
需求: 用代码模拟猜数字[1,100]的小游戏
代码:
[Java] 纯文本查看 复制代码
import java.util.Random;
import java.util.Scanner;

/*
需求: 用代码模拟猜数字[1,100]的小游戏
 */
public class Test {
    public static void main(String[] args) {
        // 创建Random对象
        Random r = new Random();
        int randomNum = r.nextInt(100) + 1;  // [1,100]

        // 创建Scanner对象
        Scanner sc = new Scanner(System.in);

        // 死循环猜
        while (true) {
            // 提示输入
            System.out.print("请输入一个数字:");
            int guess = sc.nextInt();

            // 判断
            if (guess > randomNum) {
                System.out.println("大了");
            } else if (guess < randomNum) {
                System.out.println("小了");
            } else {
                System.out.println("恭喜你, 猜中了");
                break; // 结束循环
            }
        }

        System.out.println("游戏结束");
    }
}


[Java] 纯文本查看 复制代码
import java.util.Random;
import java.util.Scanner;

/*
限制次数的猜数字
 */
public class Test2 {
    public static void main(String[] args) {
        // 创建Random对象
        Random r = new Random();
        int randomNum = r.nextInt(100) + 1;  // [1,100]

        // 创建Scanner对象
        Scanner sc = new Scanner(System.in);

        // 定义一个布尔变量, 表示是否猜中
        boolean correct = false;

        // 限制10次
        for (int i = 0; i < 10; i++) {
            // 提示输入
            System.out.print("请输入一个数字:");
            int guess = sc.nextInt();

            // 判断
            if (guess > randomNum) {
                System.out.println("大了");
            } else if (guess < randomNum) {
                System.out.println("小了");
            } else {
                // 猜中后, 修改boolean变量为true
                correct = true;
                break; // 结束循环
            }
        }

        // 循环结束后, 根据布尔变量判断是否是猜对结束的, 还是没猜对结束的
        if (correct) {
            System.out.println("恭喜你, 猜中了");
        } else {
            System.out.println("抱歉, 次数已到");
        }
    }
}

对象数组
知识点:
数组中能存引用数据类型吗
对象数组中存放的是什么

// 存储基本类型
int[] arr = {1,2,3};

// 存储字符串(String已经是引用数据类型了)
String[] arr = {"hello", "world"};

// 存储手机
Phone p1 = new Phone();
Phone p2 = new Phone();
Phone[] arr = {p1, p2};
总结:
对象数组: 元素是引用数据类型的数组.   

对象数组中存储的是引用数据类型的对象对象数组中存放的是 对象的地址值


ArrayList集合ArrayList集合概述和基本使用集合: 是一个统称. 与数组类型也是容器. 包含List, Set, Map三大类型

集合和数组的区别:
        数组一旦创建, 长度不可改变
        集合长度可以动态改变

java.util.ArrayList<E>: 是大小可变的数组的实现
        构造方法
                ArrayList<E>(): 创建对象, 并指定元素的数据类型
                E: 泛型, 规定集合中的元素是什么类型, 要替换为具体的引用类型
                        是一种安全机制, 用于在编译时期约束集合中元素的数据类型. 只能是引用数据类型
                        
                        ArrayList<类名> list = new ArrayList<>();
        成员方法
                boolean add(E e): 将指定的元素添加到此集合的尾部
                E remove(int index): 删除指定索引上的元素, 返回被删除的元素
                E get(int index): 获取指定索引上的元素
                int size(): 获取集合的长度(元素的个数)
        补充:
                E set(int index, E element): 修改指定索引上的元素, 返回被替换的元素


// 创建ArrayList对象, 将E替换为元素的数据类型
ArrayList<String> list = new ArrayList<String>();

// 从JDK 1.7开始, 右侧构造方法中的泛型类型可以省略, 但尖括号不能省略
ArrayList<String> list = new ArrayList<>();
ArrayList集合的常用方法和遍历
常用成员方法
        boolean add(E e): 将指定的元素添加到此集合的尾部
        E remove(int index): 删除指定索引上的元素, 返回被删除的元素
        E get(int index): 获取指定索引上的元素
        int size(): 获取集合的长度(元素的个数)
补充:
        E set(int index, E element): 修改指定索引上的元素, 返回被替换的元素
        
        ["a", "b", "c"]
        String b = list.set(1, "d");
        ["a", "d", "c"]

集合的遍历: 使用size()和get(int index)方法

    // 遍历集合
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }

IDEA遍历集合快捷键: 集合名.fori
补充:
[Java] 纯文本查看 复制代码
public class Demo03ArrayListMethod {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        // 向集合中添加元素:add
        boolean success = list.add("柳岩");

        // 从集合中获取元素:get。索引值从0开始
        String name = list.get(0);

        // 从集合中删除元素:remove。索引值从0开始。
        String whoRemoved = list.remove(0);

        // 获取集合的长度尺寸,也就是其中元素的个数
        int size = list.size();
    }
}

ArrayList集合存储基本数据类型
包装类: 是统称. 是基本数据类型对应的引用数据类型

从 JDK 1.5+ 开始,支持自动装箱、自动拆箱。
        自动装箱: 基本类型 --> 包装类型
        自动拆箱: 包装类型 --> 基本类型
        
        ArrayList<Integer> list = new ArrayList<>();  // 集合存储的是 Integer 类型的对象
        list.add(1);  // 1 -> Integer   int -> Integer
        int i = list.get(0);  // Integer -> int
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Charater
boolean Boolean





补充:
[Java] 纯文本查看 复制代码
public class Demo05ArrayListBasic {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        
        list.add(100);  // 自动装箱: 100是int基本类型, 添加到集合中会变成Integer类型的对象
        list.add(200);

        int num = list.get(1);  // 自动拆箱: E get()获取的是Integer对象, 可变成int基本类型进行赋值
    }
}

ArrayList练习一: 存储随机数字需求: 生成6个1~33之间的随机整数,添加到集合,并遍历集合打印元素

分析:
        生成随机数? Random nextInt(33) + 1
        6个? for
        集合的泛型写什么类型? Integer
        遍历集合? for size() get()
ArrayList练习二: 存储自定义对象5分钟练习:
需求:
定义学生类, 包含属性 姓名, 年龄
定义测试类: 创建4个学生对象,添加到集合,并遍历打印出姓名和年龄
代码:
[Java] 纯文本查看 复制代码
/*
定义学生类, 包含属性 姓名, 年龄
 */
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

import java.util.ArrayList;

/*
需求:
定义学生类, 包含属性 姓名, 年龄
定义测试类: 创建4个学生对象,添加到集合,并遍历打印出姓名和年龄
 */
public class Test {
    public static void main(String[] args) {
        // 创建集合存储学生对象
        ArrayList<Student> list = new ArrayList<>();

        // 创建4个学生对象
        Student s1 = new Student("王大锤", 30);
        Student s2 = new Student("小美", 20);
        Student s3 = new Student("孔连顺", 40);
        Student s4 = new Student("唐僧", 30);

        // 添加到集合
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);

        // 遍历获取学生对象
        for (int i = 0; i < list.size(); i++) {
            Student student = list.get(i);
            System.out.println("姓名:" + student.getName() + ", 年龄:" + student.getAge());
        }
    }
}

ArrayList练习三: 按指定格式遍历集合字符串5分钟练习:
需求:
定义集合, 添加元素: 张三丰, 宋远桥, 张无忌, 张翠山
定义方法, 以指定格式打印集合(ArrayList类型作为参数)
        使用{}扩起集合,使用@分隔每个元素
        格式参照 {元素@元素@元素}
        
张三丰  宋远桥  张无忌  张翠山
["张三丰", "宋远桥", "张无忌", "张翠山"]
{张三丰@宋远桥@张无忌@张翠山}
        
分析:
        打印不换行: print()
        如何通过 索引 判断到了最后一个元素: if (i == list.size() - 1) { 是最后一个元素 }
代码:
[Java] 纯文本查看 复制代码
/*
需求:
定义集合, 添加元素: 张三丰, 宋远桥, 张无忌, 张翠山
定义方法, 以指定格式打印集合(ArrayList类型作为参数)
        使用{}扩起集合,使用@分隔每个元素
        格式参照 {元素@元素@元素}
 */
public class Test {
    public static void main(String[] args) {
        // 创建集合, 存储字符串
        ArrayList<String> list = new ArrayList<>();

        // 添加元素
        list.add("张三丰");
        list.add("宋远桥");
        list.add("张无忌");
        list.add("张翠山");

        // 调用方法
        print(list);
    }

    // 按照指定格式打印数组元素
    public static void print(ArrayList<String> list) {
        // 先打印左括号, 不换行
        System.out.print("{");
        // 遍历元素
        for (int i = 0; i < list.size(); i++) {
            // 获取元素
            String name = list.get(i);
            // 判断是否为最后一个元素
            if (i == list.size() - 1) {
                // 是最后一个, 打印元素和右括号, 换行
                System.out.println(name + "}");
            } else {
                // 不是最后一个, 打印元素和@, 不换行
                System.out.print(name + "@");
            }
        }
    }
}

ArrayList练习四: 筛选集合中的随机偶数5分钟练习:
需求:
定义一个大集合, 存入20个随机数字
定义方法 public static ArrayList<Integer> getSmallList(ArrayList<Integer> bigList), 传入大集合, 方法内部筛选其中的偶数元素,放到小集合当中返回
[Java] 纯文本查看 复制代码
/*
需求:
定义一个大集合, 存入20个随机数字
定义方法 public static ArrayList<Integer> getSmallList(ArrayList<Integer> bigList),
传入大集合, 方法内部筛选其中的偶数元素,放到小集合当中返回
 */
public class Test {
    public static void main(String[] args) {
        // 创建大集合
        ArrayList<Integer> bigList = new ArrayList<>();

        // 创建Random对象
        Random r = new Random();
        // 循环赋值
        for (int i = 0; i < 20; i++) {
            // 生成一个随机数
            int num = r.nextInt(100) + 1;
            // 添加到集合
            bigList.add(num);
        }

        ArrayList<Integer> smallList = getSmallList(bigList);
        System.out.println("偶数有:" + smallList.size());
        for (int i = 0; i < smallList.size(); i++) {
            System.out.println(smallList.get(i));
        }
    }

    // 将大集合中的偶数保存到小集合返回
    public static ArrayList<Integer> getSmallList(ArrayList<Integer> bigList) {
        // 创建小集合
        ArrayList<Integer> smallList = new ArrayList<>();
        // 遍历大集合
        for (int i = 0; i < bigList.size(); i++) {
            // 取出元素
            int num = bigList.get(i);
            // 判断是否为偶数
            if (num % 2 == 0) {
                // 添加到小集合中
                smallList.add(num);
            }
        }
        // 返回小集合
        return smallList;
    }
}

今日API汇总
java.util.Scanner: 可以解析基本类型和字符串的简单文本扫描器
        构造方法
                Scanner(InputStream source): 创建对象并指定输入流  
        成员方法
                int nextInt(): 获取键盘录入的整数, 以int形式返回
                String next(): 获取键盘录入的数据, 以字符串形式返回. (以空白字符作为录入结束)
                String nextLine(): 获取键盘录入的一行数据, 以字符串形式返回. (以换行符作为录入结束)
               
java.util.Random: 用于生成随机数
        构造方法
                Random(): 创建对象
        成员方法
                int nextInt(): 生成范围是int范围的随机数, 包含正负
                int nextInt(int n): 生成一个 0~n (包含0不包含n)范围的随机数
               
java.util.ArrayList<E>: 集合. 大小可变的数组的实现
        构造方法
                ArrayList<E>(): 创建对象, 并指定元素的数据类型
                E: 泛型, 规定集合中的元素是什么类型, 要替换为具体的引用类型
                        是一种安全机制, 用于在编译时期约束集合中元素的数据类型. 只能是引用数据类型
        成员方法
                boolean add(E e): 将指定的元素添加到此集合的尾部
                E remove(int index): 删除指定索引上的元素, 返回被删除的元素
                E set(int index, E element): 修改指定索引上的元素, 返回被替换的元素
                E get(int index): 获取指定索引上的元素
                int size(): 获取集合的长度(元素的个数)



















评分

参与人数 1黑马币 +5 收起 理由
扎古II + 5 很给力!

查看全部评分

17 个回复

倒序浏览
scanner.用于键盘输入,相比前几天来说有了交互,爽多了,更接近于真实,不会太死板,配合while(true)更好,我总是忍不住用死循环,random生成随机数很简单。很多人感觉集合比较复杂,集合的类型啊,里面的元素啊,比较懵逼。但其实前两天面向对象的东西真正理解透了的话,今天根本没有需要理解的东西,仅仅是新讲了一个类,把面向对象的特性往这个类的用法里面一套就完事,看似复杂,其实每一步都很清晰
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
林志博 来自手机 初级黑马 2018-8-30 23:00:48
藤椅
消灭零回复
回复 使用道具 举报
1.API就是相当于程序员的字典,JDK提供我们的使用类的说明文档
2.Scanner类是个可以解析基本类型和字符串的简单文本扫描器.主要三大流程:导包,创建,使用,,简易格式是Scanner sc=new Scanner(System.in);
3.匿名对象:没有变量名的对象.只能使用一次
4.Random的实例用于生成随机数的,简易格式: Random r =new Random();    int i = r.nextInt();
5ArrayList类是大小可变的数组的实现,在内的数据是元素.
八种类型都可以使用,每个字母都是大写,但是int是integer, char是Character.
回复 使用道具 举报
马飞腾,,,地表最帅组
回复 使用道具 举报
平凡的小叔叔 来自手机 初级黑马 2018-8-31 00:06:28
地板
在此首先要感谢老师这么用心的总结笔记!说真的我是第一次看这个贴子,真感觉是睡前复习神器!不会因为自己记得不全而落下某个知识点,对比一下自己的笔记真的不能看了!以后睡前复习及考前复习的必备神器!
回复 使用道具 举报
cuipu 中级黑马 2018-8-31 09:59:28
7#
构造方法和成员方法有哪些具体的不同,除了格式,
为什么要设置构造方法,除了好定义以外,比如Person(String, name, int age) 直接填就行了
成员方法我知道可以修改具体的成员变量
回复 使用道具 举报
cuipu 发表于 2018-8-31 09:59
构造方法和成员方法有哪些具体的不同,除了格式,
为什么要设置构造方法,除了好定义以外,比如Person(String,  ...

构造方法是初始化一个类的对象时调用的,它没有返回值,而且名字必须与类的名字一样。
成员方法是由类对象主动调用的,使用点操作符,它有返回值。
作用就是对类进行初始化的,创建一个对象必须要调用构造方法。
回复 使用道具 举报
平凡的小叔叔 发表于 2018-8-31 00:06
在此首先要感谢老师这么用心的总结笔记!说真的我是第一次看这个贴子,真感觉是睡前复习神器!不会因为自己 ...

嗯嗯对的,晚上睡前可以看看,排队等车可以看看,随时复习
回复 使用道具 举报
劲脆鸡排堡 发表于 2018-8-30 23:12
1.API就是相当于程序员的字典,JDK提供我们的使用类的说明文档
2.Scanner类是个可以解析基本类型和字符串的 ...

很棒,有用心总结啦,继续加油
回复 使用道具 举报
d122161279 发表于 2018-8-30 22:46
scanner.用于键盘输入,相比前几天来说有了交互,爽多了,更接近于真实,不会太死板,配合while(true)更 ...

非常棒,谢谢你给大家分享的经验
回复 使用道具 举报
liuyaxiong 来自手机 初级黑马 2018-8-31 17:02:03
12#
这些内容真的需要多记。感谢分享
回复 使用道具 举报
杨纯纯 来自手机 初级黑马 2018-10-30 22:45:53
13#
(ง'-')ง加油
回复 使用道具 举报
杨纯纯 来自手机 初级黑马 2018-10-31 01:56:27
14#
半夜睡不着再看一遍
回复 使用道具 举报
杨纯纯 发表于 2018-10-31 01:56
半夜睡不着再看一遍

晚上保证睡眠,白天才能好好听课啊,加油
回复 使用道具 举报
xiekai_sjz 发表于 2018-11-1 09:08
晚上保证睡眠,白天才能好好听课啊,加油

好的,谢凯老师好久不见你了呀
回复 使用道具 举报
getMax 中级黑马 2018-11-13 07:41:42
17#
其实找几个类还是蛮简单的,多练多用就都蛮好理解。最怕概念性东西,绕弯弯的
回复 使用道具 举报
白天看一遍不瞌睡,晚上看一遍睡得香
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马