每天一篇系列:
强化知识体系,查漏补缺。
欢迎指正,共同学习!
常量、变量关联到的数据类型问题:
JAVA基本数据类型:
byte | char | short | int | float | long | double |
---|---|---|---|---|---|---|
1 | 2 | 2 | 4 | 4 | 8 | 8 |
(byte)0 | \u0000(null) | (short)0 | 0 | 0.0f | 0L | 0.0d |
对于数据的拆箱和装箱又是怎样?Java为每种基本数据类型都提供了对应的包装器类型。
从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:
Integer i = 10;
这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。
实际上,执行上面那句代码的时候,系统为我们执行了:
Integer i = Integer.valueOf(10);
那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型:
Integer i = 10; //装箱
int n = i; //拆箱
简单一点说,装箱就是自动将基本数据类型转换为包装器类型;
拆箱就是自动将包装器类型转换为基本数据类型。
1.下面这段代码的输出结果是什么?
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//false
}
}
在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。
2.谈谈Integer i = new Integer(xxx)和Integer i =xxx;这两种方式的区别。
主要有以下这两点区别:
1)第一种方式不会触发自动装箱的过程;而第二种方式会触发;
2)在执行效率和资源占用上的区别。第二种方式的执行效率和资源占用在一般性情况下要优于第一种情况(注意这并不是绝对的,在从cache中直接返回对象引用时是高效的)
String的特殊性:
String,StringBuild,StringBuffer:
String是常量对象,从线程安全上看,StringBuilder不是线程安全的,而StringBuffer内部源码中有synchronized来实现线程安全;从运行速度上来看,String最慢因为需要多次创建对象,StringBuilder最快因为没有同步锁的限制。
首先来看一段这样的代码:
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);
这段代码主要分析第三行代码的执行,由于String是一个常量对象,第三句实际上重新创建了一个对象(adcde)然后赋值给str,如果String常量池中已经存在adcde对象,则直接返回其引用,否则创建新的对象。
final String item = "abc";
String check = "adcde";
String result = item +"de";
如果String被final修饰,那么result和check是同一个对象,final属性修饰时,会直接使用值替换变量。