Java 基础知识点

1. 面向对象的特征

(1)封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面。即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象;
(2)继承:是一种联结类的层次模型,并且允许和鼓励对类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要;
(3)多态:是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好解决了应用程序函数同名问题;(4)抽象:忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2. 接口和抽象类的区别

(1)接口是公开的,不能有私有方法及变量,而抽象类可以有私有方法及变量;
(2)抽象类表示一种继承关系,一个类只能继承一个抽象类,而一个类可以实现多个接口;
(3)抽象类是一种功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数数据集合,两者均不能被实例化。

3. final、finally、finalize的区别

(1)final用于声明属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可继承;
(2)finally是异常处理语句结构的一部分,表示总是执行;
(3)finalize是Object类的方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其它资源回收,如关闭文件等。

4. 重载Overload和重写Override的区别

(1)重写Override父类与子类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现;
(2)Overload要求两个方法具有方法名相同、形参列表不同的要求,返回值类型不能作为重载的条件;Override要求父类方法、子类方法的方法名相同、形参列表相同,子类方法返回值类型要么是父类方法返回值类型的子类、要么与父类方法返回值类型相同;子类方法声明抛出的异常类型要么是父类方法声明抛出的异常类型的子类、要么与父类声明抛出的异常类型相同,子类方法的访问权限要么与父类方法的访问权限相同,要么比父类方法的访问权限更大;
(3)Overload的方法是可以改变返回值的类型。

5. equal和==的区别

(1)==运用在基本数据类型比较时,通过比较它们实际的值来判定是否相同,而用于比较引用类型的时候,则是比较两个引用的地址是否相等,也就是是否指向同一个对象;
(2)equal方法时java.lang.Object的方法,也就是所有Java类都会有的方法;它可以被覆盖重写,通过自定义的方式来判定两个对象是否相等;对于字符串java.lang.String类来说,它的equal方法用来比较字符串的字符序列是否完全相等。

6. int和Integer的区别

Java提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。Java的基本数据类型有byte、int、char、long、float、double、boolean和short八种。

7. String, StringBuffer和StringBuilder的区别

(1)String是字符串常量,final修饰;StringBuffer是字符串变量(线程安全);StringBuilder是字符串变量(线程不安全);
(2)String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。StringBuffer是对对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,建议使用StringBuffer;
(3)StringBuffer是线程安全的可变字符串,其内部实现是可变数组。StringBuilder是jdk 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。

8. 静态成员的特点

类的静态成员是通过static关键字修饰的成员,主要包括:静态成员变量、静态方法和静态代码块,它们具有以下特点:
(1)在类加载的时候,就进行创建和初始化或执行代码;
(2)它们对于一个类来说,都只有一份;
(3)类的所有实例都可以访问到它们。

9. 变量及其作用范围

(1)静态变量指的是在类中用static修饰的变量,它的生存周期是由类来决定的;
(2)成员变量则是在类中没有用static修饰的变量,它的生存周期是由对象来决定;
(3)局部变量则是定义在方法里的变量、方法的的参数或代码块里定义的变量,它的作用范围用大括号来界定。

10. 内部类的实质

(1)静态内部类:它相当于外部类的静态成员一样,,使用static修饰的内部类,隶属于外部类,使用起来相当于独立的外部类;
(2)成员内部类:它相当于外部类普通成员一样,隶属于外部类的具体对象,在定义它时,需先创建外部类对象,再创建它的实例;
(3)局部内部类:它定义在一个方法的方法体中,往往仅作为方法短暂使用,只能访问用final修饰的局部变量;
(4)匿名内部类:它也定义在方法体中,但是没有具体的名字,具有非常强大灵活性,工作本质与局部内部类类似。

11. Collection和Collections的区别

(1)Collection是集合类的上级接口,继承与他的接口主要有Set 和List;
(2)Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

12. Set、List、Map的区别

(1)Set和List都继承自collection接口;
(2)List是对象集合,元素有序存放,可重复;同数组类似,可动态增长,查找销量高,插入、删除效率低,会引起其它元素位置改变;
(3)Set特点:元素无序存放,不可重复;检索效率低下,删除、插入效率高,插入、删除不会引起元素位置改变;
(4)Map是键值对的集合,不允许key重复。

13. HashMap、HashTable、HashSet的区别

(1)HashMap是HashtTable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于HashTable,HashMap允许将null作为一个entry的key或者value,而HashTable不允许;
(2)HashMap把HashTable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解;
(3)HashTable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步;
(4)Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异;
(5)Set是线性结构。其值不能重复,HashSet是Set的Hash实现,HashSet中值是不能重复的,而HashMap的值是Key来实现的。

14. ArrayList、Vector、LinkedList的区别

(1)ArrayList是基于动态数组的数据结构,地址连续,一旦存储好了,查询操作效率高;但是插入、删除操作效率比较低;
(2)LinkedList是基于链表的数据结构,地址是任意的,新增或删除操作效率比较高,但是移动指针会导致查询性能比较低;
(3)Vector使用了synchronized方法,是多线程安全的,可设置增长因子,Vector是老的动态数组,线程同步,效率低下,不推荐使用。

15. 堆heap和栈stack的区别

栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方式进行处理;堆是栈的一个组成元素。

16. 深拷贝和浅拷贝的区别

(1)浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象;
(2)深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

17. error和exception的区别

(1)error一般是指虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch块来捕获Error对象;
(2)exception表示一种设计或实现问题。也就是说,程序员应该对这些情况进行考虑、并提供相应的处理。

18. 线程类

<1>实现Runnable接口

1
2
3
4
5
public class RunnableTest implements Runnable {
public void run() {
System.out.println(“thread running …");
}
}

<2>继承Thread类

1
2
3
4
5
class ThreadTest extends Thread {
public void run() {
System.out.println(“thread running …");
}
}

<3>启动线程

1
2
3
4
5
6
7
8
public class ThredStartTest {
public static void main(String[] args) {
ThreadTest t1 = new ThreadTest();
Tread t2 = new Thread(new RunnableTest());
t1.start();
t2.start();
}
}

19. Runnable接口和Thread类区别

(1)线程类继承自Thread则不能继承自其它类,而Runnable接口可以;
(2)线程类继承自Thread相对于Runnable来说,使用线程的方法更方便一些;
(3)实现Runnable接口的线程类的多个线程,可以更方便的访问同一变量,而Thread类则需要内部类来进行替代。

20. sychronized关键字

(1)sychronized关键字代表要为某一段代码加上一个同步锁,这样的锁是绑定在某一个对象上边的。如果是同步代码块,需要为该sychronized关键字提供一个对象的引用;如果是同步方法,只需要加一个sychronized关键字的修饰;
(2)sychronized为某段代码加上锁以后,某个线程进入该段代码之前,首先需要检查该锁是否被占用,如果没有被占用则继续执行;如果已经被占用,则需要等到该锁被释放以后才能继续执行。其中,线程执行完该段代码就是释放锁的标志。

21. 线程同步的方法

(1)wait():使一个线程处于等待状态,并且释放所持有的对象的lock;
(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常;
(3)notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级;
(4)notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

22. sleep和wait的区别

(1)sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁;
(2)wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

23. 线程的生命周期

包括新建(New)、就绪(Runnable)、运行(Running)、 阻塞(Blocked)和死亡(Dead)5种状态。

24. 获取Class对象的方法

每一个Class类的对象就代表了一种被加载进入JVM的类,它代表了该类的一种信息映射。
(1)Class类的forName()方法的返回值;
(2)访问所有类都会拥有的静态的class属性;
(2)调用所有对象都会有的getClass()方法。

25. java序列化

(1)序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题;
(2)序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

26. 反射的用途及实现

在运行时构造一个类的对象,判断一个类所具有的成员变量和方法,调用一个对象的方法,生成动态代理。

27. 单例模式Singleton

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

1
2
3
4
5
6
7
8
9
10
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问  
public static Singleton getInstance() {
return instance;
}
}

第二种形式:

1
2
3
4
5
6
7
8
9
10
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}

其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些

28. 设计模式

(1)Factory(工厂模式)
(2)Builder(建造模式)
(3))Factory Method(工厂方法模式)
(4)Prototype(原始模型模式)
(5)Singleton(单例模式)
(6)Facade(门面模式)
(7)Adapter(适配器模式)
(8)Bridge(桥梁模式)
(9)Composite(合成模式)
(10)Decorator(装饰模式)
(11)Flyweight(享元模式)
(12)Proxy(代理模式)
(13)Command(命令模式)
(14)Interpreter(解释器模式)
(15)Visitor(访问者模式)
(16)Iterator(迭代子模式)
(17)Mediator(调停者模式)
(18)Memento(备忘录模式)
(19)Observer(观察者模式)
(20)State(状态模式)
(21)Strategy(策略模式)
(22)Template Method(模板方法模式)
(23)Chain Of Responsibleity(责任链模式)