最近后端java面试题整理
最近后端java面试题整理
最近想从前端管理岗位重新换到我最初起点的工作——java后端开发,已经有两三年没有用java语言进行开发了,发现很多基础都忘记了,其实我只是想重新换一个安静敲代码的工作,不过现在发现,并不是那么容易的。
![paste image][image-1]
以下是我最近面试我整理的面试题:
基础类:
- 集合类(collection)下面有哪些类
- Map/List
- HashMap、HashSet的特性与区别
- HashMap、HashTable区别
- HashMap、MapTree的区别
- HashMap、LinkedHashMap区别
- HashMap、HashSet区别
hashMap实现了Map接口,是线程非安全的,它允许空(null)键值,效率上高于hashTalbe,hashMap的方法不是同步的,而hashTalbe的方法是同步的,线程是安全的。
HashTable.put方法:
public synchronized V put(K key, V value) {
…….
}
get方法:
public synchronized V get(Object key) {
…..
}
remove方法:
public synchronized V remove(Object key){
……
}
等等,所有的方法都是同步的,这样效率自然不高。
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。
public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。
- HashMap\HashSet的内部实现方式以及工作原理
[HashMap与HashTable的不同参考这里][1]
HashSet与HashMap的实质
(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到).
(2)HashSet以对象作为元素,而HashMap以(key-value)的一组对象作为元素,且HashSet拒绝接受重复的对象.HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图。
HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。
往hashset中插入对象其实只不过是内部做了
public boolean add(Object o) {
return map.put(o, PRESENT)==null;
}
- ArrayList与LinkList使用场景与优缺点,工作原理是什么
- 相同点:
1), ArrayList,LinkedList,Vector这三个类都实现了java.util.List接口
2),都是线程不同步的,非线程安全的 - ArrayList与linkList区别
优缺点:
1),ArrayList是实现了基于动态数组的数据结构,而LinkLIst是基于链表的数据结构,所以,ArrayList在未末尾进行添加删除操作时,速度比不上linkList,因为ArrayList需要移动数据位置,而LinkList不需要
2)而对于get/set随机访问集合元素操作时,LinkList的访问速度不如ArrayList,因为LinkList需要移动指针。
- java基类里面你知道的有哪些方法,主要用来做什么?
- clone方法
- equals
- finalize
- getClass
- haseCode
- notify
- notifyAll
- toString
- wait
- waitAll
见字如面。。。。。
- Object类的toString方法是做什么的
- 用来描述当前对象的相关信息
- 返回对象的类名+hashCode值
- 作用是把其它非字符串对象类型转换为字符串,为什么要这么做?因为在打印输入对象的时候,如果不转换为字符串,那运行时就会报错
- 对象的equals方法的实现原理是什么?什么是HashCode?如何重写equals方法
equals实现原理:
- 默认是比较对象的引用地址,而引用地址是由:
对象所属类名+ @hashCode
值组成。通过hashCode作为值对比。 - HashCode简单来讲就是一组哈希码,
重写equals: - 子类重写equals方法的实现。
- 如果子类重写了equals的方法实现,则hashCode方法也必须重写,因为根据java的协议规定,如果两个对象equals返回为真,那他们各自对象的hashCode值就必须相等。
- 还有个目的是,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable类时进行比较
注意:当此方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等的对象必须具有相等的哈希码。
- 线程的使用与原理
- json数据解析fastjson和JackSonJSON区别
[先参考下这篇详谈线程的文章][2]
- 线程是一个操作系统级别的概念。
JAVA语言(包括其他编程语言)本身不创建线程;而是调用操作系统层提供的接口创建、控制、销毁线程实例。
java线程有四个状态:
开始、就绪、阻塞、消亡
[关于状态的描述参考文章][3]
java中保证对象、方法、代码块线程安全的方法是给它们加锁,怎么加呢?当然是加:synchronized
关键字
例:
/** * 这个类的class对象进行检查。与synchronized(Dog.class)一样的效果
*/
public static synchronized void doSomething() {
}
/** * 对这个类的实例化对象进行检查 与
*/
public synchronized void doOtherthing() {
}
java 还有个关键字,叫volatile
8. java对象new的时候做过哪些具体事情
9. 什么是base64,原理是什么
所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。
[ 具体的解析参考这里][4]
- java类加载器有几种方式?原理是什么?
java加载类的方式有两种方式,静态加载和动态加载;
- 静态加载方式
在由运行时刻用 new 方法载入
如:Dog dog = new Dog(); - 动态类加载方式
调用 Class.forName() 方法
1, 通过反射加载类型,并创建对象实例
如:Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
2,调用某个 ClassLoader 实例的 loadClass() 方法
通过该 ClassLoader 实例的 loadClass() 方法并传入类路径载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
如:Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();
而java虚拟机的类加载器分类有启动类加载器、标准扩展类加载器、类路径类加载器、网络类加载器;
启动类加载器(BootStrap ClassLoader,API)
这个属于java虚拟机自己内置的类加载器。
C++实现的,是Java类加载层次中最顶层的类加载器(JVM启动后初始化的),负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等标准扩展类加载器
ExtensionClassLoader:称为扩展类加载器,负责加载Java的扩展类库 它的双亲是启动类加载器,注意不是继承,而是组合、委派的关系。类路径类加载器(应用类加载器)
1,自定义类加载器,比如需要加载一个Dog类请求,必须先询问它的双亲,类路径类加载器来查找加载这个类,而类路径类加载器也会向自己的双亲发出这个请求。
要想自定义classloader我们需要通过继承java.lang.ClassLoader类。该类中有几个重要方法,但如果想遵循双亲委托机制,则只需要重写findClass方法;如果要改变双亲委派,则重写loadClass方法。
2,系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
它的双亲是扩展类加载器,它是由用户自定义路径的类加载器。
- 网络类加载器
下载类,并反射加载类
注:
非启动类加载器必须显示的求助于其它类加载器,通过调用loadClass或者findSystemClass方法实现。
- HTTP1.1和HTTP1.0有什么大的区别
- 多连接性能作了很大提升
- 支持长连接(客户端发送值为Keep-Alive时),一个连接上可以支持多个请求与响应
- 服务端与客户端如何实现长连接
- 短连接的情况下,如何实现服务器宕机情况下正常通信
- 为什么要面向接口编程是不是多此一举?
解决问题能力:
- 做过的项目中,在哪个项目感觉比较有收获
- 有解决过什么棘手问题没有,如何解决的
- 如何保证多个线程调用同个数据同步问题
- 如何自动收取邮件
系统安全&并发:
- 你是如何防止系统被恶意访问攻击的
- 除了使用验证码、手机短信等业务方法去避免恶意访问,技术上如何去做
- 如何保证系统操作的原子性(A系统调B和C系统的接口,A系统的此次操作是依赖B、C接口调用的成功,如果中间有失败,怎么保证A操作的回滚)——分布式事务实现
- 如何设计大并发数据量系统,你用过的有哪些解决并发压力的方法
- 系统中有数据会频繁更改,如何保证数据的正确性
- 你的系统是如何去做分布式的
- 数据库具体是如何去做读写分离的(mysql)
- ConurrentHashMap和HashTable的区别,为什么需要ConurrentHashMap?
并发工具的使用:
- MQ的原理及使用场景
- 如何解决批量消息发送失败的问题
- 如何延迟发送短信
- 分布式锁
- 负载均衡时,如果一台服务器挂掉,连接是如何指向另一台服务器的,怎么判断服务器是好还是坏
sprIng:
- Ioc原理及用途
- AOP原理及用途
- spring中是否有用到设计模式,你知道的有哪些?具体是如何实现的
- 事务管理原理及用途
- spring如何处理多线程
- spring注解原理
持久化框架
- hibernate与ibatis的区别与优缺点比较
- hibernate的ORM技术与ibatis的map比较
- 对象关联关系比较
- 事务管理使用场景及原理
数据库
- mysql有几种建立索引的方式,有什么区别
- mysql在多少数据量时,会有性能瓶颈
系统架构设计图
nginx服务器 + webSever集群 + redis+dbServer 集群 +数据库
springCloud 微服务与springMVC有什么区别
HTTP协议
sorlo
- 使用哪种中文分词?
[1]: http://blog.csdn.net/wulunbi/article/details/51105028 “HashTable与HashMap”
[2]: http://blog.csdn.net/yinwenjie/article/details/50371005
[3]: http://blog.csdn.net/yinwenjie/article/details/50403620
[4]: http://www.ruanyifeng.com/blog/2008/06/base64.html
[image-1]: http://clockcoder.com/images/14901501493763z9yf85f.png?imageslim