Java100问

1.        进程与线程区别

2.        进程间通信方式

3.        网络七层

4.        TCP与UDP区别

5.        ajax状态、实现原理

6.        js事件委托机制

7.        PHP require、include区别

8.        PHP双引号、单引号区别

9.        PHP框架的了解

10.    C语言结构体sizeof

11.    xss攻击原理

12.    怎样做提高前端页面加载响应速度

13.    十亿qq号无顺序,有N个号码256MB内存限制,设计算法快速找到

14.    请问为什么TCP建立连接时要三次握手,而不是两次或者四次?

15.    简述一下三次握手的过程?

16.    简述一下TCP与UDP的区别以及分别使用的场景?

17.    java中synchronized的使用方式有哪些。

18.    Java中设置最大堆和最小堆内存的参数是什么?

19.    volatile的作用?

20.    多个线程同时读写,读线程的数量远远⼤于写线程,你认为应该如何解决 并发的问题?你会选择加什么样的锁?

21.    JAVA的AQS是否了解,它是⼲嘛的?

22.    除了synchronized关键字之外,你是怎么来保障线程安全的?

23.    什么时候需要加volatile关键字?它能保证线程安全吗?

第一,谈谈final, finally, finalize的区别。 
final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 。
finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

第二,HashMap和Hashtable的区别。 
都属于Map接口的类,实现了将惟一键映射到特定的值上。 
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。

第三,String s = new String("xyz");创建了几个String Object? 
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

第四,sleep() 和 wait() 有什么区别? 搞线程的最爱 
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 。
(b)正在运行的线程因为其它原因而阻塞。 
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

第五,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

第六,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

第七,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

第八,error和exception有什么区别? 
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

第九,给我一个你最常见到的runtime exception。 

ArithmeticException, ArrayStoreException, 
BufferOverflowException, BufferUnderflowException, 
CannotRedoException, CannotUndoException, 
ClassCastException, CMMException, 
ConcurrentModificationException, DOMException, 
EmptyStackException, IllegalArgumentException, 
IllegalMonitorStateException, IllegalPathStateException, 
IllegalStateException, ImagingOpException, 
IndexOutOfBoundsException, MissingResourceException, 
NegativeArraySizeException, NoSuchElementException, 
NullPointerException, ProfileDataException, 
ProviderException, RasterFormatException, SecurityException, 
SystemException, UndeclaredThrowableException, 
UnmodifiableSetException, UnsupportedOperationException

第十,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

链接一: http://blog.csdn.net/jackfrued/article/details/44921941

链接二:http://blog.csdn.net/sinat_35512245/article/details/59056120

链接三:http://geek.csdn.net/news/detail/242058

你做了哪些准备呢?

计算机网络 操作系统 数据结构排序算法 快排   JAVA面试常问集合 并发 虚拟机 泛型 设计模式   简历项目再思考 实习思考  之前总结的基础笔记以及参考md文件实习总结 简历项目总结

战斗例子:

░B公司


1.:“请你自我介绍一下”

2.:“你有什么业余爱好?”

3.:“你认为你工作中的哪些方面是最重要的?”

4.:“谈谈你的缺点”

5.:“谈一谈你的一次失败经历”

6.:“你为什么选择我们公司?”

7.:“对这项工作,你有哪些可预见的困难?”

8.:“我们为什么要录用你?”

9.:“您在前一家公司的离职原因是什么?”

░C公司


1.mybatis怎么防止SQL注入

2.Hibernate的缓存机制

3.Hibernate一级缓存

4.Hibernate二级缓存

5.什么样的数据适合存放到第二级缓存中

6.Mybatis和Hibernate的区别(优缺点)

7.redis的使用场景

8.Tomcat本身的参数你⼀般会怎么调整?

9.如果有很多数据插⼊MYSQL 你会选择什么方式?

░D公司


1.你知道哪些或者你们线上使用什么GC策略? 它有什么优势,适用于什么 场景?

2.JAVA类加载器包括几种?它们之间的关系是怎么样的?双亲委派机 制是什么意思?

有什么好处?

3.如何定义个类加载器?你使用过哪些或者你在什么场景下需要定义的类加载器?

4. Perm Space中保存什么数据? 会引起OutOfMemory吗? 5.做gc时,对象在内存各

个Space中被移动的顺序是什么?

6.你有没有遇到过OutOfMemory问题?你是怎么来处理这个问题的?处理 过程中有

哪些收获?

7.1.8之后Perm Space有哪些变动? MetaSpace默认是⽆限的么? 还是 你们会通过什

么⽅式来指定?

8.Jstack是⼲什么的? Jstat呢? 如果线上程序周期性地出现卡顿,你怀疑可 能是gc

导致的,你会怎么来排查这个问题?线程日志一般你会看其中的什么 部分?

9.StackOverFlow异常有没有遇到过?一般你猜测会在什么情况下被触 发?

如何指定一个线程的堆栈?一般你们写多少?

░E公司


1.简述synchronized?Object;Monitor机制;

2. 简述happen-before规则 ;

3. JUC和Object ; Monitor机制区别是什么 ; 简述AQS原理 ;

4. 简述DCL失效原因,解决方法 ;

5. 简述nio原理 ;

6.jvm运行时数据区域有哪几部分组成,各自作用 ;

7.gc算法有哪些 ; gc收集器有哪些 ;

8.简述class加载各阶段过程 ; class ; loader有哪些模型 ;

9.简述常用的JDK命令行工具 ;

10.简述字节码文件组成 ;

11.讲讲你平常是如何针对具体的SQL做优化 ;

12. mysql的存储引擎有哪些,区别 ;

13.gc:内存模型;

14.gc: 垃圾回收 ;

15.多线程:如何实现一个定时调度和循环调度的工具类。但提交任务处理不过来的

时候,拒绝机制应该如何处理 ; 线程池默认有哪几种拒绝机制 ;

16. 多线程: 如何实现一个ThreadLocal ;

17.说说你了解的一个线程安全队列 ;

18.Atomic包的实现原理是什么 ;

19. CAS又是怎么保证原子性的 ;

20.string分析1000次循环subString用了多少内存 ;

我面试E公式时是最吃力的,问的好多问题,反正他想到的都会问,由于问题太多.

░F公司


面试官:(拿着简历)讲讲你最近做的这个项目

我:&……%¥#*&¥@%¥!,说了一大通(不知道面试官听进去多少,面试官会挑他会的进行提问)

面试官:你说这个项目中用到了netty,能大概讲讲netty的线程模型么?

我:(幸好我看过netty的源码)netty通过Reactor模型基于多路复用器接收并处理用户请求(能讲就多讲一点),内部实现了两个线程池,boss线程池和work线程池,其中boss线程池的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件(通过口述加画图的方式,把请求的执行过程大概描述了一遍,时间有限,也不可能把所有的细节都说完,挑重点讲,挑记忆深刻的讲)

面试官:嗯,理解的还挺深入的...那你在做这个项目时有没有遇到什么困难,或者是觉得有挑战的地方?

我:(这时面试官想让你自己出题自己回答了,所以一定要回答,不回答就突显不出你这个项目了,要是这个问题没有准备过,只能临时发挥了,当然我就是属于临时发挥的)稍微想一下,因为之前确实碰到了这个问题,当时做这个项目时,对netty的不过熟悉,把请求的业务逻辑放在work线程池的线程中进行处理,进行压测的时候,发现qps总是上不去,后来看了源码之后才发现,由于业务逻辑的处理比较耗时,完全占用了work线程池的资源,导致新的请求一直处于等待状态。

面试官:那最后是如何解决的?

我:最后把处理业务的逻辑封装成一个task提交给一个新建的业务线程池中执行,执行完之后由work线程池执行请求的write事件。

面试官:好的,你知道nio中selector可能触发bug么?

我:嗯,对的,selector的select方法,因为底层的epoll函数可能会发生空转,从而导致cpu100%。

面试官:那如何解决该问题?

我:这个问题在netty已经解决了,通过&^%&$^(把netty的解决方案说一遍)

面试官:嗯,对了,你们这个项目有给自己定指标么?

我:有的,&&…………¥¥##@,把自己项目的指标说了一通,如何进行AB实验,如何迭代优化指标

面试官:嗯,好的 ,项目的问题先到这里,我们来考察一下java的基本点吧。

░G公司


 面试官:平时线程池用的多么?

我:嗯,我的*项目中就用到了

面试官:那好,你讲讲线程池的实现原理

我:(还好我之前看过源码,但是时间久远有点模糊了),能给我笔和纸么,我画图分析给你看看,&&¥&假设初始化一个线程池,核心线程数是5,最大线程数是10@@@

面试官:嗯,好的,你继续...

我:在纸上画了正方形,这个代表一个线程池,初始化的时候,里面是没有线程的

面试官:嗯,好的,你继续...

我:又画了一个细长的长方形,这个代表阻塞队列,一开始里面也是没有任务的

面试官:嗯,好的,你继续...

我:当来了一个任务时,在正方形中画了一个小圆圈,代表初始化了一个线程,如果再来一个任务,就再画一个圆圈,表示再初始化了一个线程,连续画了5个圆圈之后,如果第6个任务过来了...

面试官:嗯,好的,你继续...

我:这时会把第6个任务放到阻塞队列中..

面试官:嗯,然后呢?

我:现在线程池中不是有5个线程了么,如果其中一个线程空闲了,就会从阻塞队列中获取第6个任务,进行执行..

面试官:嗯,对的,那如果任务产生的速度比消费的速度快呢?

我:如果线程池的5个线程都在running状态,那么任务就先保存在阻塞队列中

面试官:如果队列满了,怎么办?

我:如果队列满了,我们不是设置了最大线程数是10么,而线程池中只有5个线程,这时会新建一个线程去执行不能保存到阻塞队列的任务,然后我又在正方形中画了5个圆圈。

面试官:那如果线程池中的线程数达到10个了,阻塞队列也满了,怎么办?

我:这种情况通过自定义reject函数去处理这里任务了,舒了一口去,以为问完了...

面试官:好的,那如果运行一段时间之后,阻塞队列中的任务也执行完了,线程池中的线程会怎么样?

我:...这个好像超过核心线程数的线程会在空闲一段时间内自动回收...因为有点不记得这个逻辑了,回答的有点虚...

面试官:好的,那这种情况在什么场景下会发生?

我:(有时候真是笨啊,很多东西都知道,但是在面试的时候一紧张,全忘记)这个...那个...我好像没有遇到过这样的情况

面试官:嗯,好的,你回去之后再好好想想

我:........

我居然忘记了秒杀这个场景  :1、“讲讲线程池的实现原理”2、“线程池中的coreNum和maxNum有什么不同”
3、“在不同的业务场景中,线程池参数如何设置”

░H公司


面试官:都了解Java中的什么锁?

我:比如Synchronized和ReentrantLock...读写锁用的不多,就没研究了(我就怕被问读写锁,因为一直没去看)

面试官:那好,你先说说Synchronized的实现原理吧

我:嗯,Synchronized是JVM实现的一种锁,其中锁的获取和释放分别是monitorenter和monitorexit指令,该锁在实现上分为了偏向锁、轻量级锁和重量级锁,其中偏向锁在1.6是默认开启的,轻量级锁在多线程竞争的情况下会膨胀成重量级锁,有关锁的数据都保存在对象头中...&&@@#,(嗯,说了一大堆,面试官也没打断我)

面试官:哦,嗯,理解的还挺透彻,那你说说ReentrantLock的实现吧...

我:ReentrantLock是基于AQS实现的

面试官:什么是AQS?

我:在AQS内部会保存一个状态变量state,通过CAS修改该变量的值,修改成功的线程表示获取到该锁,没有修改成功,或者发现状态state已经是加锁状态,则通过一个Waiter对象封装线程,添加到等待队列中,并挂起等待被唤醒&&&$$(又说了一堆)

面试官:能说说CAS的实现原理么?

我:CAS是通过unsafe类的compareAndSwap方法实现的(心里得意的一笑)

面试官:哦,好的,那你知道这个方法的参数的含义的么?

我:(这是在逼我啊...努力的回想,因为我真的看过啊)我想想啊,这个方法看的时间有点久远了,第一个参数是要修改的对象,第二个参数是对象中要修改变量的偏移量,第三个参数是修改之前的值,第四个参数是预想修改后的值....(说出来之后都有点佩服自己,这个都记得,不过面试官好像还是不肯放过我...)

面试官:嗯,对的,那你知道操作系统级别是如何实现的么?

我:(我去你大爷...)我只记得X86中有一个cmp开头的指令,具体的我忘记了...

面试官:嗯,好,你知道CAS指令有什么缺点么

我:哦,CAS的缺点是存在ABA问题

面试官:怎么讲?

我:就是一个变量V,如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其他线程修改过了吗?如果在这段期间它的值曾经被改成了B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。

面试官:那怎么解决?

我:(有完没完了啊...我的心里是崩溃的)针对这种情况,java并发包中提供了一个带有标记的原子引用类"AtomicStampedReference",它可以通过控制变量值的版本来保证CAS的正确性。

面试官:嗯,好的,这个问题到此为止,我们再看看别的

1.深入浅出java同步器AQS
2.java中的CAS
3.深入浅出synchronized
4.深入浅出ReentrantLock
5.java中的Unsafe
6.java volatile关键字解惑
7.深入分析Object.wait/notify实现机制
8.深入分析synchronized的JVM实现

░I公司


面试官:谈谈ConcurrentHashMap实现原理

我:@#¥@@基于分段锁的%%¥#@#¥,但是1.8之后改变实现方式了

面试官:1.8啥方式

我:把1.8的实现原理说了一通,其中提到了红黑树...

面试官:能讲下红黑树的概念吗

我:红黑树是一种二叉树,并且是平衡……%……¥……,

面试官:能讲下红黑树的。。。。。

我:打住,别问了,红黑树我只知道他是二叉树,比其他树多一个属性,其他的我都不知道
面试官:好的,那换个,你知道它的size方法是如何实现的么?

我:size方法?是想要得到Map中的元素个数么?

面试官:对的....

我:我记得好像size方法返回是不准确的,平时也不会用到这个方法...

面试官:如果你觉得size方法返回值不准确,那如果让你自己实现,你觉得应该怎么实现呢?

我:...@#¥@@...两眼一黑

我:等等,让我想想.....应该可以用AtomicInteger变量进行记录...嗯,对的,每次插入或删除的时候,操作这个变量,我得意的一笑...

面试官:哦,是么,那如果我觉得这个AtomicInteger这个变量性能不好,还能再优化么?

我:懵逼脸...(当时居然把volitile变量给忘记了)...好像没有了,我想不出来了...

面试官:哦,那回头你再看看源码吧,jdk中已经实现了...

我:哦,是么....

面试官:那今天的面试到此结束,我们后面会通知你。
 

我:..................

当考察数据结构时,面试官一开始会问HashMap的实现原理,当你说出HashMap并非线程安全之后,会让你自己引出ConcurrentHashMap,接着就可能开始如下的对话。

深入浅出ConcurrentHashMap(1.8)
谈谈ConcurrentHashMap1.7和1.8的不同实现
ConcurrentHashMap的红黑树实现分析
深入分析ConcurrentHashMap1.8的扩容实现

░J公司


░K公司


░L公司


░N公司


░M公司


░O公司


发布了55 篇原创文章 · 获赞 40 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/java173842219/article/details/89230357