用户交互Scanner
Java为我们提供了一个实现程序和人的交互的工具类;
java.util.Scanner 是 Java5的新特性,我们可以通过Scanner类来获取用户的输入
Scanner s = new Scanner(System.in);
Scanner对象
-
next()
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符前遇到的空格,next()方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
-
nextLine()
- 以Enter为结束符 也就是说nextLine()方法返回的是输入回车之前的所有字符。
- 可以获得空白
-
scanner.close();//凡是属于IO流的类,如果不关闭会一直占用资源,要养成好习惯用完就关掉
scanner:\Demo01-05
常用结构
顺序结构
- JAVA的的基本结构就是顺序结构,除非特别指明,否走默认就按顺序执行
选择结构
-
if单选择结构
if(布尔表达式1){ }
-
if双选择结构
if(布尔表达式1){ }else(布尔表达式2){ }
-
if多选择结构
if(布尔表达式1){ }else if(布尔表达式2){ }else if(布尔表达式3){ }else (布尔表达式4){ }
-
if嵌套结构
if(布尔表达式1){ if(布尔表达式2){ } }
-
switch多选择结构
switch(expression){ case value: break; case value: break; default: }
※case穿透 (如果匹配的等级未加break则会继续往下直到遇到break)
在Java SE 7开始,switch支持字符串 String 类型了
编译后的文件在.\JavaSE\out\production路径
将编译后的.class文件拖至代码库可以使用IDEA实现反编译
循环结构
while 循环
while(布尔表达式){
}
只要布尔表达式为true,循环就会一直执行下去。
我们大多数情况是会让循环停下来的,我们需要一个让表达式失效的方式来结束循环
struct:\WhileDemo01-03
do…while循环
do{ }while(布尔表达式):
- 对于while语句而言,如果不满足条件,则不能进入循环。但有时我们需要即使不满足条件也至少执行一次。
- do…while 循环 和 while 循环 相似,不同的是,do…while 循环至少会执行一次。
- while和do…while的区别:
- while先判断后执行。dowhile是先执行后判断!
- Do…while总是保证循环体会被至少执行一次!这是他们的主要差别。
struct:\DoWhileDemo01-02
for循环
for(初始化;布尔表达式;更新){ }
- 虽然所有循环结构都可以用while或者do…while表示,但Java提供了另一种语句——for循环,使一些循环结构变得更加简单。
- for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构
- for循环内的更新自加是在执行一次循环过程中的最后阶段再累加的
struct:\ForDemo01-04
增强for循环
int[] numbers = {10,20,30,40,50};//定义了一个数组for(int x:numbers){ //遍历数组的元素 System.out.println(x); }
struct:\ForDemo05
小技巧:输入 数字.for 就能自动生成一个for循环语句
光标变粗,不能换行的解决方案:按Ins键
println 输出完会换行print 输出完不会换行
break & continue
- break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
- continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
类比:break就像倒闭,continue就像请假。请假有同事代班,倒闭了公司就没了。
-
关于goto关键字
struct:\LabelDemo
用outer实现寻找质数,还是有难度的
小练习
打印一个三角形
for (int i = 1; i <= 5; i++) { for (int j = 5; j >= i; j--) {//输出左上角的空白倒三角 System.out.print(" ");//第一遍输入5个空格 } for (int j = 1; j <= i; j++) {//输出中间一列和左半边三角 System.out.print("*"); } for (int j = 1; j < i; j++) {//输出右半边三角 System.out.print("*"); } System.out.println(); }
今日英语:struct结构体、score成绩、value值
Java方法
何为方法
- System.out.println(),那么它是什么呢?调用System类里的标准输出对象out中的方法Println()
- Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
- 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句的集合。我们设计方法的时候,最好保证方法的==原子性==,就是一个方法只能完成1个功能,这样有利于我们的后期扩展。
※方法的定义及调用
方法的定义
-
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
-
方法包含一个方法头和一个方法体。下面是一个方法的所有部分;
-
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
-
返回值类型∶方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。
-
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
-
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
-
方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名(参数类型 参数名){ //方法名命名要遵守驼峰原则 ... 方法体 ... return 返回值; }
-
方法调用
-
调用方法:对象名.方法名(实参列表)
-
Java支持两种调用方法的方式,根据方法是否返回值来选择。
-
当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30,40);
-
如果方法返回值是void,方法调用一定是一条语句。例如:
system.out.println("Hello,kuangshen!");
-
课后拓展:值传递(Java)和引用传递 (会在笔试中问到)
method:\Demo01-02
※方法重载
- 重载就是在一个类中,有相同的函数名称,但形参不同的函数。
- 方法的重载的规则:(笔试题会考)
- 方法名称必须相同。
- 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为方法的重载。
- 实现理论:
- 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
命令行传参
-
有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
-
如果需要直接运行一个含包的class文件,需要找到它包的路径然后去加载,否则是执行不了的
-
main方法也是可以传递参数的
method:\Demo03
※可变参数
-
JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。
-
可变参数也叫不定项参数
-
在方法声明中,在指定参数类型后加一个省略号(…)。
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。
任何普通的参数必须在它之前声明。
method:\Demo04-05
※递归
- A方法调用B方法,我们很容易理解!
- 递归就是:A方法调用A方法!就是自己调用自己
- 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
- 递归结构包括两个部分:
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
- 能不用递归就不用递归,递归都能用一些方法来代替,但是一些方法用递归来解决是比较快的,前提是基数比较小的情况下,否则容易栈溢出。调用自身太多了,反而会影响机器性能。
method:\Demo06
今日作业:写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
- 思路推荐:
- 写4个方法:加减乘除
- 利用循环+switch进行用户交互
- 传递需要操作的两个数
- 输出结果
今天单词:method方法、terminal终端、result结果
小技巧:按住ctrl+左键点击方法名,即可看见该方法代码
数组
数组概述
数组的定义:
- 数组是相同类型数据的有序集合.
- 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
- 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.
数组的4个基本特点:
-
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
-
其元素必须是相同类型,不允许出现混合类型。
-
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
-
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,
数组对象本身是在堆中的。
数组边界:
- 下标的合法区间:[0,length-1],如果越界就会报错;
- ArraylndexOutOfBoundsException :数组下标越界异常!
小结:
- 数组是相同数据类型(数据类型可以为任意类型)的有序集合
- 数组也是对象,数组元素相当于对象的成员变量
- 数组长度的确定的,不可变的。如果越界,则报:ArraylndexOutofBounds
数组声明创建
-
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayRefVar;//首选的方法 或 dataType arrayRefVar[];//效果相同,但不是首选方法
-
Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraysize];
-
数组的元素是通过索引访问的,数组索引从О开始。
-
获取数组长度:
arrays.length
技巧:可以使用 dataType[] arrayRefVar = {1,2,3}; 静态初始化数组:声明+创建+赋值
array:\Demo01-02
内存分析
※数组使用
-
普通的For循环
用的最多,因为我们要从它里面取出一些数据或者下标来进行操作
-
For-Each循环
一般用来打印一些结果
-
数组作方法入参
可以对数组进行一些操作
-
数组作返回值
一般例如反转数组,将数组的东西修改再返回一个新的数组
array:\Demo03-04
多维数组
-
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
-
二维数组
int a[][] = new int[2][5];
解析:以上二维数组a可以看成一个两行五列的数组。
-
思考:多维数组的使用?
array:\Demo05
Arrays类
- 数组的工具类java.util.Arrays
- 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
- 查看JDK帮助文档
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用”而不是"不能")
- 具有以下常用功能:
给数组赋值:通过fill方法。
对数组排序:通过sort方法,按升序。
比较数组:通过equals 方法比较数组中元素值是否相等。
查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
array:\Demo06
- 冒泡排序(最为出名,笔试会考)
- 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!
- 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。
- 我们看到嵌套循环,应该立马就可以得出这个算法的时间==复杂度为O(n2)==
- 思考:如何优化?
技巧:点击屏幕左下角的Structure就能显示当前类的所有方法
array:\Demo07
稀疏数组
-
需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
-
分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。
-
解决:稀疏数组
稀疏数组介绍
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组
- 稀疏数组的处理方式是:
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
- 如下图:左边是原始数组,右边是稀疏数组
array:\Demo08
今日单词:array数组、reverse反转
参考视频【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili