1.1 数据类型和变量
基本数据类型:
- 整数类型:byte/short/int/long
- 小数类型:float/double
- 字符类型:char
- 真假类型:boolean
数组:表示固定长度的同种数据类型的多条记录,在内存中连续存放。
对象类型:组合
变量:给数据起的名字,方向访问不同的数据,值可以改变,但是含义不变。
1.2 赋值
1.2.1 基本类型
- 整数类型
- byte、short、int、long分别占1、2、4、8字节
- 在给long类型赋值时,如果常量超过了int的表示范围,需要在常量后面加L。
-
小数类型
- double、float分别占4字节和8字节
-
真假类型
- 字符类型
- char占用两个字节
1.2.2 数组类型
- 基本类型的数组有三种赋值形式
int[] arr = {1, 2, 3};
int[] arr = new int[]{1, 2, 3};
int[] arr = new int[3];
arr[0] = 1; arr[1] = 2; arr[2] = 3;
- 数组变量存储的是数组内存的地址
- 数组的长度可以动态确定
int length = ...;
int[] arr = new int[length];
- 数组的长度确定了之后就不可再改变
- 不可变指的是数组的内存空间,一经分配,长度就不可改变
- 但是可以让数组变量指向一个不同长度的空间
1.3 基本运算
- 算术运算
- 比较运算
- 逻辑运算
1.3.1 算术运算
+、-、*、/、%、++、–
- 加减乘除注意事项
- 注意结果的范围,使用恰当的数据类型。
- 整数相除直接舍去小数位
- 小数计算结果不精确
- 自增/自减
1.3.2 比较运算
>、>=、<、<=、==
- 数组变量的比较,比较的不是数组的内容,而是数组的内存地址
1.3.3 逻辑运算
& | ! ^ && ||
-
&、 和 &&、 的区别
boolean a = true;
int b = 0;
boolean flag = a | b++>0;
b = 1。虽然已知a为true,b++还是会去计算
boolean a = true;
int b = 0;
boolean flag = a || b++>0;
b = 0。已知a为true之后,会忽略后半部分的计算
1.4 条件执行
1.4.1 语法和陷阱
- if/else
- if/else if/else
- 三元运算符:条件赋值
int max = x > y ? x : y;
- switch:表达式的值不同执行不同的分支
1.4.2 实现原理
指令跳转:条件跳转、无条件跳转、跳转表
跳转表为什么更高效?
- 条件值必须为整数
- 可以使用二分查找
- 如果条件值连续的话,还可以优化成一个数组
1.5 循环
1.5.1 循环的4种形式
- while
- do/while
- for
- foreach
1.5.2 循环控制
- break
- continue
1.5.3 实现原理
条件跳转+无条件跳转
1.6 函数的用法
1.6.1 基本概念
- 减少重复代码:重复执行的代码,可以定义函数,在需要的地方调用
- 分解复杂的操作:复杂的操作,可以将操作分为多个函数
1.6.2 进一步理解函数
- 参数传递:可变长度参数
- 在函数内,可以看做是数组。
- 必须是参数列表的最后一个
- 一个函数只能有一个可变长度参数
public static int max(int min, int ...a) { int max = min; for(int i = 0; i < a.length; i++) { if(max < a[i]) { max = a[i]; } } return max; }
- 返回
- 一个函数只能有一个返回值
- 重载
- 调用匹配
- 递归函数
1.7函数调用的基本原理
1.7.1 栈的概念
程序执行的基本原理:CPU有一个指令器,指向下一条要执行的指令,要么顺序执行,要么进行跳转。
函数的调用可以看做是一个无条件跳转,跳转到对应函数的指令处开始执行,碰到return语句或者函数结尾时,再执行一次无条件跳转,跳转回调用方,执行调用函数后的下一条指令。
计算机系统主要使用栈来存放函数调用过程中需要的数据,包括参数、返回地址以及函数内定义的局部变量。
1.7.2 函数执行的基本原理
1.7.3 数组和对象的内存分配
对于数组和对象类型,一般有两块内存,一块存放实际的内容,一块存放实际内容的地址。
- 存储实际内容的空间分配在堆上
- 存储地址的空间分配在栈上
1.7.4 递归调用的原理
递归调用执行的过程中,每调用一次,就会有一次入栈,生成一份不同的参数、局部变量和返回地址。
1.7.5 小结
-
函数调用主要是通过栈来存储相关的数据,系统就函数的调用者和函数如何使用栈做了约定,返回值可以简单的认为是通过一个专门的返回值存储器存储的。
-
函数的调用是有成本的