1、八种基本类型
整形:byte(1个字节),short(2个字节),int(24个字节),long(8个字节)
浮点型:float(4个字节),double(8个字节)
布尔型:boolean(1个字节)
字符型:char(1个字节)
2、描述
基本类型又叫内置类型,八种基本类型都有对应的包装类。
基本类型是存储在栈中,因此他们的存取速度要快于存储在堆中的对应包装类的实例对象。
类型转换
自动类型转换:也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换,由于实际开发中这样的类型转换很多,所以java语言在设计时,没有为该操作设计语法,而是由JVM自动完成的, 规则:从存储范围小的类型到存储范围大的类型:byte-short(char)-int-long-float-double
强制类型转换:也称显示类型转换,是指需要写代码才能完成的类型转换, 该类型转换很可能存在精度的损失, 所以必须书写相应的代码,并且能够忍受该种损失时才进行该类型转换。 规则:从存储范围大的类型到存储范围小的类型:double-float-long-int-short(char)-byte
自动拆装箱
short Short
int Integer
long Long
float Float
double Double
注意:自动装箱没问题,下面使用 int--->Integer 来举例
比如比较常见的写法如下:
int a=3;
Integer A=new Integer(a);
或:
Integer A=Integer.valueOf(a);
源码:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
源码:
private final int value;
public Integer(int value) {
this.value = value;
}
因为传递的是基本类型都是0-9的组合,所以不会出现任何问题。
但是拆箱就有可能出现问题,因为Integer是类,有可能值是 null:(在开发中,我不止一次遇见该情况,导致:空指针异常)
常见写法:
Integer A=new Integer(5);
int a= A;
这里的
int a= A;
实际上调用的是:
int a = A.intValue();
到这里,可能就有人看出问题了。如果A 是 null ,那么这个代码就会出现空指针异常。所以在自动拆箱的时候,千万要判断一下是否是null。经验之谈·····
大家如果对一些不太了解的东西,可以写出代码,编译后,再反编译看一下,看看java编译器替我们做了什么,比如上面我们提到的代码:
编译前:
public class Test {
public static void main(String[] args) {
int a = 3;
Integer A = a;
Integer B = new Integer(5);
int b = B;
}
}
反编译后:
public class Test
{
public static void main(String[] paramArrayOfString)
{
int i = 3;
Integer localInteger1 = Integer.valueOf(i);
Integer localInteger2 = new Integer(5);
int j = localInteger2.intValue();
}
}
3、面试可能会问的问题
1、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?
答:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。
对于short s1=1;s1+=1来说 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
2、char类型变量能不能储存一个中文的汉子,为什么?
char类型变量是用来储存Unicode编码的字符的,unicode字符集包含了汉字,所以char类型当然可以存储汉字的,还有一种特殊情况就是某个生僻字没有包含在
unicode编码字符集中,那么就char类型就不能存储该生僻字。
3、Integer和int的区别
int是java的8种内置的原始数据类型。Java为每个原始类型都提供了一个封装类,Integer就是int的封装类。
int变量的默认值为0,Integer变量的默认值为null,这一点说明Integer可以区分出未赋值和值为0的区别,比如说一名学生没来参加考试,另一名学生参加考
试全答错了,那么第一名考生的成绩应该是null,第二名考生的成绩应该是0分。关于这一点Integer应用很大的。
Integer类内提供了一些关于整数操作的一些方法,例如上文用到的表示整数的最大值和最小值。
4、switch语句能否作用在byte上,能否作用在long上,能否作用在string上?
byte的存储范围小于int,可以向int类型进行隐式转换,所以switch可以作用在byte上
long的存储范围大于int,不能向int进行隐式转换,只能强制转换,所以switch不可以作用在long上
string在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了。
5、基本类型和非基本类型有什么区别?
Integer是类,产生对象时用一个引用指向这个对象
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
而实际的对象是在存储堆内存中,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理.