计算机存储单元
最小的信息单元叫 位 (bit) b
最小的存储单元叫 字节(byte) B
- 1B=8bit
- 1KB=1024B
- 1MB=1024KB
- 1GB=1024MB
- 1TB=1024GB
数据类型
Java中数据类型内存占用和取值范围
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1 | -128~127 |
短整型 | short | 2 | -32768~32767 |
整型 | int (默认) | 4 | -2的31次方 到 2的31次方-1 |
长整型 | long | 8 | -2的63次方 到 2的63次方-1 |
单精度浮点数 | float | 4 | 负数:-3.402823E+38 到 -1.401298E-45 正数:1.401298E-45 到 3.402823E+38 |
双精度浮点型 | double (默认) | 8 | 负数:-1.797693E+308 到 -4.900000E-324 正数:4.9000000E-324 到 1.797693E+308 |
字符型 | char | 2 | 0~65535 |
布尔型 | boolean | 1 | true ,false |
注意
以下类型需要在后面加个标志
//long类型要在数字后面加个L
long num1=10L;
//float类型要在数字后面加个F
float num2=11.13F;
- 如果不加会怎么样?
- 不加L默认是int,int转为long是安全的;会自动转,能编译通过
- 浮点数不加F默认是double类型,double转float可能会损失精度;不会自动转,编译通不过
- 如果超过int的取值范围还不加L,也会报错了
整数拓展
进制 :二进制 十进制 八进制 十六进制
0b 0 0x
public class Demo {
public static void main(String[] args) {
int i1=10;
int i2=010;
int i3=0x10;
//十进制
System.out.println(i1);
//八进制0
System.out.println(i2);
//十六进制0x
System.out.println(i3);
}
}
输出结果:
10
8
16
浮点数拓展
public class Demo {
public static void main(String[] args) {
float f=0.1F;
double d=1.0/10;
System.out.println(f==d);
System.out.println(f);
System.out.println(d);
float d1=23827835867f;
float d2=d1+1;
System.out.println(d1==d2);
}
}
输出:
false
0.1
0.1
true
- 解释
最好完全避免使用浮点数进行比较
字符拓展
public class Demo {
public static void main(String[] args) {
char c1='a';
char c2='中';
System.out.println(c1);
//强制转换
System.out.println((int)c1);
System.out.println(c2);
//强制转换
System.out.println((int)c2);
char c3='\u0061'; //Unicode表 U0000-UFFFF(97-a 65-A)
System.out.println(c3);
}
}
a
97
中
20013
a
- 解释
- 所有的字符本质上还是数字(强制转换可以把字符转成数字)
- java 的 char 类型变量是用来储存 Unicode 编码字符的,Unicode 字符集包含了汉字,所以 char 类型自然就能存储汉字,但是在某些特殊情况下某个生僻汉字可能没有包含在 Unicode 编码字符集中,这种情况下 char 类型就不能存储该生僻字了
- 转义字符
public class Hello {
public static void main(String[] args) {
// \t 制表符
// \n 换行
System.out.println("Hello\tWorld!");
}
}
输出
Hello World!
留个悬念
public class Demo {
public static void main(String[] args) {
String sa="Hello world";
String sb="Hello world";
System.out.println(sa==sb);
String sc=new String("hello world");
String sd=new String("hello world");
System.out.println(sc==sd);
}
//对象 从内存分析
}
输出结果:
true
false
类型转换分类
1.自动类型转换(高-> 低)
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。
例如:double d=10;
代码演示:
public static void main(String[] args) {
int i = 128;
double b = i;
System.out.println(i);
System.out.println(b);
}
输出结果:
128
128.0
2.强制类型转换(低-> 高)
把一个数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
- 格式 目标值类型 变量名=(目标数据类型)值或者变量名
- 例子
int k=(int) 8.88; // k=8;
- 类型转换由低到高:
表示数据范围从小到大图
代码演示:
public static void main(String[] args) {
int i = 128;
byte b = (byte)i;
System.out.println(i);
System.out.println(b);
}
输出结果:
128
-128
解释:
byte的范围是-128~127,128显然溢出了
byte a = 127;
a+=5;
System.out.println(a);
输出结果: -124
解释:首先byte取值范围-128~127 当a+=1时此时已经是超过了byte的临界值此时输出的为-128 、a+=2时输出 为-127,以此类推a+=5时输出为-124
注意点
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干的类型
- 在把高容量转换为低容量的时候,强制转换
- 转换的时候可能存在内存溢出,或者精度问题
// 23
System.out.println((int)23.7);
// -45
System.out.println((int)-45.89f);
常见问题
public class Hello {
public static void main(String[] args) {
//操作比较大的数,注意溢出问题
//JDK7新特性,数字之间用下划线分割
int money = 10_0000_0000;
int year = 20;
int total = money * year;
//-1474836480
System.out.println(total);
//money*year默认是int,转换之前已经出问题了
long total2 = money * year;
//-1474836480
System.out.println(total2);
long total3 = money * ((long) year);
//20000000000
System.out.println(total3);
}
}