黑马程序员技术交流社区
标题: 【石家庄校区】基础班day07-Scanner类, Random类, ArrayList类 [打印本页]
作者: xiekai_sjz 时间: 2018-8-30 15:02
标题: 【石家庄校区】基础班day07-Scanner类, Random类, ArrayList类
本帖最后由 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(): 获取集合的长度(元素的个数)
作者: d122161279 时间: 2018-8-30 22:46
scanner.用于键盘输入,相比前几天来说有了交互,爽多了,更接近于真实,不会太死板,配合while(true)更好,我总是忍不住用死循环,random生成随机数很简单。很多人感觉集合比较复杂,集合的类型啊,里面的元素啊,比较懵逼。但其实前两天面向对象的东西真正理解透了的话,今天根本没有需要理解的东西,仅仅是新讲了一个类,把面向对象的特性往这个类的用法里面一套就完事,看似复杂,其实每一步都很清晰
作者: 林志博 时间: 2018-8-30 23:00
消灭零回复
作者: 劲脆鸡排堡 时间: 2018-8-30 23:12
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-30 23:12
马飞腾,,,地表最帅组
作者: 平凡的小叔叔 时间: 2018-8-31 00:06
在此首先要感谢老师这么用心的总结笔记!说真的我是第一次看这个贴子,真感觉是睡前复习神器!不会因为自己记得不全而落下某个知识点,对比一下自己的笔记真的不能看了!以后睡前复习及考前复习的必备神器!
作者: cuipu 时间: 2018-8-31 09:59
构造方法和成员方法有哪些具体的不同,除了格式,
为什么要设置构造方法,除了好定义以外,比如Person(String, name, int age) 直接填就行了
成员方法我知道可以修改具体的成员变量
作者: xiekai_sjz 时间: 2018-8-31 14:01
构造方法是初始化一个类的对象时调用的,它没有返回值,而且名字必须与类的名字一样。
成员方法是由类对象主动调用的,使用点操作符,它有返回值。
作用就是对类进行初始化的,创建一个对象必须要调用构造方法。
作者: xiekai_sjz 时间: 2018-8-31 14:03
嗯嗯对的,晚上睡前可以看看,排队等车可以看看,随时复习
作者: xiekai_sjz 时间: 2018-8-31 14:04
很棒,有用心总结啦,继续加油
作者: xiekai_sjz 时间: 2018-8-31 14:05
非常棒,谢谢你给大家分享的经验
作者: liuyaxiong 时间: 2018-8-31 17:02
这些内容真的需要多记。感谢分享
作者: 杨纯纯 时间: 2018-10-30 22:45
(ง'-')ง加油
作者: 杨纯纯 时间: 2018-10-31 01:56
半夜睡不着再看一遍
作者: xiekai_sjz 时间: 2018-11-1 09:08
晚上保证睡眠,白天才能好好听课啊,加油
作者: 杨纯纯 时间: 2018-11-12 14:17
好的,谢凯老师好久不见你了呀
作者: getMax 时间: 2018-11-13 07:41
其实找几个类还是蛮简单的,多练多用就都蛮好理解。最怕概念性东西,绕弯弯的
作者: 如果雨 时间: 2018-11-13 08:01
白天看一遍不瞌睡,晚上看一遍睡得香
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |