基本数据类型
关于java的类型,这里讲解基本类型,引用类型较复杂,分开来讲,那么开始把,基本类型有8种:
- 整数类型:btye、short、int、long
- 浮点类型:float、double
- 字符类型:char
- 布尔类型:boolean
他们占用的字节数及其默认值如下:
数据类型 | 字节数 | 默认值 |
---|---|---|
byte | 1 | 0 |
short | 2 | 0 |
int | 4 | 0 |
long | 8 | 0 |
float | 4 | 0.0 |
double | 8 | 0.0 |
char | 2 | 空 |
boolean | 1 | false |
引用类型 | 4 | null |
引用类型统一4字节,存对应的地址
注意:
整形默认int、浮点默认double,所以注意使用,eg:
long a = 10000000000;
float b = 1.2;
//上面代码都会报错的,应改为:
long a = 10000000000L;
float b = 1.2f;
创建变量,是申请内存来存储值,分配的内存只能存兼容该类型的数据,小类型主要用来节省空间
自动类型转换:
- 不能对boolean类型转换
- 不能把对象类型转换成不相关的对象类型
- 大容量转小容量必须使用强转
- 转换溢出或损失精度
隐含强制转换:
- 整数默认int
- 浮点默认double
浮点型损失精度:
-
通常是差值的绝对值小于一个很小的数
-
if ( Math.abs(x - y) < 0.00001 ) //这样二者才默认相等
-
-
十进制0.1转换成二进制是无限循环,保存在存储器上会截取损失精度
一个char保存一个Unicode字符,Java内存中总是用Unicode表示字符,即英中字符都是用一个char表示
**四舍五入**
(int)(1.2 + 0.5)
布尔的短路运算
boolean result = 2 > 1 && (1 / 0 > 0);
// 布尔运算的表达式能提前确定结果,则后续的计算不再执行,上面不报错
包装类型
Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。主要作用如下:
- 集合不允许存放基本数据类型,用包装类作为对象就可以传入
- 使基本类型有了属性,如最大值、最小值、所占位数等
- 使之有了实用的对象操作,如类型转换、进制转换
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以直接赋值时是相等的,而new出来是不等的
Integer i1 = 127;
Integer i2 = 127;
System.err.println(i1 == i2); //true
Integer i3 = new Integer(10);
Integer i4 = new Integer(10s);
System.err.println(i3 == i4); //false
赋值是有返回值的,赋什么值,就返回什么值,if()里面应该用boolean而int不能转报错
int x = 5;
int y = 10;
if(x = y)
System.out.println(“Not equal”);
else
System.out.println(“Equal”);
操作数都为:byte、short、int 、char,两个数都会被转换成int类型,并且结果也是int类型,但final修饰就不会向上转型了
byte b1 = 1,b2 = 3,b3;
final byte b4 = 4;
b4 = b1 + b2;
b3 = b1 + b2//报错,后者转为整形,而b3还是为byte
基本型和基本型封装型进行“==、+=”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true
int a = 220;
Integer b = 220;
System.out.println(a == b);//true
自动拆箱装箱
装箱:Integer.valueOf(int i) 返回Integer变成对象
拆箱:Integer.intValue 变成基本类型,返回int
两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
Integer a = 1;
Integer b = 2;
Integer c = 3;
System.out.println(c.equals(a + b)); //true
Switch支持的类型:
- 基本数据类型:int,byte,short,char
- 基本数据类型封装类:Integer,Byte,Short,Character
- 枚举类型:Enum(JDK 5+开始支持)
- 字符串类型:String(JDK 7+ 开始支持)
包装类的缓存:
该缓存建立在自动装箱基础上,如果是直接new的话就不起作用,当包装类加载时内部会初始化一个缓存数组,如果数值在缓存范围内会直接返回缓存数组的对象,而不会新建对象
- Boolean:(全部缓存)
- Byte:(全部缓存)
- Character(<= 127缓存)
- Short(-128 — 127缓存)
- Long(-128 — 127缓存)
- Integer(-128 — 127缓存)
- Float(没有缓存)
- Doulbe(没有缓存)
互转:
-
字节/字符数组 --> 字符串 new String(byte/char[] arr)
-
字符串 --> 字节数组 getBytes()
-
字符串 --> 字符数组 toCharArray()
-
基本类型 --> 字符串 String.valueof()
-
字符串 --> 基本类型 包装类.parseXXX()
-
十进制 --> 二进制 Integer.toBinarySting(num)
-
基本类型/字符串 --> 包装类 包装类.valueof()
-
包装类 --> 字符串 包装类实例.toString()
-
包装类 --> 基本类型 包装类实例.XXXValue();
**初始值:** 成员变量才会有初始值,局部变量必须先赋值才能编译通过
**运算符:** - &&等一对的具有短路功能,即前面能判断结果就不判断后面的 - == 和 === 前者相对相等,1 == ‘1‘,不同类型会自动转换 ;后者绝对相等,需要类型也相等