整理不易,转发请附有源地址如有问题欢迎各位童鞋指出,希望大家都可以找到自己满意的工作!
1、Java常用集合及特点
List:ArrayList、LinkedList、Vector、Stack Set:LinkedSet、HashSet、TreeSet Queue->Deque->LinkedList。
Map:HashMap、LinkedHashMap、TreeMap Dictionary->HashTable->Properties。
Vector: 底层数据结构是数组,查询快,增删慢,线程安全,效率低,默认长度为10,超过会100%延长,变成20,浪费空间。
特点:
list: 有序可重复
ArrayList :基于数组,便于按index 访问,超过数组需要扩容,扩容成本较高,查询效率高
LinkedList:使用链表实现,无需扩容,增删效率高
Set:无序不可重复
HashSet:底层数据结构是哈希表(无序,唯一),通过hashcode()和equals()保证元素唯一。
LinkedHashSet: 底层数据结构是链表和哈希表(FIFO 插入有序,唯一),由链表保证元素有序,由哈希表保证元素唯一。
TreeSet:底层数据结构是红黑树(唯一,有序),通过自然排序和比较器排序保证元素有序,根据比较返回值是否是0 来保证元素唯一性。
TreeMap 是有序的。
HashMap :空间换时间,哈希冲突不大的情况下查找数据性能很高。
LinkedHashMap 基本特点:继承自HashMap,对Entry 集合添加了一个双向链表。
若想深入了解可点击深入理解Java中的List、Set与Map集合
2、开启一个线程的方法?
- 继承Thread 类,新建一个当前类对象,并且运行其start()方法
- 实现Runnable 接口,然后新建当前类对象,接着新建Thread 对象时把当前类对象传进去,最后运行Thread 对象的start()方法
- 实现Callable 接口,新建当前类对象,在新建FutureTask 类对象时传入当前类对象,接着新建Thread 类对象时传入FutureTask 类对象,最后运行Thread 对象的start()方法
3、Java面向对象包括哪些特性,怎么理解的?
- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
- 多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A 系统访问B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对A系统来说都是透明的。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:
第一:方法重写(子类继承父类并重写父类中已有的或抽象的方法);
第二:对象造型(用父类型引用指向子类型对象,这样同样的引用调用同样的方法就会根据子
类对象的不同而表现出不同的行为)。 - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
4、Java 如何保证线程安全?
- 使用同步代码块
- 使用同步方法
- 使用Lock 锁机制, 通过创建Lock 对象,采用lock()加锁,unlock()解锁,来保护指
定的代码块。
5、介绍Spring MVC 的工作流程?
- 用户向服务端发送一次请求,这个请求会先到前端控制器