1. 八种基本数据类型的大小,以及他们的封装类。
基本数据类型 | 封装类型 | 字节大小 |
---|---|---|
byte | Byte | 1 |
short | Short | 2 |
int | Integer | 4 |
long | Long | 8 |
float | Float | 4 |
double | Double | 5 |
character | Character | 2 |
boolean | Boolean | - |
2. Switch能否用string做参数?
- JDK1.5之前,支持byte、short、char、int;
- JDK1.5,支持enum类型;
- JDK7开始,支持字符串(String);
3. equals与==的区别?
==常用于比较原生类型(
byte, short, int, long, float, double, char, boolen
);- equals()方法用于检查对象的相等性。
注:如果用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。
以String类为例子说明eqauls与==的区别:
String str1 = "abc";
String str2 = "abc"; //从常量池中获取,因此内存地址是一致的
System.out.println(str1 == str2); //true
System.out.println(str1.equals(str2)); //true
String str2 = new String("abc"); //创建了一个新对象,产生了一个新地址
System.out.println(str1 == str2); //false
System.out.println(str1.equals(str2)); //true
String类源码
public final class String {
public boolean equals(Object anObject) {
// 1.先比较内存地址,内存地址相等就说明引用指向的是同一个对象
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = count;
if (n == anotherString.count) {
int i = 0;
while (n-- != 0) {
// 2.对比两个字符串的每一个字符
if (charAt(i) != anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
}
4. 四种引用(强、弱、软、虚)
强引用(Strong Reference):如Object obj = new Object()。
软引用(Soft Reference):当堆将发生OOM时会回收软引用所指向的内存空间,一般用于实现内存敏感的高速缓存。
弱引用(Weak Reference): 发生GC时必定回收弱引用指向的内存空间。
虚引用(Phantom Reference) :既不会影响对象的生命周期,也无法通过虚引用来获取对象实例,仅用于在发生GC时接收一个系统通知。
5. String、StringBuffer与StringBuilder的区别?
名称 | 同 | 异 |
---|---|---|
String | 可以储存和操作字符串 | 只读字符串,内容不能被改变 |
StringBuffer | 可以储存和操作字符串 | 字符串对象可以直接进行修改,线程安全,效率低 |
StringBuilder | 可以储存和操作字符串 | 字符串对象可以直接进行修改,线程不安全,效率高 |
6. try…catch…finally,try里有return,finally还执行么?
会执行,在方法返回调用者前执行。
try…catch块,try里有return,finally也有return,如何执行
7. 面向对象的三个特征?
继承:继承是从已有类得到继承信息创建新类的过程。
封装:通常是把数据和操作数据的方法绑定起来,对实现细节进行隐藏,只能通过已定义的接口进行访问。
多态:指允许不同子类对同一消息作出不同的响应。多态性分为编译时的多态性和运行时的多态性。
- 编译时的多态性:方法重载(overload);
- 运行时的多态性:方法重写(override);
8. Override和Overload的含义与区别?
- Overload(重载):一个类中多态性的一种表现,参数类型,个数,顺序不同。
- Override(重写):父类与子类之间多态性的一种表现。
9. Interface与abstract类的区别。
- | Interface | abstract |
---|---|---|
是否可实例化 | No | No |
是否有构造方法 | No | Yes |
是否有除public的修饰符 | No | Yes |
定义的变量类型可否是成员变量 | 常量 | 可以是成员变量 |
10. Static class 与非static class的区别?
- 内部静态类不持有外部类的引用;非静态内部类需要持有对外部类的引用。
- 静态类只能访问外部类的静态成员;非静态内部类能够访问外部类的静态和非静态成员。
- 非静态内部类不能脱离外部类实体被创建,非静态内部类可以访问外部类的数据和方法。
11. ArrayList、LinkedList、Vector的底层实现和区别?
- | ArrayList | LinkedList | Vector |
---|---|---|---|
线程安全性 | 不安全 | 不安全 | 安全 |
内部实现机制 | 数组 | 双向循环 | 数组 |
索引元素的耗费的时间维度 | O(1) | O(i) | O(1) |
增删元素的耗费的时间维度 | O(n-i) | O(1) | O(n-i) |
- ArrayList/Vector:查询快,增删慢;
- LinkedList:查询慢,增删快;
12. HashMap和HashTable的区别?
- HashTable是线程安全的,不能存储 null 值;
- HashMap 不是线程安全的,可以存储 null 值 ;