我的面试小结

JAVA基础知识
1、集合
HashMap是如何实现的?
注意是怎么put进去和get出来的,跟什么方法相关(equals和hashcode方法),知道HashMap的数据结构,也就是数组链表,为什么重写了hashcode()一定要重写equals()方法,知道了HashMap的原理,这时候就可以跟面试官举个反例,重写其中一个且不重写另外一个会出现什么样的状况,比如重写了equals(),没有重写hashcode(),在程序员看来,两个对象明明equals()是相等的,但是该两个对象的hashcode()方法是不等的,明明两个相等的对象确可以添加到HashMap里面,这样就出现了不一致的现象。

HashTable和HashMap有什么区别?
HashTable是一个比较古老的类,基于Dictionary类,是线程安全的,HashMap是非线程安全的,HashMap可以让你将空值作为一个表的条目的key或value,需要同步的话用HashTable。

HashMap和ConcurrentHashMap有什么区别,ConcurrentHashMap如何实现的?
HashMap不是线程安全的,ConcurrentHashMap是线程安全的,ConcurrentHashMap的实现原理要清楚,最好看源码。HashMap的最大容量是多少,怎么进行扩容的。
ArrayList的最大容量是什么,怎么进行扩容呢?

TreeMap、LinkedList、ArrayDeque、ArrayList的底层实现(记这些类的类名有些简单的窍门,都是两个单词组成的,第一个单词是内存中存储的形式,第二个单词是逻辑结构),以及何时适用。
JAVA异常的种类,有什么区别,如何自定义异常,异常与error的区别

JAVA序列化是什么,其作用有什么

JAVA的浅拷贝和深拷贝的区别,怎么实现深拷贝

JAVA NIO和JAVA IO的区别,为什么会用到JAVA NIO
JAVA NIO用到了IO复用,如何比原来的IO更加的高效的,另外几种其他的网络模型,比如信号驱动模型,异步IO最好也要了解一下,了解什么才叫异步IO,以及同步阻塞IO与同步非阻塞IO的区别。几种对于高并发的网络模型,比如线程池等也要了解如何做到的。

2.多线程
创建线程有哪几种方式?每种方式都需要会写出来
extends Thread;implements Runnable;implements Callable
线程的同步,为什么要用到同步?synchronized关键字的作用以及使用方法
synchronized关键字可以声明一个方法,也可以声明代码块,声明一个静态方法,声明一个方法的时候默认锁住的对象是this,声明一个静态方法锁住的是该类。
要注意当synchronized关键字声明为一个非静态方法的时候,线程可以访问该类的其他对象的该方法吗?当方法是静态方法呢?
原子变量的使用(AtomicLong, AtomicInteger, AtomicReference)
原子变量的作用是什么,是如何实现的(底层用到了CAS),CAS是如何实现的(需要硬件的支持),CAS会有什么样的问题出现(会有ABA问题),,ABA问题是什么,ABA问题该如何解决?可以用增加版本的方法来解决。
让自己写利用CAS写一个阻塞队列,自己写一个自旋锁怎么写?
多线程并发执行
要等待某个线程执行完才能进入下一步,怎么办?
可以用join()方法,也可以用闭锁CountDownLatch来实现,CountDownLatch的用法很简单,但是要知道,怎么使用。

volatile关键字的作用
可以禁止指令重排序,禁止指令重排序有什么好处,单线程指令重排序不会有什么问题,但是多线程呢,会出现什么问题?
线程读取变量的时候强制去主存里面取,更新变量的时候强制存到主存去,保证线程读取到的是最新的。
另外,volatile关键字也有不适用的时候,什么情况下不适用呢?比如i++,因为i++不是原子操作,包括读–加1–写三个操作。
synchronized和Lock的区别,分别的好处是什么?
注意线程的start()方法和run()方法的区别,并且怎么中断一个线程,对InterruptedException的理解,为什么需要中断机制呢?中断机制应用在什么场景呢?

sleep和yeild的区别
sleep会给低优先级的线程机会,yeild只会给高优先级的机会,但是他们都不会释放锁。
而wait方法会释放锁,具体的几大区别要说出来。

JVM相关知识
Java类加载机制,每一步做什么都要说清楚
加载
链接: 验证、准备、解析
初始化
Java静态变量和静态代码块,静态方法,父类的静态方法,静态代码块,非静态代码块的整个执行顺序要知道。

Java类加载机制的双亲委派模型
有哪几个类加载器,双亲委派机制的作用是什么(为了安全,java有自己的Object类,那么万一用户自己写了个Object类呢),自定义的类加载器,可以破坏双亲委派机制吗?有什么是破坏双亲委派模型的,另外双亲委派模型是利用的组合,不是继承。
JAVA1.7有哪些分区,每个分区存放是什么内容
堆、本地方法栈、虚拟机栈、程序计数器、方法区等,每一个区是存放的是什么
JAVA1.8对于JAVA1.7少了那个分区,为什么这样设计,好处是什么?
Java1.8相对于Java1.7,再没有永久代这个区了,而是使用元区来存放类的类型数据。因为永久代的垃圾回收比较困难,虚拟机里面那个关于永久代那个的垃圾回收的代码很是复杂,并且每次回收都性价比不高,且复杂。所以java1.8将永久代移除去,用元区来管理类的类型信息,用虚拟机单独来回收这部分内存,那么就可以将虚拟机full gc的时候,对永久代的那部分的回收的代码移除掉。Full gc的时候就不带上永久代了。并且元区的大小是动态变化的,gc回收的多一些了,也就是元区可能不够,需要继续增大元区,gc得少一些,就可以将元区的大小降低一些。就是虚拟机单独管理这部分内存,会比较方便。
JAVA存在内存泄漏吗?
Java也存在内存泄漏,虽然有垃圾回收器来回收对象,垃圾回收器一般按照根搜索的算法来得出某些对象是不是可以到达的对象,不是可以到达的对象就会被回收,也就是对于虚拟机而言,只要他认为是垃圾的会被回收,不是垃圾的,通过根搜索对象能到达的对象,虚拟机自然不会回收,但是在程序员写代码的时候,他可能认为某些对象,已经把引用赋值为空,他认为可以被虚拟机垃圾回收,该对象可能被加入了集合里面,可以通过集合取出该对象,也就是对象可以从另一条链来到达,所以的话,程序员的角度,他认为已经把对象的引用赋值为空了,他觉得该对象可以被回收,但是虚拟机却不这么认为,虚拟机发现对象可以从根搜索到达,所以自然不会回收该对象,这就出现了不一致,导致于这样的情况多了就会出现内存泄漏。
JAVA内存泄漏怎么用工具检测?
Jprofile工具或者java自带的工具jvisualvm来检测,最好写一个比较小的例子,看检测内存泄漏的方法
Java线程出现了死锁,怎么检测,也是通过工具,线程dump来观察检测,线程dump出来的信息要看懂。
JAVA垃圾回收的算法,比如引用计数法会有循环引用无法进行垃圾回收的问题,那么根搜索算法可以解决这个问题,根搜索算法是怎么样的一个过程要清楚。另外垃圾回收怎么样会发生minor gc,怎么样会发生full gc 。还需要说明,垃圾回收的时间是不确定的.

网络协议相关
TCP和UDP的区别
说TCP好的时候,也需要指出不好的地方,UDP也有很好的优点,什么时候适用于TCP,什么时候适用于UDP,要说出来。不能光说一个协议好,缺点也要知道。
TCP我整理的相关笔记,可以看一下。
HTTP的相关知识
先说HTTP的基本的请求的格式和响应的格式,get和post的区别,还有常见的响应码代码什么意思也要清楚。同时要指出HTTP是无状态的,也就是要cookie和session的区别,说一下cookie和session的区别,说session的优点的时候,也要注意它的缺点,就是session存在服务端会有性能的问题。
HTTP是一个无状态协议,那么当客户端每次对服务器发出请求,下一次无法得到上一次的请求的相关信息,当一个用户对一个网站进行连续操作,服务器如何把用户的状态进行联系起来的呢
比如在淘宝的某个页面中,你进行了登陆操作。当你跳转到商品页时,服务端如何知道你是已经登陆的状态?
这就要用到cookie和session了?
首先是cookie这个技术,客户端访问服务器后,服务器会给在返回给对应的客户端的response中set-cookie,
浏览器将 cookie 保存。
每次请求浏览器都会将 cookie 发向服务器。
这样服务器根据cookie里面的信息就可以知道该用户的状态了。

session
cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。
那么session是存在服务器端的,当客户端访问服务器的时候,怎么将session与对应的客户端关联起来呢,那就用到了sessionId,这个sessionId放在cookie中,当客户端请求服务器的时候,携带着cookie,服务器可以从cookie中获得sessionId,根据sessionId再去找对应的session,这就可以获得客户端的相关信息了,比如就是客户端是否已经登录过了。
当服务端存的session过多的时候会有性能问题。
ARP协议以及ping的工作原理也要了解一下。
设计模式
单例模式的几种写法:饿汉式、饱汉式、以及通过内部类来实现的写法要清楚
熟悉的抽象工厂模式、工厂方法模式和观察者模式,他们的类图,适用场景,以及也要知道一些设计模式的缺点,并且设计模式相互的比较,比如抽象工厂设计模式和工厂方法模式有什么区别,分别适用在什么场景,可以结合head first来看。

数据库
我对数据库了解的不多,但是银行之类的很喜欢问数据库相关的知识。比如问了解索引吗,有哪些索引,索引的原理是什么,对某个字段建立索引,相当于建立了一颗B树或者B+树(B树和B+树的结构要清楚),也就是建立的B树或者B+树是排序的,然后查询某个字段是很快的,但是在数据库中插入一行或者删除一行,相应的要去修改B树或者B+树的结构,导致于要维护索引的开销,所以建立索引要选择那种经常查询的且不是经常修改的字段来建立索引,同时该字段的区分度要大。
事务的原子性、隔离性、一致性和持久性分别代表的是什么,以及为什么会有事务这个概念,事务到底是干什么的。
事务的隔离级别:读取未提交的数据、读取以及提交的数据、可重复读和可串行化。这几个隔离级别有什么区别,什么场景需要用什么隔离级别。

操作系统
多进程和多线程的区别
这里就要注意了,各有各的好处,不能光说多线程好,其实很多时候也使用多进程。记住多线程和多进程的优缺点。
常见的看CPU的负载,比如top命令的使用,tail和head命令的使用要清楚,怎么看出内存使用的大小(free命令)

Spring
IOC和AOP要了解,AOP的实现原理(动态代理)。这个问我的不多,记不清了。Bean的生命周期是什么。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值