Java数据类型
变量
-
为什么定义变量
要向内存中存储数据,而数据是能够改变的,可以使用变量来存储数据
-
如何定义变量
语法: 数据类型 变量名 [= 值 ]
建议在定义变量时为其赋值
3. 如何使用变量 1. 变量要先定义再使用 2. 变量是有作用域的(就是{}),在同一个作用域中变量不能重复定义(定义了变量名相同的变量),当作用域执行结束后,变量就失效 public static void main(String[] args) { //age的作用域是 main方法 { int age = 0; System.out.println(age); double age = 0; //错误的 } { double age = 0; //正确的 } }常量
常量的值不能改变
- 用final修饰的变量就是常量
- 在程序中出现的所有字面量(数字、字符串等)都是常量
Java的数据类型
数据类型决定了变量能够存储什么数据、变量在内存空间中的长度
-
数据类型的分类
分为基本数据类型和引用数据类型
-
基本数据类型(简单数据类型)
基本数据类型
- 整数类型
byte 1字节(8bit) -128 ~ 127
short 2字节(16bit) -2^15 ~ 2^15 -1
int 4字节(32bit) -2^31 ~ 2^31 -1
long 8字节(64bit) -2^63 ~ 2^63 -1
long如果存储不下的,改变数据的单位降低其精度,也可以使用Java的类BigInteger类等
程序中出现的所有整数常量值默认都是int类型
//将int类型的20赋给了int类型的变量age int age = 20;- 浮点类型
float(单精度): 4字节 -3.048E38 ~ 3.048E38
double(双精度) : 8字节 -1.798E308 ~ 1.798E308
程序中出现的所有浮点常量值默认都是double类型
//3.15是 double类型 赋给double的pi变量 final double pi = 3.14;在整数的后面可以加L 、在浮点数的后面可以加 f、d
//不能将double的数据赋给float变量float f = 3.14f;double d = 3.1423424;//3000000000000默认是int类型 ,其值超出了int的范围System.out.println(3000000000000L);long a = 3000000000000L; //为什么编译能通过? //编译器在校验语法时,f是浮点变量,浮点是不精确的 //无法校验数据的范围,只能校验类型 float f = 3.14; //错误 //编译器在校验语法时,b是整数变量,校验10是否在byte范围内 byte b = 10;- 字符类型(char)
java中有字符和字符串,字符串是由字符组成,字符值是用单引号标注,字符串使用双引号标注
所有的字符值都是基于Unicode编码的
char 2字节 (16bit)
字符值的两种写法:
char c = 'a'; //等同于 char c1 = '\u0061'; //unicode中97的字符字符值除了普通的字符还有转义字符 ,转义字符可以理解为功能字符,例如回车符、换行符、制表符(tab)
\在Java中是转义符
\r 回车符 光标移动到当前行的第一位
\n 换行符 光标移动到下一行 , 键盘的Enter键相当于 \r\n
\t 制表符 相当于tab键,起到二维表格数据对齐的作用
\\ \
//在控制台输出内容: \a\ System.out.println("\\a\\"); //今后在表示目录字符串时 System.out.println("d:\\lession\\java2601");\” ”
System.out.println("这两个东西\"相等\"");\’ ’
- 布尔类型(boolean)
boolean类型的值只能是 true和false ;true代表真,false代表假 ;在存储时true存储在1bit中是1 ;falsee存储在1bit中是0
boolean 1字节
boolean经常用来做逻辑上的判断
运算符
运算表达式 : 含有运算符的表达式,运算表达式都具有结果
算数运算符
+ - * / %(取余,取模) ++ —
++ : 递增运算 变量的值自加1
++i 或 i ++ 都是对i自加1
当要用到自增表达式的结果时,i++ 先取i的值作为自增表达式的结果 ; ++i 先对i自增1在获取i的值作为表达式的结果
int i = 3; int j = i++; System.out.println(j); //3 System.out.println(i); //4int i = 3;System.out.println((i++)+(++i)); //3+5System.out.println(i); //5赋值运算符
= += *= /= %= …
public static void main(String[] args) { int i = 3; //赋值表达式的结果就是赋的值 System.out.println(1+2); //i赋值7,定义一个j变量存储i的值 int j = i = 7; } int i = 3; i+=2; //i = i + 2;比较运算符
比较运算表达式的结果一定是boolean类型
== 两边是否相等 > < >= <= != 不等于
逻辑运算符
boolean值参与的运算就是逻辑运算
非运算: ! true的非是false
与运算:&& 理解为自然语言中的 并且 , 只要有false结果就是false ,只有true&&true才是true
或运算: || 理解为自然语言中的 或者 ,只要有true结果就是true,只有false||false才是false
int i = 3; System.out.println(!(i==4));位运算符
每一位(bit)都参与的运算 ,通常位运算的效率要高于普通运算
1.按位取反运算 :~ 2.按位左移和右移 : <<左移 >>右移 符号位是不移动的 <<相当于乘2 >>相当于除2
m<<n 相当于 m*2^n
3.移位效率高于乘除
带符号位移动的右移 >>>
//int的最大值 System.out.println(-1>>>1); //int的最小值 System.out.println(~(-1>>>1));4.按位与或非
~按位非运算,就是按位取反
&按位与运算,0相当于false;1相当于true
|按位或运算
&&称为短路与运算 如果第一个boolean值(boolean表达式的结果)为false ,后面的表达式就不再执行,结果直接为false ,效率比按位与高
& 按位与运算,两个boolean表达式进行按位&运算,两个表达式都要执行
public static void main(String[] args) { int i = 3; /* System.out.println(i>5&&i++<10); System.out.println(i); //3 */ System.out.println(i>5&i++<10); System.out.println(i); //4 }5. 按位异或运算
每一位不同的结果是1,相同的结果是0
System.out.println(3^5); //6假设a^b=c 那么c^a=b ; c^b = a
实例:交换两个变量的值,用两种写法实现
写法一:
int a = 3; int b = 4; int c = a; a = b; b = c; System.out.println(a+","+b);写法二:
int a = 3;int b = 4;a = a^b;b = a^b;a = a^b;System.out.println(a +","+b);位运算应用总结
###判断奇偶应用
a&1 == 1 是奇数 ; 如果==0是偶数
取余运算
a%2^n 等同与 a&(2^n-1)
乘2除2
a*2^n 等同与 a<<n
平均值运算
(x+y)/2 是有溢出的风险,使用(x&y)+((x^y)>>1)计算
运算符的优先级
- 开头是 括号 ;结尾是赋值
- 算数运算符 、比较运算符 、逻辑运算符
- >><< 比 + - 低
- 与运算 高于 或运算
数据类型的转换
-
为什么要进行数据类型的转换
1.两个数据在运算时,要统一类型,结果的类型就是统一后的类型
2.在调用一个功能时,需要一个类型的数据,而我们拥有的数据和需要的数据类型不一致,要进行类型转换
-
如何进行数据转型
- 自动转型:自动向上转型
byte — short — int — long — float — double
char — int …
//5.0 double类型 2 int类型 //自动向上转型 2转为了2.0 System.out.println(5.0/2); //2.5 //'a' 是char类型 1是int类型 System.out.println('a'+1); //98 System.out.println(2.0%5); //2.0 //17.0是double 0是int //0转为double 无限接近0的小数 System.out.println(17.0/0); //Infinity无穷大 int i = 16; System.out.println(Math.sqrt(i)); 2.强制转型:需要向下转型时
(类型)变量或值
强制转型可能会造成数据的缺失
System.out.println((int)5.0/2);System.out.println((int)5.9/2);System.out.println((char)('a'+1)); //bdouble d1 = 3.1;double d2 = 3.2;Math.floorDiv((int)d1,(int)d2);八种基本类型除了boolean类型都可以互相转换
编程时尽量使用 i++ 或 i+=3 、i*=5 写法,因为不需要转型操作
Java SE
Related articles
部分信息可能已经过时