1. 标识符?
在程序中自定义的名称。由英文字母大小写,数字,下划线 (_)美元符号($)组成。
除以上所列几项之外,标识符中不能含有其他符号,当然也不允许插入空格。在程序中,标识符可用作变量名、方法名、接口名、类名等。标识符内可以包含关键字,但不能与关键字完全一样。
Java中的名称规范:
包名:多单词组成时所有字母都小写。如:xxxyyyzzz
类名接口名:多单词组成时,所有单词的首字母大写。如:XxxYyyZzz
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。如:xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接。如:XXX_YYY_ZZZ
2. 常量与变量?
1) Java中常量的分类:
1,整数常量。所有整数
2,小数常量。所有小数
3,布尔型常量。较为特有,只有两个数值。true false。
4,字符常量。将一个数字字母或者符号用单引号( ' ' )标识。
(一个汉字两个字节,也可以作为字符)
5,字符串常量。将一个或者多个字符用双引号标识。
6, null常量。只有一个数值就是:null
对于整数:java有三种表现形式。
•十进制:0-9,满10进1.
•八进制:0-7,满8进1.用0开头表示。
•十六进制:0-9, A-F,满16进1.用0x开头表示。
2) 变量
变量的概念?
•内存中的一个存储区域
•该区域有自己的名称(变量名)和类型(数据类型)
•该区域的数据可以在同一类型范围内不断变化
为什么要定义变量?
•用来不断的存放同一类型的常量,并可以重复使用
什么时候定义变量?
当数据不确定的时候,需要对数据进行存储时。就是定义一个变量来完成存储动作。
使用变量注意?
•变量的作用范围(一对{}之间有效)
•初始化值
定义变量的格式?
•数据类型变量名 = 初始化值;
理解:变量就如同数学中的未知数。
Java中数据类型:
3. 类型转换
1) 自动类型提升
byte b = 3;
int x = 4;
x = x + b;//b会自动提升为int类型进行运算。
2) 强制类型转换
byte b = 3; /此处正确,3是常量,直接赋给变量
b = b + 4;//报错,b是变量,2为整数类型,b自动提升为整数类型,重新赋给b丢失精度
b = (byte)b+4;//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b。
3) 运算时的转换:
byte b1=3,b2=4,b;
b=b1+b2;//报错,虚拟机规定,int short boolean byte char在运算时都会转为int,32bit整型
b=3+4;//常量赋值
4. 进制的转换?
1) 十进制二进制互转
•十进制转成二进制除以2取余数(从下到上取):
•二进制转成十进制乘以2的幂数:1011 = 1*2^3+0*2^2+1*2^1+1*2^0 = 11;或者根据"1,2,4,8"直接求出来:8+0+2+1 = 11
2) 二进制转成十六进制
四个二进制位就是一个十六进制位,因为1111=15,满十六进一位
3) 二进制转成八进制
三个二进制代表一个八进制位
4) 十进制八进制互转
5) 十进制十六进制互转
6) 负数的二进制表现形式
•对应的正数二进制取反加1;正数的最高位为0,负数取反,所以负数的最高位为1
例如:-6的二进制
一个INT类型的整数在内存中是占4个字节,32bit
5. 运算符
1) 算数运算符
b=a++等同于b=a=a+1;先赋值给b,然后自增1;
b=++a等同于b=a=a+1;先自增然后赋值给b;
字符串数据和任何数据使用+都是相连接,最终变成字符串:
System.out.print(”5+5”+5+5) 输出:5+555
2) 转义字符
\n:换行符
\t:制表符,相当于TAB键
\r:相当于linux系统中按下回车键,,Windows系统中由 \r\n组成
\b:退格,相当于backspace
\”:双引号
3) 赋值运算符
符号:
= , +=, -=, *=, /=, %=;
Short a=3
a=a+3//编译失败,丢失精度,是先做加法运算再进行赋值,两步计算
因为a会被提升为INT类型,运算后的结果还是INT类型,无法赋值给short类型。
a+=3//编译通过,只有一步赋值运算,会做自动转换动作
因为+=运算符在赋值时,自动完成了强转动作。
4) 比较运算符
提示:
比较运算符“==”不能误写成“=”。
5) 逻辑运算符
true & true = true;
true & false = false;
false & true = false;
false & false = false;
& :只要两边的boolean表达式结果,有一个为false。那么结果就是false。
只有两边都为true,结果为true。
true | true = true;
true | false = true;
false | true = true;
false | false = false;
| :两边只要有一个为true,结果为true。
只有两边都有false,结果为false。
^ :异或;就是和|有点不一样。当true ^ true = false;
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^ :两边相同结果是false。两边不同结果是true。
&和&&的特点:
&:无论左边是true是false。右边都运算。
&&:当左边为false时,右边不运算。
|:两边都参与运算。
||:当左边为true。右边不运算。
6) 位运算符:
(直接对二进制进行运算,运算速度最快,但是有局限性,以2的倍数增减)
<<:乘以2的移动的位数次幂;
>>:除以2的移动位数次幂;
>>:原最高位是什么就补什么;
>>>:最高位补0;
&:只要两边的boolean表达式结果,有一个为false,那么结果就是false。只有两边都为true,结果为true。
|:两边只要有一个为true,结果为true;只有两边都为false,结果为false。
^:两边相同结果是false,两边不同结果是true。
一个数异或同一个数两次,结果还是那个数。用来加密,然后解密(加密算法)
对两个整数的值进行互换(不借助第三方)?
a=5,b=6
a=a^b
b=a^b//b=(a^b)^b=a
a=a^b//a=a^(a^b)=b,=右边的值仍然是初始值a=5,b=6
7) 三元运算符
(条件表达式)?表达式1:表达式2;是if else结构的简写
•如果条件为true,运算后的结果是表达式1;
•如果条件为false,运算后的结果是表达式2;
好处:简化if else代码
弊端:因为是运算符,所以运算完必须要有一个结果。
8) 运算符优先级
优先级 | 运算符 |
1 | () [] . |
2 | ! +(正) -(负) ~ ++ -- |
3 | * / % |
4 | +(加) -(减) |
5 | << >> >>> |
6 | < <= > >= instanceof |
7 | == != |
8 | &(按位与) |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= |
6. 程序流程结构控制
判断结构:
if
if…else …
if…elseif...else…
选择结构:
switch(表达式)
{
case 取值1:
case 取值2:
执行语句;
break;
case 取值3:
执行语句;
break;
…
Default:
执行语句;
Break;//可以省略
}
Switch特点:
1) switch语句选择的类型只有四种:byte, short, int, char。
2) case之间与default在定义的时候没有顺序。先执行第一个case,没有匹配的case执
行default。
3) 结束switch语句的两种情况:遇到break,执行到switch语句结束。
4) 如果匹配的case或者default没有对应的break,那么程序会继续向下
执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
if和switch语句很像,具体什么场景下,应用哪个语句呢?
switch如果判断的具体数值不多,而是符合byte short int char这四种类型。
虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。
if...else...为什么比switch效率低?
1. switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
2. switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选择执行哪一个case的语句块
3. 3.if..else的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
一次。
所以在多路分支时用switch比if..else if .. else结构要效率高。
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if判断;而 switch只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1和 2分别被读入寄存器一次。于是你是否发现其实 a读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case版本:
switch (a) {
case 0:
break;
case 1:
}
因为特定的规则,他一开始就知道你要比 a,于是 a一次性读取,相比 if节约了很多开销。
循环结构:
1)
While(条件表达式)
{执行语句};
2)
Do
{执行语句}
While(条件表达式);
While与do while的区别?
while:先判断条件,只有条件满足才执行循环体。
do while: 先执行循环体,在判断条件,条件满足,再继续执行循环体。
简单一句话:do while:无论条件是否满足,循环体至少执行一次。
3)
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,
为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,
重复找个过程,直到条件不满足为止。
While与for区别?
while与for可以互换,区别在于,用于控制循环的增量定义在for语句中,在for循环结束就在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。
最简单无限循环格式:
while(true) , for(;;),无限循环存在的原因是并不知道循
环多少次,而是根据某些条件,来控制循环。
累加思想:
原理:通过变量记录住每次变化的结果。通过循环的形式。进行累加动作。
计数器思想:
通过一个变量记录住数据的状态变化。也是通过循环完成。
break(跳出),continue(继续)
break语句:应用范围:选择结构和循环结构。
continue语句:应用于循环结构。
提示:
a,这两个语句离开应用范围,存在是没有意义的。
b,这个两个语句单独存在下面都不可以有语句,因为执行不到。
c,continue语句是结束本次循环继续下次循环。
d,标号的出现,可以让这两个语句作用于指定的范围