再准备面试时我们一般会比较重视多线程,JVM,HashMap,数据库和框架等一些经常出现的问题,可能会对语法问题有些混淆。这篇帮你复习一下我在面试时遇到过的java语法面试题。
1.八种基本数据类型是什么?他们的包装类型是什么?各占多少个字节?
- 整型: 字节型 byte Byte 1个字节、 短整型 short Short 2个字节、 整型 int Integer 4个字节、 长整型 long Long 8个字节
- 浮点型:单精度 float Float 4个字节、双精度 double Double 8个字节
- 字符型:char Character 2个字节
- 布尔型:boolean Boolean 1字节
2.Integer类概述
-
Integer是java为int提供的封装类。int的默认值为0。 而Integer的默认值为null
-
即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别
3.Integer比较不要使用==;使用equals()或Integer.intValue()
我们知道Integer是int的包装类,在jdk1.5以上,可以实现自动装箱拆箱,就是jdk里面会自动帮我们转换,不需要我们手动去强转,所以我们经常在这两种类型中随意写,平时也没什么注意
但Integer他是对象,我们知道 == 比较的是堆中的地址,但有个奇怪的事是, 如果 Integer a = 123, Integer b = 123,可以返回true,但如果Integer a = 12345, Integer b = 12345,返回false,这就是jdk的东西,我们看下Integer的源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
默认IntegerCache.low 是-127,Integer.high是128,如果在这个区间内,他就会把变量i当做一个变量,放到内存中;但如果不在这个范围内,就会去new一个Integer对象,
而我在代码中,两个Integer值都不在这个范围内,所以jdk帮我new了两个实例,这样在用==,肯定是false。
所以如果要比较Integer的值,比较靠谱的是通过Integer.intValue();这样出来的就是int值,就可以直接比较了;或者equals()比较
4.String为什么不可变
-
String类中使用字符数组保存字符串,private final char value[],被final修饰了。
5.String,StringBuffer和StringBuilder的区别。
String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。
StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
6.==与equals的区别
- ==比较的是地址,equals比较的是内容
7.Final和Finally和Finalize的不同
- final修饰符(关键字):被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。被final声明的方法也同样只能使用,即不能方法重写。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。
- finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。
- finalize是方法名。属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断
8.重载和重写的区别。
- 重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
- 重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。