写这篇博客的目的是为了巩固一下面试基础,方便随时查看,也方便大家准备面试。如果有不对的地方,欢迎大家指出一起讨论。
一、基础概念
1、JDK、JRE、JVM关系是什么?
Jdk是Java的开发环境,可以认为是jre的超集,在jre的基础上还有javac,javaw,jstack,jconsole等编译,debug相关的内容。
jre是Java的运行时环境,包含jvm及一些Java基础类库。
jvm是Java虚拟机,是运行Java字节码的地方。jvm保证了Java的跨平台性。
2、Java支持的数据类型有哪些?什么是自动拆装箱?
Java支持的基本数据类型及所占字节数如下:
byte | char | short | int | long | flaot | double | boolean |
---|---|---|---|---|---|---|---|
1 | 2 | 2 | 4 | 8 | 4 | 8 | 2 |
自动拆装箱是基本数据类型与包装类之间的自动转换。
3、面向对象的四大基本特性
抽象 抽象是将现实世界中的事物建模的过程,抽象后的模型只关心数据(属性)和行为(方法)。
继承 对一个类的复用机制,包含继承和实现接口
封装 是将特定的属性和方法聚合在一起,对外只提供接口来访问,屏蔽具体的实现。使类具有独立性和隔离性,保证了高内聚。
多态 多态实现了在运行时动态切换实现。多态的三要素是:继承、重写和父类引用指向子类对象。
4、面向对象的七大设计原则:
单一职责原则、开放关闭原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特法则和组合优于继承原则。
5、&和&&的区别?
&和&&都具有逻辑“于”的功能,区别是&&存在短路功能,即a != b && b++ > 1在a != b 时不会去判断后面的条件,而 & 会继续向后执行,导致 b 自增。同理“|”和“||”类似。
6、什么是值传递和引用传递?
Java从本质上都是值传递,在值传递时是将变量copy一份传递进去。
基础类型在传参时copy一份副本,因此形参的修改是修改副本,对实参没有影响。
String类型在传参时会将栈中的指针copy一份传递过去,在修改时会直接修改堆空间中的实参。但是由于String是不可变类型(final)的。对String的所有操作均是返回一个新的String对象。故修改了形参对实参也没有影响。
对象类型在传参时也是copy一份指针,因此在修改形参时实际修改的还是堆空间中的实参,在方法返回后会影响实参。
7、是否可以在static环境中访问非static变量?
不能,因为非static的变量是基于对象的,在static环境中可能没有对象生成,故非static变量不存在,导致异常。
8、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
重载是指同一个方法名,不同的参数列表。重载不能通过返回值类型来确定,因为在调用方法时若不接受返回值,则jvm无法知道具体要调用哪个方法。
重写时子类继承父类后覆盖父类方法,必须拥有一样的方法名,参数列表和返回值。
9、Java支持多继承么?
不支持,但是可以通过实现接口来达到多继承的效果。
10、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
通常我们申明基础类型变量,对象的引用及函数调用都会在栈中申明空间。
堆中存放的是 new 关键字和构造器创建出来的对象。堆是gc主要维护的空间。堆内存中主要分Eden和Survivor区。其中Survivor又可以分为from 和to 区。Eden和Survivor的大小分配比例是8:1.
11、接口和抽象类的区别是什么?
接口中所有方法均是public、抽象的,接口中的属性全是final的。
抽象类中可以存在抽象,也可以有非抽象的方法,属性也可以包含非final的。同时对包修饰符没有限制,抽象类可以在不提供接口方法实现的情况下实现接口。
12、用最有效率的方法计算2乘以8?
2 << 3 一个数左移几位就是乘以 2 的几次方。(>>同理)
13、手写单例模式(饿汉和饱汉模式)?
饿汉模式:
public class SingletonDemo {
private SingletonDemo(){};
private SingletonDemo singletonDemo = new SingletonDemo();
public SingletonDemo getSingletonDemo(){
return singletonDemo;
}
}
饱汉模式:
public class SingletonDemo {
private SingletonDemo(){};
private SingletonDemo singletonDemo = null;
public synchronized SingletonDemo getSingletonDemo(){
if (singletonDemo == null)
singletonDemo = new SingletonDemo();
return singletonDemo;
}
}
14、String和StringBuilder、StringBuffer的区别?
String 是不可变的,即声明一个string后无法修改它。
StringBuilder是Jdk1.5之加入的。他与StringBuffer的方法完全一样,但所有方法均为被synchronized修饰,故他是线程不安全的。但是在单线程下效率却比StringBuffer高。
15、包访问修饰符有什么区别?
权限 | 本类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
16、创建对象有哪几种方式?
共4种:
- new关键字
- 反射
- clone()方法
- 反序列化,通过Java.io.ObjectInputStream对象的readObject()方法。同时只有反序列化可以实现深拷贝,其他均是浅拷贝。
二、集合与数组
1、Java集合框架的基础接口有哪些?
顶层集合接口是Collection和Map,Collection下有List,Set。List是有序且可重复的,Set无需且不能重复。
2、为何Collection不从Cloneable和Serializable接口继承?
Collection关心的是抽象的,通用的。克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
3、为何Map接口不继承Collection接口?
Collection中存的是
4、什么是迭代器(Iterator)?
迭代器是对集合进行迭代的工具,在迭代的过程中可以删除底层元素。其他方法删除会报错。
5、Iterator和ListIterator的区别是什么?
list Iterator可以双向遍历,Iterator只能单向遍历。
6、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
快速失败是指在迭代一个集合时,另一个线程正在修改集合。会报出ConcurrentModificationException。Java.util下的包都是快速失败的。
安全失败是指在迭代一个集合时对集合做了拷贝。在另一个线程修改集合时不会报错。Java.util.concurrent包下的都是安全失败的。
7、Array和ArrayList有何区别?什么时候更适合用Array?
- 集合中不允许存放基本类型,只能保存对象类型,数组两者均可保存。但是在Jdk1.5之后自动装箱机制让集合“看上去”可以保存基本类型了。但是在基本类型的操作上效率也比Array低。
- Array时固定长度的,ArrayList长度可变。
如果长度已知且固定,大部分时间是做存储和遍历使用则推荐使用Array。
如果存放基本类型则推荐使用Array。
网友评论