文章目录
1.概述
1.1 java语言的三个版本
- JavaSE: Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础
- JavaME: Java 语言的(小型版),用于嵌入式消费类电子设备
- JavaEE: Java 语言的(企业版),用于 Web 方向的网站开发
1.2 Java语言跨平台原理
Java程序并非是直接运行的,Java编译器将Java源程序编译成与平台无关的字节码文件(class文件),然后由Java虚拟机(JVM)对字节码文件解释执行。所以在不同的操作系统下,只需安装不同的Java虚拟机即可实现java程序的跨平台。
1.3 JRE和JDK(记忆)
- JVM(Java Virtual Machine),Java虚拟机
- JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API)
- JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具
总结:我们只需安装JDK即可,它包含了java的运行环境和虚拟机。
1.4 JDK的安装目录介绍
目录名称 | 说明 |
---|---|
bin | 该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。 |
conf | 该路径下存放了JDK的相关配置文件。 |
include | 该路径下存放了一些平台特定的头文件。 |
jmods | 该路径下存放了JDK的各种模块。 |
legal | 该路径下存放了JDK各模块的授权文档。 |
lib | 该路径下存放了JDK工具的一些补充JAR包。 |
2.基础语法
2.1 关键字
关键字是指被java语言赋予了特殊含义的单词。关键字的特点:关键字的字母全部小写。常用的代码编辑器对关键字都有高亮显示,比如现在我们能看到的public、class、static等。
2.2 常量
常量:在程序运行过程中,其值不可以发生改变的量。
Java中的常量分类:
- 字符串常量 用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、“abc”、"中国"等.
- 整数常量 整数,例如:-10、0、88等.
- 小数常量 小数,例如:-5.5、1.0、88.88等.
- 字符常量 用单引号括起来的一个字符,例如:‘a’、‘5’、‘B’、'中’等
- 布尔常量 布尔值,表示真假,只有两个值true和false
- 空常量 一个特殊的值,空值,值为null
- 除空常量外,其他常量均可使用输出语句直接输出。
2.2.1 变量的介绍(理解)
变量的定义格式:
数据类型 变量名 = 数据值;
2.2.2 数据类型(应用)
计算机存储单元
我们知道计算机是可以用来存储数据的,但是无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写的字母”b”表示。而计算机中最基本的存储单元叫“字节(byte)”,通常用大写字母”B”表示,字节是由连续的8个位组成。除了字节外还有一些常用的存储单位,其换算单位如下:
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
Java中的数据类型
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
整数类型 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int(默认) | 4 | -2的31次方到2的31次方-1 | |
long | 8 | -2的63次方到2的63次方-1 | |
浮点类型 | float | 4 | 负数:-3.402823E+38到-1.401298E-45 正数: 1.401298E-45到3.402823E+38 |
double(默认) | 8 | 负数:-1.797693E+308到-4.9000000E-324 正数:4.9000000E-324 到1.797693E+308 | |
字符类型 | char | 2 | 0-65535 |
布尔类型 | boolean | 1 | true,false |
2.2.3 变量(应用)
变量的定义
数据类型 变量名 = 初始化值; // 声明变量并赋值
变量的注意事项(理解)
- 在同一对花括号中,变量名不能重复。
- 变量在使用之前,必须初始化(赋值)。
- 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围。
- 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是double, double的取值范围是大于float的,类型不兼容。
2.3 键盘录入(理解)
1、导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。
2、创建Scanner对象。
3、接收数据
2.4 标识符(理解)
标识符是用户编程时使用的名字,用于给类、方法、变量、常量等命名。
Java中标识符的组成规则:
- 由字母、数字、下划线“_”、美元符号“$”组成,第一个字符不能是数字。
- 不能使用java中的关键字作为标识符。
- 标识符对大小写敏感(区分大小写)。
Java中标识符的命名约定:
小驼峰式命名:变量名、方法名
首字母小写,从第二个单词开始每个单词的首字母大写。
大驼峰式命名:类名
每个单词的首字母都大写。
2.5 类型转换
在Java中,一些数据类型之间是可以相互转换的。分为两种情况:自动类型转换和强制类型转换。
2.5.1 隐式转换(理解)
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。
2.5.2 强制转换(理解)
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。
2.5.3 类型转换案例(理解)
常量优化机制:
在编译时,整数常量的计算会直接算出结果,并且会自动判断该结果是否在byte取值范围内,
在:编译通过
不在:编译失败
byte a = 3;
byte b = 4;
byte c = a + b; //错误。因为两个byte变量相加,会先提升为int类型
byte d = 3 + 4; //正确。常量优化机制
2.6 运算符
2.6.1 算术运算符(略)
2.6.2 自增自减运算符(略)
2.6.3 赋值运算符(略)
2.6.4 关系运算符(略)
2.6.5 逻辑运算符(略)
2.6.6 短路逻辑运算符(略)
2.6.7 三元运算符
关系表达式 ? 表达式1 : 表达式2;
2.7 流程控制语句
2.7.1 流程控制语句分类
顺序结构、 分支结构(if, switch)、 循环结构(for, while, do…while)
2.7.2 顺序结构
2.7.3 分支结构
2.7.3.1 if
if
else if
else
2.7.3.2 switch
switch():
case:
break;
default:
2.7.4 循环结构
2.7.4.1 for循环
for循环格式
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
格式解释:
初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去
执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
2.7.4.2 while循环
while循环完整格式:
while (条件判断语句) {
循环体语句;
条件控制语句;
}
while循环执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
2.7.4.3 dowhile循环
2.7.4.4 跳转控制语句
跳转控制语句(break)
跳出循环,结束循环
跳转控制语句(continue)
跳过本次循环,继续下次循环
2.8 Random
1. 导入包
import java.util.Random;
2. 创建对象
Random r = new Random();
3. 产生随机数
int num = r.nextInt(10);
2.9 数组
2.9.1 定义格式
2.9.1.1 第一种格式
数据类型[] 数组名
2.9.1.2 第二种格式
数据类型 数组名[]
2.9.1.3 动态初始化格式
数据类型[] 数组名 = new 数据类型[数组长度];
2.9.1.4 数组的静态初始化
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
数据类型[] 数组名 = {元素1,元素2,…};
2.10 内存分配
2.10.1 内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2.10.2 java中的内存分配
分别是:栈内存和堆内存
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
2.10.2.1 一个数组内存图
2.10.2.2 两个数组内存图
2.10.2.3 多个数组指向相同内存图
2.11 方法概述
2.11.1 方法的调用过程
总结:每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失。
2.11.2 形参和实参
- 形参:方法定义中的参数
等同于变量定义格式,例如:int number - 实参:方法调用中的参数
等同于使用变量或常量,例如: 10 number
2.11.3 方法重载
方法重载概念:
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
注意:
- 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
- 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
基本数据类型的参数,形式参数的改变,不影响实际参数
对于引用类型的参数,形式参数的改变,影响实际参数的值
每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失
2.12 递归
2.12.1 递归应用
- 递归的介绍
以编程的角度来看,递归指的是方法定义中调用方法本身的现象
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 - 递归的注意事项
递归一定要有出口。否则内存溢出
递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出
2.13 数组的高级操作
2.13.1 二分查找
-
二分查找概述
查找指定元素在数组中的位置时,以前的方式是通过遍历,逐个获取每个元素,看是否是要查找的元素,这种方式当数组元素较多时,查找的效率很低
二分查找也叫折半查找,每次可以去掉一半的查找范围,从而提高查找的效率 -
实现步骤
- 定义两个变量,表示要查找的范围。默认min = 0 ,max = 最大索引
- 循环查找,但是min <= max
- 计算出mid的值
- 判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
- 如果要查找的值在mid的左半边,那么min值不变,max = mid -1.继续下次循环查找
- 如果要查找的值在mid的右半边,那么max值不变,min = mid + 1.继续下次循环查找
- 当min > max 时,表示要查找的元素在数组中不存在,返回-1.
- 注意事项
有一个前提条件,数组内的元素一定要按照大小顺序排列,如果没有大小顺序,是不能使用二分查找法的
2.13.2 冒泡排序
冒泡排序概述
一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
如果有n个数据进行排序,总共需要比较n-1次
每一次比较完毕,下一次的比较就会少一个数据参与
2.13.3 快速排序
- 快速排序概述
冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的.再找到所有比基准数大的.小的全部放左边,大的全部放右边,确定基准数的正确位置 - 核心步骤
- 从右开始找比基准数小的
- 从左开始找比基准数大的
- 交换两个值的位置
- 红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
- 基准数归位
2.14 异常
2.14.1 异常
- 异常的概述
异常就是程序出现了不正常的情况 - 异常的体系结构
2.14.2 编译时异常和运行时异常的区别
- 编译时异常
都是Exception类及其子类
必须显示处理,否则程序就会发生错误,无法通过编译 - 运行时异常
都是RuntimeException类及其子类
无需显示处理,也可以和编译时异常一样处理 - 图示
2.14.3 JVM默认处理异常的方式
- 如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:
- 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
- 程序停止执行
2.14.4 throws方式处理异常
定义格式
public void 方法() throws 异常类名 {
}
- 注意事项
这个throws格式是跟在方法的括号后面的
编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,
在方法上进行显示声明,将来谁调用这个方法谁处理
运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理
2.14.5 throw抛出异常
- 格式
throw new 异常(); - 注意
这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了 - throws和throw的区别
throws | throw |
---|---|
用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
表示声明异常,调用该方法有可能会出现这样的异常 | 表示手动抛出异常对象,由方法体内的语句处理 |
2.14.6 try-catch方式处理异常
- 定义格式
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
- 执行流程
程序从 try 里面的代码开始执行
出现异常,就会跳转到对应的 catch 里面去执行
执行完毕之后,程序还可以继续往下执行 - 注意
- 如果 try 中没有遇到问题,怎么执行?
会把try中所有的代码全部执行完毕,不会执行catch里面的代码 - 如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了 当catch里面的语句全部执行完毕,表
示整个体系全部执行完全,继续执行下面的代码 - 如果出现的问题没有被捕获,那么程序如何运行?
那么try…catch就相当于没有写.那么也就是自己没有处理. 默认交给虚拟机处理. - 同时有可能出现多个异常怎么处理?
出现多个异常,那么就写多个catch就可以了. 注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面
2.14.7 Throwable成员方法
方法名 | 说明 |
---|---|
public String getMessage() | 返回此 throwable 的详细消息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
2.14.8 自定义异常
- 自定义异常概述
当Java中提供的异常不能满足我们的需求时,我们可以自定义异常 - 实现步骤
- 定义异常类
- 写继承关系
- 提供空参构造
- 提供带参构造
2.15 Optional
2.15.1 获取对象
- Optional概述
可能包含或不包含非null值的容器对象 - 方法介绍
方法名 | 说明 |
---|---|
static Optional of(T value) | 获取一个Optional对象,封装的是非null值的对象 |
static Optional ofNullable(T value) | 获取一个Optional对象,Optional封装的值对象可以是null也可以不是null |
2.15.2 常用方法
方法名 | 说明 |
---|---|
T get() | 如果存在值,返回值,否则抛出NoSuchElementException |
boolean isPresent() | 如果存在值,则返回true,否则为false |
2.15.3 处理空指针的方法
方法名 | 说明 |
---|---|
T orElse(T other) | 如果不为空,则返回具体的值,否则返回参数中的值 |
T orElseGet(Supplier<? extends T> supplier) | 如果不为空,则返回具体的值,否则返回由括号中函数产生的结果 |
void ifPresent (Consumer<? super T> action) | 如果不为空,则使用该值执行给定的操作,否则不执行任何操作 |
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) | 如果不为空,则使用该值执行给定的操作,否则执行给定的基于空的操作 |