常量
定义:在程序执行过程中其值是不变的;
- 字符串常量:用双引号括起来的内容;
- 整数常量:所有整数;
- 小数常量:所有小数;
- 字符常量:用单引号括起来的内容,里面只能放单个数字、单个字母或单个符号(‘10’ 错误写法);单引号中什么也不放也是不行的,因为代表不了任何内容(‘’ 错误写法);(‘ ’)加个空格是可以的;
- 布尔常量:只有true和false;
- 空常量:null;
进制
- 星星和月亮,月亮和太阳的进制:四进制(QQ等级);
- 十进制的由来是因为人类有十个手指;
- 厂商的500GB硬盘实际没有500GB,是因为它是以1000为单位而不是计算机中的1024为单位,所以它的500GB=500*1000(M)*1000(K)*1000(B)/1024(K)/1024(M)/1024(G)约等于实际的465GB(按1024算);
- 进制越大表现形式越短;
不同进制数据表现形式
- 二进制的数据表现形式:由0,1组成,以0b(b可以大写也可以小写)开头(JDK1.7版本可以表示二进制了);
- 八进制的数据表现形式:由0,1…,7组成,以0开头;
- 十六进制表现形式:以0x(x可以大写也可以小写)开头;
任意进制到十进制的转换
- 系数*基数的权次幂相加即可
十进制到任意进制的转换
- 除积倒取余
原码反码补码
- 原码:最高位为符号位,0为正,1为负;通过一个字节,也就是8个二进制表示+7和-7;
- 反码:正数的反码与其原码相同,负数的反码是对其原码逐位取反,但符号位不变;
- 补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1;
- 运算的时候都是以补码的形式进行运算的;
- 补码转原码:补码减1再取反;
java数据类型
- 基本数据类型:整数型、浮点型、字符型、布尔型;
- 引用数据类型:字符串、类、接口、数组;
基本数据类型
整数型
- byte:占一个字节,-128~127(记住);
- short:占两字节,-2^15 ~ 2 ^15-1;
- int:占4字节,-2^31 ~ 2 ^31 -1;
- long:占8字节,-2^63 ~ 2 ^63 -1;
注意: 如果long类型后面加L进行标识最好加大L,因为小L太像1了;
浮点型
- float:占4字节,单精度;-3.403E38 ~ 3.403E38
注意: float类型想要表示小数,必须在小数后面加上f 或 F. - double:占8字节,双精度;-1.798E308 ~ 1.798E308(小数默认数据类型,double后面的d或D可加可不加)
float f=1.23f; //加上f是为了防止精度错误,因为默认是double类型的
double d=1.23;
字符型
- char:占两字节,0~65535,注意取值没有负数;
布尔类型
- boolean:理论上占八分之一个字节,因为一个开关就可以决定true和false了,但是java中的boolean类型没有明确指定它的大小;(记住)
数据类型转换之隐式转换
小的转大的;
当小的数据类型和大的数据类型进行运算时,小的数据类型会被转换成大的数据类型。
数据类型转换之强制转换
大的转小的;
注意:如果超出了被赋值的数据类型的取值范围,得到的结果会与你期望的结果不同。
int a=20;
byte b=110;
b=(byte)(a+b);
//此时得到的b值为-126,而实际为130
//00000000 00000000 00000000 10000010 130的二进制
//10000010 -126的补码
//10000001 -126的反码
//11111110 -126的原码
变量相加和常量相加的区别
变量相加
byte b1=3;
byte b2=4;
byte b3=b1+b2;
//这是错误的,可能损失精度。
/*
从两方面解释原因:
1.byte与byte(或short、int)进行运算时会提升为int,两个int型的相加结果还为int。而b3为byte类型
2.b1和b2是两个变量,变量存储的值是变化的,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值。
*/
常量相加
byte b3=3+4;
byte b4=7;
//这是正确的
/*
这是因为:**java编译器有常量优化机制**。编译器在编译时直接判断3+4在byte取值范围之间,而上面所说的变量时无法在编译时进行判断的。
*/
long与float的取值范围谁大谁小
- 进行混合运算的时候,byte,short,char不会相互转换,都会自动将类型提升为int类型进行运算,其他类型进行混合运算的时候是小的数据类型提升为大的,比如:int类型和long类型进行运算时,int类型提升为long类型。
- byte,short,char – int – long – float --double
- long:8个字节
float :4字节
但为什么float的取值范围更大呢?
A:它们底层的存储结构不同
float:1位符号位;8位是指数位(-126~127)
B: float表示的数据范围要比long的范围大
字符与字符串参与运算
System.out.println('a' + 1); //98 ,因为有ASCII码表,a字符对应的是int类型的97
System.out.println((char) 'a' + 1); // b
System.out.println("hello"+'a' + 1); //任何数据类型用+与字符串相连都会产生新的字符串
System.out.println('a' + 1+“hello”); //98hello
char数据类型
char c1=97; //char取值范围:0-65535(编译时判断)
System.out.println(c1); //a
//char可以存储中文
char c2=‘中’;
//只能存储一个汉字
//因为java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。中文也是占用两个字节。
算术运算符
- +号的三种作用:代表正号、做加法运算、字符串的连接
- 整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型(10/3.0)
- %运算符:
1)当左边的绝对值小于右边的绝对值时,结果是左边;
2)当左边的绝对值等于右边或是右边的倍数时,结果是0;
3)当左边的绝对值大于右边的绝对值时,结果是余数;
4)%运算符结果的符号只和左边有关系,与右边无关;
5)任何一个正整数%2结果不是0就是1可以用来当做切换条件;
算术运算符++和–的用法
- 单独使用
放在操作数的前面和后面效果一样。 - 参与运算使用
1)放在操作数前面,先自增或者自减,然后在参与运算;
2)放在操作数后面,先参与运算,再自增或者自减;
int a=3;
int b=a++; //b=3,a=4;
int c=++a; //c=4,a=5;
int x=4;
// y= 4 + 6 + 6*10
int y=(x++) + (++x) + (x*60) //x=6,y=70
byte b=10;
b++; //不会报错 ,b=(byte)(b+1),++底层会自动加上强制转换
b=b+1; //报错
//原因:当byte与int 进行混合运算时,会提升为int类型,两者想加仍为int型,赋值给byte会损失精度,所以要加上强转。
赋值运算符
= 、*= 、/=、+=…
short s=1;
s=s+1;//报错,当short与int 进行混合运算时,会提升为int类型,两者想加仍为int型,赋值给byte会损失精度,所以要加上强转。
s+=1;//不会报错,s=(short)(b+1),++底层会自动加上强制转换
关系运算符
==、!=、>=、<=、>、<