【面试】JAVA互联网面试题解惑

本篇文章从CSDN的一篇gitchat中来,文章中罗列出来的面试点,有很多不太清楚的被我拷贝记录下来,并用通俗的语言解释下,加深自己的印象。
当然如果某一点大家想深入研究的话,去百度其他博客即可,网上一大堆喔,最好还是对应到实际代码认真研究下。


主要用来面试时候突击使用


一,Java基础知识点
1,抽象类和接口的区别:
抽象类可以做很多事情,接口就是正常用的接口,实现一些方法;抽象类,可以被继承,可以初始化数据,可以加线程池,做的事情要多
2,JDK,JRE和JVM的联系和区别
JDK:用来开发,java开发工具包=JRE+java(用于执行.class文件)、javac(用于将.java文件编译成.class文件)等工具.
里面主要包含了jre, jvm, jdk源码包,以及bin文件夹下用于开发,编译运行的一些指令器。
JRE:java runtime environment=JVM+lib。
JAVA运行环境,包含了jvm和java运行时基本类库(rt.jar)
找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就称为jre。
JVM:java virtual machine,JAVA虚拟机,将它理解为可以识别class文件的一个小型系统,JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统
一次编译,处处运行
JDK包含了JRE,JRE包含了JVM(简单粗暴式理解)。


二,Java中常见集合
1,HashMap和Hashtable,线程安全‘ConcurrentHashMap结合了两者并且锁是细粒度的,16个桶,只锁一个
一般来说,Hashtable效率低,而且基本不太维护了,已经被弃用
ConcurrentHashMap结合两者,多线程可以使用,并引入了分段锁,每一把锁用于锁容器其中一部分数据,
线程安全,防止脏数据和死锁。
2,Comparable接口和Comparator接口有什么区别?
两者都用Collections.sort进行排序
(1)Comparable用于,本身类可以修改,并重写int compareTo方法,public class Person1 implements Comparable即可
(2)Comparator用于,本身类不可修改的,需要在排序的时候重写compare方法
Collections.sort(dutyList, new Comparator() {
public int compare(Object object1, Object object2) {}
}
3,Java集合的快速失败机制“fail-fast”
解释下快速失败,是指,有个线程在遍历list,同时有个线程在修改,导致concurrent包抛出ConcurrentModificationException异常
方案一:在遍历过程中所有涉及到改变modCount值得地方全部加上synchronized或者直接使用Collections.synchronizedList,这样就可以解决。但是不推荐,因为增删造成的同步锁可能会阻塞遍历操作。
方案二:使用CopyOnWriteArrayList来替换ArrayList。推荐使用该方案。
用于以下场景,1:在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时。2:当遍历操作的数量大大超过可变操作的数量时。
缺点:毕竟CopyOnWriteArrayList比较耗费资源,因为底层是copy现有的数据进行修改,不会影响遍历的COWIterator的数据,代价是大量的对象,copy也是有损耗的。


三,高并发
如何指定多个线程的执行顺序,挨个打印0-9,写代码
多线程产生死锁的4个必要条件?如何避免死锁
sleep( )和wait( n)、wait( )的区别:
synchronized,分几种:偏向锁(单一线程)、轻量锁(多个线程访问synchronized区域)、对象锁(重量锁,多个线程存在竞争的情况)、自旋锁
8)ThreadLocal(线程局部变量)关键字:
ThreadPoolExecutor线程池


四,JVM内存管理
1,JVM的内存划分
JVM运行的时候会自动分配方法区和堆,然后每遇到一个线程,为之分配程序计数器、虚拟机栈、本地方法栈,终止时,后面三个也会释放
(1)方法区:常量、静态变量、类的方法代码(变量名,方法名,访问权限,返回值等等)
(2)堆:唯一一个程序员可以管理的内存区域。几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作
(3)程序计数器: 当前线程执行的字节码的位置指示器。
(4)虚拟机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量
(5)本地方法栈 :为JVM提供使用native 方法的服务
2,-Xms、-Xmn
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M


堆内存分配:
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4


非堆内存分配:
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。


3,垃圾回收方法,应该是第四种方法用的比较多,即不用暂停应用,也不会有碎片,也不耗费内存。


引用计数:原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。


标记-清除:此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。


复制算法:此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。


标记-整理:此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。


4,内存泄漏和内存溢出
内存溢出指的是内存不够用了。
内存泄漏是指对象可达,但是没用了。即本该被GC回收的对象并没有被回收


原因:比如vector或者hashMap引用了string或者object
长生命周期的对象引用短生命周期的对象
没有将无用对象置为null
举例,比如hashmap有个元素p,更改了P的属性后,Hashcode更改,remove是失败的,这个对象就废掉了,属于内存泄露


五,网络协议相关
1,三次握手、四次挥手示意图,一般必考
2,拥塞避免机制
慢开始+拥塞避免
快重传+快恢复
3,浏览器中输入:“www.xxx.com”之后都发生了什么?请详细阐述。
由域名→IP地址 寻找IP地址的过程依次经过了浏览器缓存、系统缓存、hosts文件、路由器缓存、 递归搜索根域名服务器。
建立TCP/IP连接(三次握手具体过程)
由浏览器发送一个HTTP请求
经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器
服务器处理该HTTP请求,返回一个HTML文件
浏览器解析该HTML文件,并且显示在浏览器端
这里需要注意:
HTTP协议是一种基于TCP/IP的应用层协议,进行HTTP数据请求必须先建立TCP/IP连接
可以这样理解:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
两个计算机之间的交流无非是两个端口之间的数据通信,具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。
4,常见HTTP状态码
200(成功)
304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
401(未授权):请求要求身份验证
403(禁止):服务器拒绝请求
404(未找到):服务器找不到请求的网页
5,TCP和UDP的区别
TCP过确认机制,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包。
UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因 此,应用程序需要选择合适的报文大小。
UDP的头部,只有8个字节,相对于TCP头部的20个字节信息包的额外开销很小。


六,数据库知识点
1,事务
原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行
一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行
持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存
2,事务的并发问题
丢失更新、脏读、不可重复读以及幻读。
3,事务的隔离级别
读未提交、读已提交、可重复读和序列化。
MySQL事务默认隔离级别是哪个?可重复读
4,数据库的索引有什么作用?(必考)底层数据结构是什么,为什么使用这种数据结构?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
底层数据结构是B+树。
使用B+树的原因:查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数。(此时,你应该在白纸上画出什么是B+树)


小结:数据库方面还是事务机制、隔离级别比较重要,当然了数据库索引是必考的问题。偶尔也会给你几个表,让你现场写SQL语句,主要考察group by 和having等关键字。

你可能感兴趣的:(JAVA)