一,数据类型
1,基本数据类型:
1)整型:byte short int long
2)浮点:float double
3)字符:char
4)布尔:boolean
integer可以看作是int的plus版本
2,长整型变量 long
注意事项:
1,长整型变量的初始值后加L或l,推荐加L
2,长整型不论在什么系统下都占8个字节
3,长整型的表示范围是:-2^63到2^63-1
4,long的包装类型为Long
3,短整型变量 short
注意事项:
1,占2个字节16位
2,表示范围:-2^15到2^15-1
3,包装类型:Short
4,默认值为0
4,字节型变量 byte
注意事项:
1,byte在任何系统下都占1个字节
2,byte的范围是:-128到127
3,字节的包装类型是Byte
5,双精度浮点型变量 double
注意事项:
1,double在任何系统下都占8个字节
2,浮点数与整数在内存中的存储方式不同,不能单纯使用2^n的形式来计算
3,double的包装类型为Double
4,double类型的内存布局遵守IEEE 754标准(和c语言一样),尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差,因此浮点数是个近似值并不是精确值
6,单精度浮点型 float
注意事项:
1,float在任何系统下都占4个字节
2,包装类型是Float
3,float类型的内存布局遵守IEEE 754标准(和c语言一样)
float f = 12.5
float = 12.5F
以上两种写法中,第一种写法会报错(注意末尾加分号,此处省略了)
7,字符型变量 char
char c1 = 'A';//大写字母
char c2 = '1';//数字字符
System.out.println(c1);
System.out.println(c2);
//注意:java中的字符可以存放整型
char c3 = '帅';
System.out.println(c3);
1,java中使用 单引号+单个字母 的形式表示字符字面值
2,计算机中的字符本质上是一个整数,在c语言中使用ASCll表示字符,而java中使用Unicode表示字符,因此一个字符占用两个字节,表示的字符种类更多,包括中文
8,布尔类型 boolean
注意事项:
1,0是假 非零是真 这句话在java中不合适
2,在java中,布尔类型只有2个取值,true或false
3,java中boolean类型不能和int相互转换 因此不存在1表示true ,0表示false这样的用法
4,JVM中没有规定boolean占用几个字节,但oracle(甲骨文)公司的虚拟机中,boolean占1个字节
5,boolean的包装类型是Boolean
二,类型转换
分为两种 自动类型转换(隐式) 强制类型转换(显式)
1,自动类型转换(隐式)
自动类型转换:代码不需要经过任何处理,在代码编译时,编译器会自动处理
特点:数据范围小的转化为数据范围大的时会自动进行
byte b1 = 100;//编译通过,100没有超过byte的范围,编译器隐式将100转化为byte
byte b2 = 257;//编译失败,257超过了byte的数据范围,有数据丢失
System.Out.println(1024);//整型默认情况下是int
System.Out.println(3.14);//浮点型默认情况下是double
2,强制类型转换(显式)
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成.
特点:数据范围大的到数据范围小的
int a = 10;
Long b = 100L;
a = (int)b;
//使用了强制类型转换,在编译层面讲不会报错
//但是具有一定风险 在某些情况下可能会丢失内容
byte a = 10;
int b = 129;
a = (byte)b;
//结果输出是 -127
注意事项:(自动类型转换 & 强制类型转换)
1,不同数字类型的变量之间赋值,表示范围更小的类型能隐式转化为范围较大的类型
2,如果需要把范围大的类型赋值给范围小的,需要强制类型转化,但是可能精度丢失
3,将一个字面值常量进行赋值的时候,java会自动针对数字范围进行检查
4,强制类型转换不一定能够成功,不相干的类型不能互相转换
3,byte与byte的运算
byte a = 10;
byte b = 20;
byte c = (byte)(a+c);
//byte c = a + b;会报错,从int转换到byte可能会有损失
System.out.println(c);
结论:虽然a和b都是byte,但是计算a+b时会将a+b都提升为int再进行计算,得到的结果也是int,此时赋值给byte类型的c就会出现错误
由于计算机的CPU通常是按照4个字节为单位从内存中读写数据,为了硬件上实现方便,像byte和short这样低于4个字节的类型,会先提升为int再参与计算
4,字符串类型
1,使用加号可以对字符串进行拼接
String str = "hello";
String str2 = "world";
System.out.println(str+str2);
//会输出 helloworld
注意,在java中,字符串中没有\0结尾的说法
String str = "hello"
System.out.println(str.length());
//结果输出是 5
str.length() 可以输出str的长度
2,在java中用string来定义字符串类型,在有些情况下需要把字符串和整形数字之间进行转换
那么我们如何实现两者之间的转换呢?看代码:
public class Test{
public static void main(String[] args){
String s = "123";
//int a = Integer.parseInt(s);
int a = Integer.valueOf(s);//底层实现parseInt
System.out.println(a+1);
}
}//结果输出124
因此要实现字符串和整数之间的转换,可以使用valueof 和 parseint
三,运算符
1,小数求余
对整数求余数我们都知道,但是如何对小数求余数呢?
System.out.println(11.5%2.0);
//结果输出 1.5
因此,%不仅可以对整数取模,也可以对double类型取模,但是没有意义,一般都是对整形取模
在两侧操作数类型不一致的时候,向类型大的提升
System.out.println(1+0.2);
//+的左侧是int,右侧是double,在加之前int被提升为double
//输出1.2
2,增量运算符 += -= *= %=
该种运算符操作完成后,会将操纵的结果赋值给左操纵数
注意:
1,单独使用时,前置++与后置++没有区别
2,如果混合使用,前置++先+1,然后使用变量+1之后的值,后置++先使用变量原来的值,表达式结束后给变量+1
3,常量不能使用自增/自减运算符,因为常数不允许被修改
3,关系运算符 == != < > <= >=
1,计算结果是true或者false
2,短路求值
System.out.println(10>20 && 10/0==0);//打印false
System.out.println(10<20 || 10/0==0);//打印true
对于&&,如果左侧表达式值为false,则表达式结果一定是false,无需计算右侧表达式
对于 || , 如果 左侧表达式值为true,则表达式结果一定是true,无需计算右侧表达式
对于 & 和 | ,如果表达式结果为boolean,也表示逻辑运算,但与&& ||相比,他们不支持短路求值
3,按位与 & :
只要对应位有0,则当前位就是0
4,按位或 | :
只要对应位有1,则当前为就是1
5,按位异或 ^ :
只要对应位不一样,当前位就是1
6,按位取反 ~ :
把对应位上的每一个都取反
n ^ n = 0
0 ^ n = 0
这是按位取反的一个小规律
4,位运算符 用于对二进制进行操作
注意:左移和右移运算符优先级较低,使用时建议用括号明确运算顺序
1,左移运算符 <<
注意:向左移位时,丢失的是符号位,因此正数左移可能会编程负数
2,右移运算符 >>
最右侧位不要了,最左侧补符号位(正数补0,负数补1)
3,无符号右移 >>>
无符号右移无论正负,右侧移动后左侧一律补0,仅适用于int和long类型
4,总结:
1,左移一位,相当于原数字 * 2,左移N位,相当于原数字*2的N次方
2,右移一位,相当于原数字 /2,右移N位,相当于原数字/2的N次方
3,由于计算机移位效率高于计算乘除,当某个代码正好乘除2的N次方时,可以用移位运算代替
4,移动负数位或者移位位数过大无意义
5,三目运算符
格式:布尔表达式1? 表达式2 : 表达式3
如果表达式1为真,则返回表达式2的结果,否则返回表达式3的结果