【三】Java经典面试题(附答案)每日更新5题

一、静态变量和实例变量的区别?

(1)静态变量:是被static修饰的变量,也称为类变量,它属于类,因此不管创建多少个对象,静态变量在内存中有仅一个拷贝;静态变量可以实现让多个对象共享内存。
(2)实例变量:属于某⼀实例,需要先创建对象,然后通过对象才能访问到它。

二、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?

(1)对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会⾃动提升表达式的类型为 int ,那么将 int 型值赋值给short 型变量,s1 会出现类型转换错误。
(2)对于 short s1 = 1; s1 += 1; 来说,+= 是 Java 语⾔规定的运算符,Java 编译器会对它进⾏特殊处理,因此可以正确编译。

三、Integer 和 int 的区别?

(1)int 是 Java 的⼋种基本数据类型之⼀,⽽ Integer 是 Java 为 int 类型提供的封装类;
(2)int 型变量的默认值是 0,Integer 变量的默认值是 null,这⼀点说明 Integer 可以区分出未赋值和值为 0 的区分;
(3)Integer 变量必须实例化后才可以使⽤,⽽ int 不需要。

Integer 和 int 的⽐较延伸:

1、由于 Integer 变量实际上是对⼀个 Integer 对象的引⽤,所以两个通过 new ⽣成的 Integer 变量永远是不相等的,因为其内存地址是不同的;

2、Integer 变量和 int 变量⽐较时,只要两个变量的值是相等的,则结果为 true。因为包装类 Integer 和基本数据类型 int 类型进⾏⽐较时,Java 会⾃动拆包装类为 int,然后进⾏⽐较,实际上就是两个 int 型变量在进⾏⽐较;

3、⾮ new ⽣成的 Integer 变量和 new Integer() ⽣成的变量进⾏⽐较时,结果为 false。因为⾮ new ⽣成的Integer 变量指向的是 Java 常量池中的对象,⽽ new Integer() ⽣成的变量指向堆中新建的对象,两者在内存中的地址不同;

4、对于两个⾮ new ⽣成的 Integer 对象进⾏⽐较时,如果两个变量的值在区间 [-128, 127] 之间,则⽐较结果为true,否则为 false。Java 在编译 Integer i = 100 时,会编译成 Integer i = Integer.valueOf(100),⽽ Integer 类型的 valueOf 的源码如下所示:从上⾯的代码中可以看出:Java 对于 [-128, 127] 之间的数会进⾏缓存,⽐如:Integer i = 127,会将 127 进⾏缓存,下次再写 Integer j = 127 的时候,就会直接从缓存中取出,⽽对于这个区间之外的数就需要 new 了。

public static Integer valueOf(int var0) { 
 return var0 >= -128 && var0 <= Integer.IntegerCache.high ?
Integer.IntegerCache.cache[var0 + 128] : new Integer(var0);
}

包装类的缓存:
Boolean:全部缓存
Byte:全部缓存
Character:<= 127 缓存
Short:-128 — 127 缓存
Long:-128 — 127 缓存
Integer:-128 — 127 缓存
Float:没有缓存
Doulbe:没有缓存

四、装箱和拆箱

⾃动装箱是 Java 编译器在基本数据类型和对应得包装类之间做的⼀个转化。⽐如:把 int 转化成 Integer,double转化成 Double 等等。反之就是⾃动拆箱。
原始类型:boolean、char、byte、short、int、long、float、double
封装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double

五、switch 语句能否作⽤在 byte 上,能否作⽤在 long 上,能否作⽤在String 上?

在 switch(expr 1) 中,expr1 只能是⼀个整数表达式或者枚举常量。⽽整数表达式可以是 int 基本数据类型或者Integer 包装类型。由于,byte、short、char 都可以隐式转换为 int,所以,这些类型以及这些类型的包装类型也都是可以的。⽽ long 和 String 类型都不符合 switch 的语法规定,并且不能被隐式的转换为 int 类型,所以,它们不能作⽤于 switch 语句中。不过,需要注意的是在 JDK1.7 版本之后 switch 就可以作⽤在 String 上了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值