在jvm中主要存在8大基础数据类型分别是(byte、int、long、short、float、double、char、boolean)
基本数据类型 | 对应的包装类 |
byte(内存8位,无符号位时最大存储255,表数范围:-128~127) | Byte |
short(内存16位,无符号位时最大存储65536,表数范围:-32768~32767) | Short |
int(内存32位,无符号位时最大存储(2^32)-1,表数范围:-2^31~(2^31)-1) | Integer |
long(内存64位,无符号位时最大存储(2^64)-1,表数范围:-2^61~(2^61)-1) | Long |
float(内存32位,数据范围在2^-149~(2^128)-1,直接赋值时必须在数字后加上f或F) | Float |
double(内存64位,数据范围在2^-1074~(2^1024)-1,赋值时可以加d或D也可以不加) | Double |
char(内存16位,存储Unicode字符集,用单引号赋值,因为有ASCLL码对应值,可以参与加减乘除运算和比较大小) | Character |
boolean(数值只有true和false,不能用0代替;其他数值类型不能转换成boolean) | Boolean |
装箱与拆箱
装箱是指由基本数据类型向对应的包装类型转换。例如,int包装成Integer类的对象。
拆箱是指有包装类转换成基本数据类型。例如,把Integer类的对象简化成int。
常见包装类应用(手动装箱与拆箱)
1、实现int和Integer相互转换
Integer类通过构造方法将int装箱,通过intValue()方法进行拆箱。
int n = 1;
Integer m = new Interger(n);//手动装箱
int n = m.intValue();//手动拆箱(typeVale)
2、自动装箱与拆箱
Java 1.5之后,Java支持自动装箱和拆箱
int n = 1;
Integer m = n;//自动装箱
int a = m;//自动拆箱
二、四大引用类型
引用类型分为:数组,类,接口,字符串。
数组:其实就是一个容器,存储同一种数据类型的集合;如 int[] a = {1,2,3,4}
类:对象是对事物的抽象,而类是对对象的抽象和归纳;如 public class Person{ ......}
接口:使用interface来定义一个接口,只能定义方法,不能有方法的实现;如public interface personImpl{......}
字符串:是存放数据区(静态区)以Unicode编码的字符集合,如 String a="你好"
基本类型与引用类型的区别:
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
三、==和equals的比较
3.1、基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 当存在基本数据类型和包装类型进行比较的时候,由于jvm的自动装箱机制和自动拆箱机制使其也可以使用==进行比较
3.2、复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。 对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
实践:
/**
* Created by Administrator on 2019/2/17.
*/
public class LearnDataType {
public static void main(String []args){
int i = 10;
Integer i1 = 10;
Integer i2 = new Integer(10);
int j = 128;
Integer j1 = 128;
Integer j2 = new Integer(128);
System.out.println("i1:"+i1);
System.out.println("i2:"+i2);
System.out.println("i==i1:"+(i==i1));
System.out.println("i==i2:"+(i==i2));
System.out.println("i2==i:"+(i2==i));
System.out.println("i1==i2:"+(i1==i2));
System.out.println("i2==i1:"+(i2==i1));
System.out.println("i1.equals(i):"+(i1.equals(i)));
System.out.println("i2.equals(i):"+(i2.equals(i)));
System.out.println("i2.equals(i1):"+(i2.equals(i1)));
System.out.println("i1.equals(i2):"+(i1.equals(i2)));
System.out.println("j==j1:"+(j==j1));
System.out.println("j==j2:"+(j==j2));
System.out.println("j2==j:"+(j2==j));
System.out.println("j1==j2:"+(j1==j2));
System.out.println("j2==j1:"+(j2==j1));
System.out.println("j1.equals(j):"+(j1.equals(j)));
System.out.println("j2.equals(j):"+(j2.equals(j)));
System.out.println("j2.equals(j1):"+(j2.equals(j1)));
System.out.println("j1.equals(j2):"+(j1.equals(j2)));
System.out.println(new Integer(15));
}
}
i1:10
i2:10
i==i1:true
i==i2:true
i2==i:true
i1==i2:false(由于两个对象在使用==进行比较的时候是通过比较引用的地址是否相等)
i2==i1:false
i1.equals(i):true
i2.equals(i):true
i2.equals(i1):true
i1.equals(i2):true
j==j1:true
j==j2:true
j2==j:true
j1==j2:false
j2==j1:false
j1.equals(j):true
j2.equals(j):true
j2.equals(j1):true
j1.equals(j2):true
15
在jvm中通常存在常量池,主要缓存的数据是8大基础数据类型,以及字符串缓存常量池
通常基础数据类型变量赋值是从常量池里面获取,如果不存在的话,则创建一个常量,而当使用new的话则是在堆里面创建一个对象并且引用的值是常量池里面的值