java的数据类型和其他的语言一样就分为:值类型 比如:int double float long 等,引用类型 比如String Object Array Date等。
不同的数据类型在内存中存储的位置是不一样的。
值类型 引用类型
存储在栈中 地址存在栈中,数据存储在堆中
所以要注意的是引用类型的赋值其实是把地址赋给另外一个变量他们指向的是堆中的同一份数据。
值类型的赋值就是副本的拷贝。
这里要注意的地方是:
整数 默认就是int类型
小数默认就是double类型
数据类型的转换,小可以自动转换成大,比如 byte 0-255可以自动转换成范围更大的int类型而无需强制转换
说到数据类型肯定少不了比较,我们常用的比较就是“==”和equals两种方式前者是引用的比较,后者是比较内容。但是在包装类型和值类型比较的时候又会有些许的不同。一下就是这种情况的说明,还有就是String类型是引用类型那么使用“==”比较会相等呢?
public static void main(String[] args) { //装箱 基本类型转换成包装类型 //拆箱 包装类型转换成基本类型 Integer a = 300; Integer b =300; int c = 300; Integer d =100; Integer e =100; Integer f =5; Long g = 3L; Long h = 2L; int i = 100; //1.==比较 //==另个数都是包装类型的时候比较的是不是指向同一个对象,但是有一种情况在Integer=100 在装箱的时候Integer.ValueOf返回的是同一个对象所以是相等,为什么返回的是同一个对象可以看下jdk源码在一定的范围内这个函数返回的就是同一个对象(返回内存区已经存在的对象) System.out.println(d==e);//true System.out.println(a==b);//false //== 有等号的一边是基本类型那么在比较的时候包装类型会拆箱为基本类型,所以比较的就是基本类型的数值是否相等 System.out.println(c==a);//true //2.equals,对于包装类型在进行equals比较的时候不会进行类型转换 //g+h首先会进行的是拆箱操作变成基本类型相加之后进行装箱操作变成包装类型 但是由于f是Integer 右边是Long,equals比较的时候不会进行类型转换所以false System.out.println(f.equals(g+h));//false //基本类型和包装类型用equals进行比较的时候比较的只是值是否相等,基本包装类型就会转换成值类型进行比较 System.out.println(a.equals(c));//true System.out.println(a.equals(b));//true //在这里都返回的是true。==比较的是对象引用,equals比较是内容。String s1 = "String"; 这种方式声明的对象,首先会在缓冲区查找是否在"String"如果存在直接赋值给变量,没有就创建一个。所以s1==s2 String s1 = "String"; String s2 = "String"; System.out.println(s1 == s2 ); System.out.println(s1.equals(s2)); //直接new出来的对象都是在内存分配的空间所以直接用==肯定是false String s3 = new String("String"); String s4 = new String("String"); System.out.println(s3 == s4);//false System.out.println(s3.equals(s4));//true }