前言:
Java的基础知识点有很多,我把面试中高频面试点列出来和大家一起探讨,如果有什么不对的地方也请您指正,如果觉得不错请您帮忙分享和订阅,您的一份订阅是作者最大的动力,感谢!
1:常用的集合有哪些,谈谈你对他们的理解?
Collection接口:单列接口,有两个子接口;
List接口有三个实现类:
LinkedList:基于链表实现,每个元素存储本身内存地址之外还存储下一个元 素的地址,链表增删快,查找慢;
ArrayList:基于数组;每次增删都要创建新的数组,但是数组有索引,数组增删慢,查找快;
Vector:基于数组,线程安全,效率低;
Set接口有两个实现类:
HashSet:存储的元素无序,不可重复,底层是哈希表;
LinkedHashSet:存储的元素有序,不可重复,底层是Hash表和链表的结合;
Map接口:双列接口,有三个实现(HashMap,HashTable,TreeMap);
hashMap:非线程安全,高效,支持null;
LinkedHashMap:是HashMap的一个子类,保存了记录的插入顺序;
HashTable:线程安全,低效,不支持null;
TreeMap:能够把它保存的记录根据键进行排序,默认的是键值的升序排序;
2:线程和进程的区别?
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;
线程:是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的可以独立运行的基本单位;
特点:线程的划分尺度小于进程,这使多线程的程序拥有高并发性;
3:启动一个线程是调用run()还是start()方法?
启动一个线程是调用start()的方法,使线程所代表的虚拟处理机处于一个可运行状态,这意味着它可以由JVM进行调度并执行,这并不意味着线程就会立即运行;
4:编写多线程程序的几种实现方法(换个问法:创建多线程的方法)?
1)通过继承Thread类;
2) 通过实现Runnable接口(建议使用这个方法,因为java中是单继承,一个类只有一个父类,若继承了Tread类,就无法再继承其他的类了,显然实现Runnable接口更加的灵活)
3)通过实现Callable接口
5:解决多线程安全问题的几种方式?
1)同步代码块:
在代码块上加上synchronized,例如:
注意:同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个 锁对象才能保证线程安全
2)同步方法:
在方法声明上加上synchronized,例如:
注意:同步方法中的锁对象是this,静态同步方法在方法的声明上加上static synchronized.静态同步方法的锁对象是类名.class
3)同步锁: