目录
一、变量
1.什么是变量?
- 内存中的一块存储空间,是存储数据的容器且只能存一个值,因为存在在其中的数据可以改变所以称之为变量。
2.语法格式
- 数据类型 变量名;比如 int age;
- 其中变量名时内存空间的地址名,数据类型可以是基本数据类型也可以是引用数据类型。
3.Java中变量的特点(Java是强数据类型的语言)
- 先声明变量类型,再赋值,且赋值的类型一定与声明的类型要一致。
4.使用注意
- 同一作用域内,变量不能重名;
- 局部变量必须初始化后才能使用,否则编译报错。
5.Java标识符命名规则及规范
规则
- 由字母、数字、下划线或$符组成;
- 首位不能使用数字;
- 不能使用Java的关键字;
- 不能是用字面值,比如true,false,null。
规范
- 驼峰法则
6.两个变量交换值的算法
三种方法:引入中间变量,加减取值法,异或取值法
int a = 1;
int b = 2;
//方法一:引入中间变量
int temp = a;
a = b;
b = temp;
//方法二:加减取值法
a = a + b;
b = a - b;//a + b - b = a
a = a - b;//a + b - a = b
//方法三:异或取值法
a = a ^ b;
b = a ^ b;//a ^ b ^ b = a
a = a ^ b;//a ^ b ^ a = b
二、数据类型
1.分类
基本类型:整型、浮点型、字符型和布尔类型
引用类型:数组、字符串、类和接口
2.基本数据类型对比
- 类型 标识符 内存大小 取值范围
- 字节型 byte 1字节 -128-127,即2^7到2^7-1
- 短整型 short 2字节 -256到255
- 整型 int 4字节 -65536-65535
- 长整型 long 8字节 一般用于表示10亿以上的数据
- 单精度浮点型 float 4字节 范围比long要大
- 双精度浮点型 double 8字节
- 字符型 char 2字节 0-65535
- 布尔型 boolean 不确定 true,false
说明:浮点型使用注意
- 不要再数量级相差很大的浮点类型之间进行运算
- 避免进行等量判断
3.类型转换
什么是类型转换?一种类型的值赋值给另一种类型的变量时发生类型转换。
有哪些种类的的类型转换?两类,分别是自动类型转换和强制类型转换。
3.1.数值类型之间的转换
- int n = 263;
- byte b = (byte)n;//强制类型转换
- System.out.println(b);//输出是7,原因是超出范围,直接截断
- short n3 = 5;//只要没超出short范围就是可以自动类型转换
- n3 = n3 + 5;//这里是高类型赋值给低类型,跟字面量赋值不一样,编译不通过。
- short n4 = 5;
- n4 += 5;//正确,也是扩展赋值运算符,会进行强制类型转换。
- 注:双精度的字面量就是在单精度范围了,也无法自动类型转换。
3.2.自动类型转换
什么时候发生自动类型转换?范围小的类型赋值给范围大的类型时发生自动类型转换,数据不会丢失,类型也不会丢失。
3.3.强制类型转换
什么时候发生强制类型转换?范围大的数据类型赋值给范围小的数字类型。强制类型转换数据可能会丢失,比如把4个字节的int类型赋值给1个字节的byte类型,是直接把最右边的1字节中的数据复制给了byte类型的1字节变量。
语法格式:(数据类型)操作数
3.4.类型提升
操作数1类型 | 操作数2类 | 运算后的类型 |
---|---|---|
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
三、运算符
1.运算符的分类
- 按操作数的个数分类:一元运算符(++ - -)、二元运算符(+ - * / %)以及三元运算符(? :)
- 按功能分类:算法运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符以及位运算符
2.算法运算符:+ - * / %
2.1.使用除法注意:
- 若除数与被除数都是整数,结果会取整;
- 若除数与被除数都是整数,除数不能为0,否则抛出算法异常,编译无法通过。
- 浮点类型的特殊值:正无穷大、负无穷大、NaN非数字。如下:
- System.out.println(5.0 / 0);//输出:正无穷大
- System.out.println(-5.0 / 0);//输出:负无穷大
- System.out.println(0.0 / 0);//输出:NaN非数字
2.2.使用取余注意:
- 5 % 2 = 1
- 5 % -2 = 1
- -5 % 2 = -1 //符号由被除数决定
- 5.0 % 2 = 1.0
2.3.自增自减运算符:++ - -
- 后缀表示:x++,先使用,再自加
- 前缀表示:++x,先自加,再使用
3.关系运算符
- > < >= <= == ! = 运算结果是布尔类型boolean
4.逻辑运算符
- 与(&&)、或(||)和 非(!)
- 操作数必须是boolean类型!
- &&, || 和 &,| 它们的区别是什么?&& || 短路与(或),& | 非短路与(或)。
5.赋值运算符(==)
扩展赋值运算符:+= -= *= /= %=
使用注意:
- short n3 = 5;//只要没超出short范围就是可以的
- //n3 = n3 + 5;//这里是高类型赋值给低类型,跟字面量赋值不一样,编译不通过。
- short n4 = 5;
- n4 += 5;//正确,也是扩展赋值运算符,会进行强制类型转换。
6.条件运算符(? :)
- 格式:表达式1?表达式2:表达式3
- 说明:若表达式1结果为true,则执行表达式2,否则执行表达式3
7.位运算符
7.1.位运算符分类
- & 位与
- | 位或
- ^ 异或
- ~ 非
- << 左移
- >> 右移
- >>> 无符号右移
7.2.位运算
计算机中二进制表示形式有以下3种:以十进制5(4个字节)为例,整数是精确存储。
原码:由符号位和数值位组成,符号位:0表示正数,1表示负数
- 00000000-00000000-0000000-00000101 5的原码
- 10000000-00000000-0000000-00000101 -5原码
反码:正数的反码与原码一样,负数的反码在原码的基础上除符号位外,其他位取反
- 00000000-00000000-0000000-00000101 5的反码
- 11111111-11111111-11111111-11111010 -5的反码
补码:正数的补码与原码一样,负数的补码是在反码的基础上加1
- 00000000-00000000-0000000-00000101 5的补码
- 11111111-11111111-11111111-11111011 -5的补码
- Java中采取补码的形式进行存储和运算的,所以,位运算是针对补码的。
&位与,表示1 & 1为1,1 & 0 为0,例如:5 & 2 ,即是从右往左对应位进行&运算,如下
- 00000000-00000000-0000000-00000101 5的补码
- 00000000-00000000-0000000-00000010 2补码
- 00000000-00000000-0000000-00000000 计算结果:0的补码
| 位与,表示0 | 0为0,1 | 0 为0,例如:5 | 2,从右往左对应位进行 | 运算,如下
- 00000000-00000000-0000000-00000101 5的补码
- 00000000-00000000-0000000-00000010 2补码
- 00000000-00000000-0000000-00000111 计算结果:7的补码
^异或,表示相同为0,不同为1,例如:5 ^ 2,从右往左对应位进行 ^ 运算,如下
- 00000000-00000000-0000000-00000101 5的补码
- 00000000-00000000-0000000-00000010 2补码
- 00000000-00000000-0000000-00000111 计算结果:7的补码
- 注:异或同一个数2次还是其本身。
~取反,表示非,例如:~5,从右往左进行 ~ 运算,如下
- 00000000-00000000-0000000-00000101 5的补码
- 11111111-11111111-11111111-11111010 计算结果:变化特别大
<<左移,表示向左移动n位,然后用0补位,例如:5 << 2,如果是整数移动的规律:结果为5*2^2 = 20。
- 00000000-00000000-0000000-00000101 5的补码
- 00000000-00000000-0000000-00010100 计算结果:20的补码
>>右移,表示向右移动n位,高位是0用0补,是1用1补,比如5 >> 2,如果是整数移动的规律:结果为5/(2^2) = 1。
- 00000000-00000000-0000000-00000101 5的补码
- 0000000000-00000000-0000000-000001 计算结果:1补码
>>>无符号右移,表示向右移动n位,高位用0补位。比如5 >>> 2
- 00000000-00000000-0000000-00000101 5的补码
- 0000000000-00000000-0000000-000001 计算结果:1的补码
8.运算符的优先级
8.1.运算符的优先级
- ()
- ++ -- ! ~ +(正) -(负)
- * \ %
- + -
- << >> >>>
- < > <= >=
- == !=
- &
- ^
- |
- &&
- ||
- ? :
- = *= /= %= += -=
8.2.常用的整理如下
- ()
- ++ -- !
- 算法:* / %
- + -
- 关系:> >= < <=
- == !=
- 逻辑:&&
- 逻辑:||
- 条件:?:
- 赋值: =
四、流程控制
1.控制语句分类
- 顺序语句:从上到下按顺序依次执行
- 分支语句:部分代码选择执行或不执行
- 循环语句:部分代码重复执行
2.流程图
- 圆角长方形表示开始/结束
- 平行四边形表示输入输出
- 正方形表示执行
- 菱形表示判断
3.条件语句
3.1.单分支条件语句
- 格式:if( ) { }
- 只是单独判断条件是否成立
3.2.双分支条件语句
- 格式:if(){ }else{ }
- 需要对条件成立和不成立的情况分别处理
3.3.多重if 条件语句
- 格式:if(){ }else if(){ }else if(){ }else{ }
- 一旦前面条件成立,则不做后续判断。
- 注:基本类型直接用双(==)判断,但是引用数据类型不行。即字符可以,字符串不行。
3.4.多分支选择语句
3.4.1.格式
- switch(表达式){
- cases 值1: 语句;break;
- cases 值1: 语句;break;
- ……
- default:语句;break;
- }
3.4.2.说明
- 表达式:只支持byte、short、int、char、String、枚举类型enum。
- 表达式是的值的类型与常量值的类型要相符。
- 同一个switch中标签值不能重复。
- 所有的break均可省略,若不加break语句,就会对其他条件内容穿透执行且不会再进行判断。
- default的位置可以更改,不一定非得放在最后,位置变了但是作用不会变。
- default放在前面,又没有break,一旦执行了default的代码就会发生穿透执行。
- 支持标签堆叠的语法,比如:
- switch (month){
- case 3:
- case 4:
- case 5:System.out.println(month+"月属于春季");break;
- case 6:
- case 7:
- case 8:System.out.println(month+"月属于夏季");break;
- }
3.4.3.switch和多重if的区别:
- 相同:多个条件判断
- 不同:多重if用于区间判断,switch用于等值判断。等值判断,switch效率高于多重if,因为常量值会一次性加载到内存中。
3.4.4.分支语句嵌套:所有分支语句可以相互嵌套
4.循环语句
4.1.循环的特点
- 任何循环都具备的两个特点是循环条件和循环操作。
4.2.循环分类
- 非固定次数循环:while 和 do-while。解题方式:确定条件和循环操作
- 固定次数循环:for。解题方式:确定3要素,即循环变量初始值、循环变量终止值(条件)和循环变量变化值(迭代)
- 注:只要是循环的问题,三者都可以解决。
4.3.for、while和do-while的比较
- for和while是先判断后执行,而do-while是先执行后判断。
- for擅长处理固定次数循环,while和do-while擅长处理非固定次数循环。
- for的循环变量一般定义在局部,循环外无法使用,而while和do-while的循环变量一般定义在循环外,循环结束后能使用。
4.4.多重循环
- 循环嵌套:3种循环相互可嵌套。
- 关键点:寻找行、列循环变量之间的关系
5.跳转语句
5.1.break
- 场合:switch、循环
- 作用:结束当前循环
- 注意:switch在循环中使用时,要注意break的影响,仅是用来结束switch的。
5.2.return
- 场合:方法的任何位置
- 作用:返回值,或对于无返回值的方法就会结束当前方法执行
5.3.continue
- 场合:只能用在循环中,结束本次循环
- 作用:加速循环
5.4.循环标签
- 场合:用在循环中
- 作用:对多层次循环起作用
- 语法:break 标签;或者 continue 标签;如下:
- a://标签
- for (int i = 1; i <= 5; i++) {
- for (int j = 1; j <= 5; j++) {
- if (i == 3) {
- // break;//结束内循环
- break a;//跳转到标签位置,结束外循环
- // return;//结束方法
- }
- System.out.print(i + "行," + j + "列 ");
- }
- System.out.println();
- }
- a://标签
- for (int i = 1; i <= 5; i++) {
- for (int j = 1; j <= 5; j++) {
- if (j == 3) {
- // continue;//结束本次内循环,进行下一次内循环
- continue a;//结束本次外循环,跳到下次外循环
- }
- System.out.print(i + "行," + j + "列 ");
- }
- System.out.println();
- }
五、补充知识
1.注释
单行注释: //
多行注释: /* */
文档注释: /** */
位置:
- 类,类中成员,接口等
生成:
- javadoc -d doc Hello.java //生成帮助文档,其中-d doc表示存放在doc目录中,没有则生成目录再存放。
- javadoc -d doc -author -version Hello.java //将作者和版本信息也生成
优秀的注释:
- 代码不明确的地方;
- 代码修改的地方;
- 经典算法;
- 分支和循环语句;
- 对外开发的,如接口。
2.print( ) 和 println( ) 的区别
print( ) 输出后不换行,必须带参数。
println( ) 输出后换行,可以不带参数。
3.转义字符
3.1.转义字符
定义
- 两个字符组合起来表示一个字符。
作用
- 有一些字符具有特别的意义,无法直接表示,需要通过转义字符。
表示方式
- 八进制表示:转义范围为\000-\377,转换成十进制是0-255;
- 十六进制表示:转义范围为\u0000-\uffff,转换成十进制是0-65535,其中u表示Unicode字符编码,什么是字符编码?见下面;
- 常用转义字符:\\ 表示反斜杠,\' 表示单引号,\"表示双引号,\t表示水平制表符且左对齐,\n表示换行符;
3.3.进制间的转换
- 十进制转二进制:除2取余法,到商为0终止,余数从下往上取,结果是从右往左写。
- 十进制转八进制:除8取余法,到商为0终止,余数从下往上取,结果是从右往左写。
- 十进制转十六进制:除16取余法,到商为0终止,余数从下往上取,结果是从右往左写。
- 二进制转十进制:位权求和法,从低位到高位组合运算,比如101,1*2^0+0*2^1+1*2^2
- 八进制转十进制:位权求和法,从低位到高位组合运算,比如17,7*8^0+1*8^1
- 十六进制转十进制:位权求和法,从低位到高位组合运算,比如19,9*16^0+1*16^1
- 二进制转八进制:从右向左3位组合,每个组合转换成十进制,按组合的顺序组成八进制值
- 二进制转十六进制:从右向左4位组合,每个组合转成十进制,按照组合顺序组成十六进制值
3.4.字符编码
3.4.1.什么是字符编码?
图片、音频都是以二进制方式存储,对于字符,给每个字符进行编码,然后将编码再转成二进制进行存储。例如欧美字符使用ascii码就能表示所有的字符,范围是0-255,用八进制表示,但是,亚洲国家都有自己的字符,所以也需给字符进行编码,所以需要对全世界所有已知的书面语言都进行编码,从而产生了Unicode编码,范围是0-65535,用十六进制表示。简单记忆:字符a十进制为97,八进制为\141,十六进制表示\u0061。
3.4.2.为什么要字符编码?
给字符编码后,计算机直接使用编码可以更容易也更高效的转换成二进制进行存取。
4.控制台输入
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner superman = new Scanner(System.in);//创建一个对象:创建一个超人
//调用方法:超人施展技能
//int n = superman.nextInt();//从控制台获取一个整数
//System.out.println("n = "+n);
//double n1 = superman.nextDouble();
//String n2 = superman.next();
char n3 = superman.next().charAt(0);
System.out.println("n3 = "+n3);
}
}
5.格式控制
5.1.输出格式:
- double n = 345.49379852389549;
- System.out.printf("我想展示小数%.2f", n);
- System.out.println();
- int n1 = 11;
- double n2 = 11.1;
- char c = 'a';
- boolean b = true;
- String s = "hello";
- System.out.printf("整数%d,小数%f,字符%c,布尔%b,字符串%s", n1,n2,c,b,s);
5.2.使用DecimalFormat类指定小数格式
- // 0 占位 四舍五入
- // # 占位 四舍五入
- DecimalFormat df = new DecimalFormat("0000.00");//整数部分,位数不够用0补齐
- System.out.println(df.format(n));
- DecimalFormat df1 = new DecimalFormat("####.##");//整数部分,位数不够不会补齐。
- System.out.println(df1.format(n));