java的8种基本数据类型:
数值(最高位 符号位)
整型
byte 1 [-128,127] -27,(27)-1
short 2 -32768,32767 -215,(215)-1
int 4 -231,(231)-1
long 8 -263,(263)-1
浮点
float 4(1符号8指数23小数位) -2^128 3.4E^38 小数点后6-7位
double 8(1符号11指数52小数位) -2^1024 1.7E^108 小数点后15-16位
java程序里整数的字面值(直接值)默认是int类型,如果超出int表示范围的字面值得加上l/L, 在字面值后面加上l/L就表示该数据是long类型的
java程序里浮点数的字面值(直接值)默认是double类型,只有在该值末尾加上f/F表示是float类型的数据
字符 char 2 0-65535
第一种:给一个[0,65535]区间的值
第二种: 用单引号 ’ '一个字符 可以是中文字符
第三种:Unicode编码 \u 十六进制的数 ‘\uxxxx’ x{0-9,a-f}
布尔 boolean 1 true false
类型转换:
隐式类型转换(默认):短字节的数据可以隐式转换成长字节的数据
byte->short->int->long->float->double
char–>int
byte short char在进行计算时会先转换成int类型计算 所以得到的结果也是int类型
强制类型转换:
长字节数据转换成短字节数据需要用强制类型转换
1.数据可能溢出
2.精度可能缺失
变量:
1.变量的声明(定义) 变量必须先声明后使用
2.变量的初始化 变量必须初始化之后才能取值
3.变量的操作 取值 赋值
4.变量名的规则
一、运算符 操作符
-
算术运算符
-
-
- / %
数据溢出问题
/ 除法 整数得到的结果是int 商的整数部分
% 取余 商是整数,剩下的余数
浮点类型进行算术运算得到的结果可能不精确
- / %
-
-
-
赋值运算符
混合赋值运算符 += -= *= /= %=
变量 X= 操作数;
字符串: 由字符组成的一个串
在java中用"" 引起的内容就称之为字符串
字符串支持 + 运算,把字符串和其它数据拼接在一起
但是不支持 += 运算
字符串和任意数据相加的结果都是字符串
-
关系运算符 结果是boolean类型 结果只有true或者false
= < <= == !=
x>y 如果x的值大于y,结果为true,否则为false
x>=y 如果x的值大于或者等于y,结果为true,否则为false
x<y
x<=y
xy 判断是两个等于号,因为一个=是赋值运算符
x!=y !(xy) -
逻辑运算符 逻辑运算符操作数是布尔类型
多个关系表达式之间 一定要用 逻辑运算符 连接
多个关系表达式不能直接连用 x<num<y ERROR
把多个布尔类型转接在一起得到一个结果
&& || !a&&b a b 结果
true true true
true false false
false true false
false false false
&&逻辑与,只有连接两个布尔类型数据的值都为true时结果才为truea||b a b res
true true true
true false true
false true true
false false false
||逻辑或,只有当连接两个布尔类型数据的值为false时结果才为false!逻辑取反
!a a res
true false
false true逻辑运算符的短路特性:
expr1 && expr2
用&&连接表达式,如果&&前面的表达式expr1的结果为false时,这个时候无论expr2的值为true还是false,都影响不了最终结果,所以这个程序为了效率,直接不再计算表达式expr2expr1 || expr2 用||连接表达式,如果||前面的表达式expr1的结果为true时,这个时候无论expr2的值为true还是false,都影响不了最终结果,所以这个程序为了效率,直接不再计算表达式expr2 以上特性称之为逻辑运算符的短路特性
-
自增自减运算符
++ –
前后++
前后–
++num: 前++,先自增1,然后根据自增1之后的结果再进行运算
num++: 先拿num的值进行运算,运算完之后,num的值自增1
num++
++ --不要连用,对于一个变量在一个表达式中最好只出现一次++或者–y = ++x; /相当于/ x = x+1; y = x;
y = x++; /相当于/ y = x; x = x+1;
特别注意:计算机中存储数据是存储数据的补码形式
-
位运算符
& | ^ ~ << >> >>>
& 按位与 二进制位
a & b (a和b代表二进制位的一位上的值)
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
推论:-1 & num = num| 按位或 二进制位
a | b
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
推论:-1 | num = -1
0 | num = num^ 按位异或 异1
a ^ b
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
推论:0 ^ num = num
-1 ^ num = ~num
~ 按位取反
~a
0 1
1 0<< 按位左移 num << n ===> num << n%32; 移位大于32时会对32求余
左边移出的部分舍弃,右边补0
如果不考虑溢出的问题,其实就是原来的基础之上 乘以 2^n
向左移一位,相当于乘以2按位右移 (带符号右移)
右边移出的部分舍弃,左边补符号位 为什么补符号位是因为想保证负数右移之后依然是负数
向右移n位 相当于 除以 2^n
向右移1位 相当于 除以 2无符号右移
右边移出的部分舍弃,左边补0
-1>>n 结果都是-1010(八进制的数) 10(十进制的数)
二进制: 01 java不能直接表示二进制
十进制: 0-9
八进制: 0-7 java中以0打头的数值是八进制的数
十六进制:0-9a-f java中以0x打头数值是十六进制的数二、八、十六进制转换成十进制
十进制 转换成 二进制
二进制 与八进制 十六进制 之间的相互转换
0 101 010 101 --> 八进制 从右往左 每三位一单元 0525
01 0101 0101 --> 十六进制 从右往左 每四位一单元 0x155
01011011101 01335 0x2dd
0111111011101 07735 0xfdd
01732465 --> 001111011010100110101
0xfda59e --> 111111011010010110011110如果用八进制表示一个int类型的数据 0[0-3]7777777777
如果用十六进制表示一个int类型的数据 0x0 - 0xffffffff十进制的整数换算成二进制:
(1)除以2求余数 直到商为0 余数从下往上依次即二进制
(2)用2^n凑数 如果大于该数,则该为1,否则为0
317 = 0100111101
317-256 = 61 - 32 = 29-16=13-8=5-4=1
二进制数据转换成十进制的数:二进制的位*2^n 从右往左第n位,n从0开始
01011010101 =
2^9 + 27+26 + 2^4 + 2^2 + 2^0
= 512 + 128 + 64 + 16 + 4 +1
= 725
计算机中存储数据所用的进制是二进制:
一个数据最高位代表符号位: 0代表正数 1代表负数
一个int有32个二进制位
1. 原码 直接把整数换算成二进制 如果是负数,最高位填1
2. 反码 负数的反码 符号位不变,其它位按位取反
3. 补码 负数的补码等于其反码+1
5+5 = 10
0101
0101
1010 = 10
原码计算有问题:
5+(-5) = 0
0...0101
1...0101
1...1010 = -10
反码算加法没问题:
0...0101
11111010
11111111 10000000 = -0 = 0
反码计算正数减负数有问题:
5-(-5)
0...0101
11111010
00001011 11
补码解决了正数减负数的问题:
0...0101
11111011
00001010 10
从而计算机中存储数据都是以补码的形式
0-5 = -5
0000000000
0000000101
1111111011 最高位是1表示是一个负数
1111111010 -> 1000000000101 -5
7.三目运算符
expr?val1:val2
如果expr为true,则表达式结果为val1,否则为val2
val1和val2可以是表达式,但不能是语句
8.其它运算符
() 用来提高优先级
建议常使用()
, int x=1,y=2;
[] 数组访问运算符
JAVA语句:
语句块:用{}括起来的语句 语句块
一般来说当遇到{花括号时,下面的语句会向右缩进4个空格
遇到}花括号时,语句向左回4个空格
好的程序可以说是一种艺术
-
顺序执行语句
从上往下依次顺序执行 -
分支选择语句
遇到不同的情况执行不同的代码
(1)if分支选择语句
例子:键盘输入一个整数 判断输入的这个整数是不是大于0
如果大于0输出 “正数” 两个字
情况一:当条件为true时执行语句块的内容 当为false时直接跳过语句块
//条件只能控制语句块本身执不执行 并不能左右语句块后面的语句
if(condition){
//code
}
例子:判断一个整数是偶数还是奇数 直接输出 “偶数” 或者 “奇数”
当一个整数确定之后,这个数只会是偶数或者奇数,而且只会是其中一种
情况二:只会选择其中之一的语句块执行 而且一定会选择其中之一执行
if(condition){
//当condition为true时执行此代码块的语句
}else{//转折关系 否则
//当condition为false时则执行此代码块的语句
}
例子:输入一个月份,输出该月份有几天
1,3,5,7,8,10,12 这些月份有31天
4,6,9,11 这些月份有30
2 可能28天,可能29天
剩下其它情况 月份不存在
情况三:判断其中一些情况,从上往下判断,如果满足其中之一则执行该语句块,后面的不再进行判断 如果所有条件都为false时那么一个也不执行
if(con1){
//当con1条件为true时执行
}else if(con2){
//当con1条件为false且con2为true时执行
}else if(con3){
//当con1和con2都为false且con3为true时执行
}else if(conn){
//当con1…con(n-1)都为false且conn为true时执行
}
情况四:一定会选择其中之一分支执行
if(con1){}else if(cod2){ }else if(cod3){ }else if(codn){ }else{ //当以上条件都不满足的时候执行该分支 } 如果有多个if..else if 当前面有条件满足之后,后面的条件不管true还是false都不会执行
(2)switch分支选择语句
开关语句 表达式的结果 和 case语句的值 相等时 就相当于打开开头,进入执行,依次往下执行,如果要结束switch语句,必须用break关键字 或者 一直执行到语句块结束
switch(表达式){
case 常量表达式1:
code
break;
case 常量表达式2:
code
break;
…
case 常量表达式n:
code
break;
[default://可以省略 相当于if语句中的else
code
]
//default放在位置不重要,都是要等所有的case都判断过了之后没有符合的情况才会执行default语句 一般来说放最后
}if(expr cond) 针对if()里的内容 只要结果是true/false即可
switch(表达式) 针对switch()里的表达式它的结果只能是整数类型(byte short int long) 或者 char
但是从JDK1.7版本开始,已经支持字符串
case后面的表达式的结果一定是精确的判断一个浮点类型变量是否等于0
float f = xx;
if(f < 0.000001 && f > -0.000001){
//就表示f的结果为0
}分支选择语句嵌套
-
条件循环语句
只要满足一定的条件不断重复执行某些代码