一.从数据类型开始
8种基本数据类型:
- 整数型:byte short int long
- 浮点型:float double
- 布尔型:boolean
- 字符型:char
数据类型表示范围:
- 1.自动类型转换:
运算过程中,自动转换为容量最大的数据类型进行计算
跟字符串相加’+'时,都会转换为字符串,进行字符串拼接计算
- 2.强制类型转换:
可将容量大的类型转换为小的。注意!可能导致精度损失和溢出
注: 需要记忆的内容:
char字符转换为int值(ASCII编码):‘a’=97,‘A’=,
计算顺序:先计算,后赋值
二.运算符
1.算数运算符号
- ‘+’:也是数据串连接符号
- ‘-’
- ‘*’
- ‘/’: 计算结果为int类型时,舍弃小数部分
- ‘%’: 取模。对负数取模时,-号忽略不计(5%-2=1)。但是被取模数
的负号不能忽略(-5%2=-1)。 - ‘++’:自增。++放前面,先运算后赋值;++放后面,先赋值后运算
- ‘–’: 自减。–放前面,先运算后赋值;–放后面,先赋值后运算
2.赋值运算符
- ‘=’
- 扩展赋值运算符:
- ‘+=’
- ‘-=’
- ‘*=’
- ‘/=’
注:扩展运算符计算时,会把运算结果强制准换为赋值变量的类型(先运算后转换再赋值)
3.比较运算符
比较运算符的运算结果为布尔值
- ‘==’
- ‘!=’
- ‘>’
- ‘<’
- ‘>=’
- ‘<=’
4.逻辑运算符
逻辑运算符运算的项为布尔值
- ‘&’ 逻辑与
- ‘|’ 逻辑或
- ‘!’ 逻辑非
- ‘^’ 逻辑异或:a异b=true,a同b=false。
- ‘&&’ 短路与:单条件满足,另一侧条件不判断/执行
- ‘||’ 短路或
5.位运算符(二进制运算)
二进制表示时各位数(1/0)之间的运算
- ‘<<’ 左移:如m<<n,m的二进制数字左移n位,被移除的高位丢弃,右侧空缺位补“0”。
m < < n = m ∗ 2 n m<<n=m*2^n m<<n=m∗2n - ‘>>’ 右移,同理,左侧最高位为“0”补“0”,为“1”补“1”。
m > > n = m / 2 n m>>n=m/2^n m>>n=m/2n - ‘>>>’ 无符号右移:正数无符号右移运算结果同右移。
正数右移左边补0,负数右移左边补1;无符号右移左边均补0 - ‘&’ 与运算:a&b,二进制各位&运算,同为1结果为1。
- ‘|’ 或运算
- ‘^’ 异或运算
- ‘~’ 反码
6.三元运算符(三目运算符)
格式:(条件表达式)?表达式1:表达式2;
true 则执行表达式1
false 则执行表达式2
三元运算符的嵌套:
(a>b?a:b)>c?(a>b?a:b):c
(a>b?(a>c?a:c):(b>c?b:c))
7.运算符的优先级
序号 | 运算符 | 综合性 |
---|---|---|
1 | “()” “[]” “.” | 从左到右 |
2 | “–” “++” “~” “-(负)” “+(正)” “!” | 从左到右 |
3 | “*” “/” “%” | 从左到右 |
4 | “+(加)” “-(减)” | 从左到右 |
5 | “<<” “>>” “>>>” | 从左到右 |
6 | “<” “<=” “>” “>=” “instenceof” | 从左到右 |
7 | “==” “!=” | 从左到右 |
8 | “&(按位与)” | 从左到右 |
9 | “^” | 从左到右 |
10 | " | (或)" |
11 | “&&” | 从左到右 |
12 | " | |
13 | “?:(三元运算符)” | 从左到右 |
14 | “=” “+=” “-=” “*=” “/=” “%=” “&=” “(或等)” “^=” “~=” “<<=” “>>=” “>>>=” | 从右到左 |
用括号()来确保运算的优先级
三.程序流程控制
1.顺序结构
自上而下,括号内外
2.分支结构
分支结构可嵌套使用
1.if-else
if(表达式){
//表达式的返回值需为布尔值
语句;
语句;
...;
}else if(表达式){
...;
}else if(表达式){
...;
}else{
...;
}
2.switch
switch (表达式){
case 常量1:
语句;
语句;
...;
break;
case 常量2:
...;
break;
case 常量3:
...;
break;
default:
...;
break;
}
switch()中表达式的返回值可以为byte,short,char,int,String,枚举
case后面为常量,不能为变量,而且各不相同
注意break不要漏,否则将直接顺序执行下面的语句,不进行判断
3.循环结构
循环结构包括四个组成部分:
- 初始化部分
- 循环条件部分
- 循环体部分
- 迭代体部分
进行嵌套循环时,尽量保证外层循环次数小于内层循环
1.for循环
for (初始化表达式①;布尔测试表达式②;更改表达式){
语句;
语句;
...;
//循环体
}
for(;;){
...;
}
//无限循环
2.while循环
int i=1;//初始化表达式
while (i<=100){//布尔测试表达式
语句;
语句;
...;
//循环体
i++;
//更改表达式
}
while(true){
...;
}
//无限循环
3.do/while循环
int i=1;
do {
语句;
语句;
...;
//循环体
i++;
//更改表达式
}while(i<=100);//注意分号不要遗漏
//布尔测试表达式
//满足while条件时,循环继续执行,不满足则退出
与while循环区别在与会先执行一次循环体,再进行判断循环条件
4.特殊流程控制语句
1.break
终止当前所在的循环,只针对循环
2.continue
结束当前这次循环,直接进入下次循环
可以通过标签指名要跳过的是哪层循环
- 标签的用用法:标识符加冒号":"的形式,如“mylabel:”。
- Java 的标签只能定义在三种循环 (for() {}, do{} while(), while() {}) 的开始位置。
- 在循环前面加上标签,就好像给循环起了个名字。而后在循环中使用 break 或者 continue 语句的时候,就可以带上这个标签做为参数,指明跳出 (break) 或者继续 (continue) 哪一个循环,如“break mylabel;”、“continue mylabel;”。
continue是终止本次循环,break是终止本层循环
3.return
结束当前方法
四.数组
1.一维数组
1.数组的定义/初始化
动态初始化: int a [] = new int [4];或者 int [] a = new int [4];
(默认初始化数组元素为"0")
静态初始化: int a [] = new int [] {1,2,3,4};或者 int [] a = new int [] {1,2,3,4};
2.数组元素的引用
数组名[数组元素下标]
数组元素下标从"0"开始,0~n-1;
3.数组的长度属性
数组名.length=n
数组一旦初始化,其长度是不可变的
2.多维数组
1.数组的定义、初始化
1.动态初始化: int a [][]= new int [2][3];
或者 int [][] a = new int [2][3];
或者 int []a[] = new int [2][3];
(默认初始化数组元素为"0")
2.静态初始化:
int a [][] = new int [][] {
{2,6,3},
{7,3,1}
};
3.只定义第一维的长度
int a [][]= new int [2][];
//?疑问,会导致空指针异常
2.数组元素的引用
基本同一维数组
注意:特殊写法 int [] x, y [];表示x为一维数组,y为二维数组
3.数组中涉及的常见算法
1.求数组的最大值、最小值、总和、平均数
遍历数组元素
int arr0 [][] = new int [][] {
{1,5,9},
{3,2,6}
};
int max = 0 ;
for (int i=0; i< arr0.length; i++) { //遍历第一维数组
int arr1 []= arr0[i];
for (int j=0; j<arr1.length; j++) { //遍历第二维数组元素
if (arr1 [j] > max) {
max = arr1 [j]; //取最大值
}
}
}
System.out.println(max);//循环结束后输出
2.数组的复制、反转
数组元素的遍历、设置临时的数组
3.数组元素的排序
-
插入排序
直接插入排序、折半插入排序、Shell排序 -
交换排序
冒泡排序、快速排序(或分区交换排序) -
选择排序
简单选择排序、堆排序 -
归并排序
-
基数排序
4.数组常见错误
-
数组下标越界异常
ArrayIndexOutOfBoundsException -
空指针异常
NonePouintersException