一、数据类型
(一)基础数据类型
1.1.1 整形变量
基本语法格式:
int 变量名 = 初始值;
示例:
int num=10;
System.out.println(num);
注意事项:
1.int占4个字节,其对应包装类为Integer
2.查看int型的最大值和最小值:
System.out.println(Integer.MAX_VALUE);//2^31-1
System.out.println(Integer.MIN_VALUE);//-2^31
1.1.2 长整型变量
基本语法格式:
long 变量名 = 初始值;
示例:
long num=10L;
System.out.println(num);
注意事项:
1.long占8个字节,其对应包装类为Long
2.初始化设定的值为10L或10l(小写L,不易区分,不建议使用),10L是默认long型,若单纯为10则为int型
3.查看long型的最大值和最小值:
System.out.println(Long.MAX_VALUE);//2^63-1
System.out.println(Long.MIN_VALUE);//-2^63
1.1.3 短整型变量
基本语法格式:
short 变量名 = 初始值;
示例:
short num=10;
System.out.println(num);
注意事项:
1.short占2个字节,其对应包装类为Shor
2.查看long型的最大值和最小值:
System.out.println(Short.MAX_VALUE);//2^15-1
System.out.println(Short.MIN_VALUE);//-2^15
1.1.4 双精度浮点型:
基本语法格式:
double 变量名 = 初始值;
示例:
double num=1.0;
System.out.println(num);
注意事项:
1.double占8个字节,对应包装类为Double
2.浮点数类型的在内存中存储比较特殊,遵循IEEE 754标准(这方面和C语言相同),都是尝试使用有限的空间表示有无限可能的小数,所以势必会存在误差!例如下面这个代码:
double num=1.1;
System.out.println(num*num)//结果为1.2100000000000002
(这主要原因在于2^-1=0.5,可见在小数部分用二进制表示是很难准确表达0.1的)
1.1.5 单精度浮点型
基本语法格式:
float 变量名 = 初始值;
示例:
float num=1.0f;
System.out.println(num);
注意事项:
1.float占4个字节,对应包装类为Float
2.float因为想使用更小的内存表示一个浮点数,可见其精度相比于double类型必定要做出一定的让步
3.注意示例中的代码中1.0f(或者写成1.0F),对于float类型的变量赋值时必须加上F或者f,表示此数为float,否则会默认为double类型,若将double类型变量赋给float类型变量则会存在精度丢失的问题!
(上面对于长整型,l或者L可以省略,因为整形默认为int,将int类型变量赋给long类型变量不存在精度丢失的问题)
1.1.6 字符类型
基本语法格式:
char 变量名 = 初始值;
示例:
char ch='A';
System.out.println(ch);
注意事项:
1.char占两个字节(原因是Java中的char是利用Unicode编码表示,所占字节数比ASCII码大的多,所能表示的字符种类也就更多,可以理解ASCII码表为Unicode编码表的子集),对应包装类为Character
2.在用命令行编码时如果遇到“未结束的字符文字”,可能是因为命令行编码使用的是GBK编码,可以加上命令-encoding UTF-8
1.1.7 字节类型
基本语法格式:
byte 变量名 = 初始值;
示例:
byte value=0;
System.out.println(value);
注意事项:
1.byte占一个字节(可以认为这类似于C语言的char类型),对应包装类为Byte
2.byte虽然类似于C语言的char类型,但是byte与char互不相干,因为byte没有对应的字符
3.byte的取值范围:
System.out.println(Byte.MAX_VALUE);//2^7-1
System.out.println(Byte.MIN_VALUE);//-2^7
4.注意!!!隐式类型转换!!!,任何小于int类型大小的数值数据参与运算都会转换成int类型
1.1.8 布尔类型
基本语法格式:
boolean 变量名 = 初始值;
示例:
boolean value = true;
System.out.println(value);
注意事项:
1.boolean占用具体多少个字节并未明确规定,有些JVM实现是1个比特位,有些则是一个字节,对应包装类为Boolean
2.boolean是个比较单独的数据类型,不能转换成其他类型!!因为Java中没有C语言中0为假,非0为真的规定,Java中真即为true,假即为false,boolean也只有这两个值,不要于数字挂钩,这也意味着while(1)在Java中会报错!
(二)引用数据类型
1.2 字符串类型
基本语法格式:
String 变量名 = "初始值";
示例:
String name = "zhang san";
System.out.println(name);
注意事项:
1.String是引用类型,其本质是一个类
2.字符串的+操作,表示为字符串拼接
String a = "Hello";
String b = "World";
String c = a + b;
System.out.println(c);//Hello World
3.字符串与整数亦可以拼接
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);//result = 1020
数据类型可以总结为下面这个表,默认值在类和对象才考虑(实例变量不初始化时)。
二、运算符
2.1 算术运算符
2.1.1 基本四则运算符:+ - * / %
除法:/
注意事项:
a) int / int结果还是int,若要保持小数部分用double
int a=1;
int b=2;
System.out.println(a/b);//0
b)0不能作为除数,会报异常
取模:%
注意事项:
a)Java中的%不仅可以对int取模,也可以对double取模
System.out.println(11.5/2.0);//1.5
2.1.2 增量赋值运算符:+= -= *= /= %=
复合赋值运算符其实是赋值运算的简写,但事实上有些不太一样,因为增量赋值运算符会自动帮我强制转换
byte a=1;
System.out.println(a+=2);
System.out.println(a=a+2);//err
因为这里存在隐式类型转换 a+2是int类型!!
2.1.3 自增/自减运算符:++ –
1.如果不取自增\自减运算的表达式的返回值,则前置和后置没有区别
2.如果取表达式的返回值,则前置自增\自减的返回值是自增\自减之后的值,后置自增\自减的返回值是自增\自减之前的值
2.2 关系运算符:== != < > <= >=
int a=10;
int b=20;
System.out.println(a == b); System.out.println(a > b); System.out.println(a < b); System.out.println(a != b); System.out.println(a >= b); System.out.println(a <= b);
2.3 逻辑运算符:&& || !
逻辑与:&&
1.两个操作数有一个为false,结果为false
2.存在短路操作
System.out.println(10 > 20 && 10 / 0 == 0);//不会出异常 因为短路 只要第一个为false,后面不运算
逻辑或:||
System.out.println(10 < 20 || 10 / 0 == 0);//不会出异常 因为短路,只要第一个为true,后面不运算
两个操作数有一个为true,结果为true
逻辑非:!
操作数为true,结果为false;操作数为false,结果为true
System.out.println(!true);
2.4 位运算符:& | ~ ^
按位与:&
如果两个二进制都是1,则结果为1,否则结果为0
int a=10;
int b=20;
System.out.println(a & b);
按位或:|
如果两个二进制都是0,则结果为0,否则结果为1
int a=10;
int b=20;
System.out.println(a | b);
注意:当 & 和 | 的操作数为整数时,表示按位运算,当操作数为boolean的时候,表示逻辑运算(此时&和&&类似,|和||类似,但是&和|无短路求值)
按位取反:~
如果二进制位中该位为0则转为1,如果该位为1则转为0
int a=0xf;
System.out.printf("%x\n",~a);
注意:
1.0x 表示十六进制 0表示八进制
2.printf表示为格式化输出内容
3.%x表示按照十六进制输出
按位异或:^
如果两个数字的二进制位相同,则结果为0,相异则结果为1
int a = 0x1;
int b = 0x2;
System.out.printf("%x\n",a^b);
特性:
1.相同数异或为0
2.0异或任何数结果为该数
2.5 移位运算符:<< >> >>>
左移 <<:
最左侧位不要了,最右侧补0
int a = 0x10;
System.out.printf("%x\n",a<<1);//20(十六进制表示)
左移<<的结果相当于乘于2,当然对于负数例外
右移 >>:
最右侧位不要了,最右侧补符号位(整数补0,负数补1)
int a = 0x10;
System.out.printf("%x\n",a>>1);//8(十六进制表示)
右移 >>的结果相当于除于2,当然对于负数例外
无符号右移 >>>:
最右侧位不要了,最左侧补0
2.6 条件运算符:?
表达式1(结果为boolean) ? 表达式2:表达式3
表达式1为true,整个表达式值位表达式2;表达式1为false,整个表达式值位表达式3;
int a = 10;
int b = 20;
System.out.printfln(a>b?a:b);