面试-基础篇

Posted Vindia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试-基础篇相关的知识,希望对你有一定的参考价值。

基本功

1,HTTP 请求的 GET 与 POST 方式的区别:Post的数据大多都在body里面,post比get多一次header请求

2,equals 与 == 的区别:equals是逻辑等,==是对象地址

线程:

1,Arraylist 与 LinkedList 区别:arraylist底层数组(读取效率高),linked底层链表(更新效率高)

2,ArrayList 与 Vector 区别:vetctor线程安全,synchronize

3,HashMap 和 Hashtable 的区别:hashtable线程安全(synchronize),key value皆不能为空

4、HashMap 和 ConcurrentHashMap 的区别:ConcurrentHashMap线程安全(1.8为synchronize,1.7及之前为segment AQS)
5、HashMap 的工作原理及代码实现:数组+链表(1.8新增红黑树),扩容为当前容量一倍(arraylist为当前的一半)
6、ConcurrentHashMap 的工作原理及代码实现:同hashmap,1.8为synchronize,1.7及之前为segment AQS

线程
1、创建线程的方式及实现:Thread,Runnable,Callable(FutureTask)
2、sleep() 、join()、yield()有什么区别:sleep出让CPU,不释放锁|wait出让cpu,释放锁|yield出让cpu,不释放锁|join,让当前线程等待调用join的线程
3、说说 CountDownLatch 原理:AQS中,state为count
4、说说 CyclicBarrier 原理:
5、说说 Semaphore 原理:
6、说说 Exchanger 原理
7、说说 CountDownLatch 与 CyclicBarrier 区别
8、ThreadLocal 原理分析:Thread有个map属性,key为ThreadLocal类的变量,value为范型值,每次get都是去查map
9、讲讲线程池的实现原理:poolSize < corePoolSize,新建线程|poolSize > corePoolSize,队列未满,放队列|poolSize > corePoolSize,队列已满,poolSize < maximumPoolSize,新增线程|poolSize > corePoolSize,队列已满,poolSize = maximumPoolSize,则拒绝|线程执行完任务后,不立即退出,而是检查队列还有没有任务,没有则会退出超出corePoolSize的线程
10、线程池的几种方式:newCachedThreadPool|newFixedThreadPool|newSingleThreadExecutor|newScheduleThreadPool|new ThreadPooledExecutor()
11、线程的生命周期

 

锁机制
1、说说线程安全问题:

2、volatile 实现原理:内存屏障,禁止重排序

3、synchronize 实现原理:monitorenter,monitorexit(底层为对象头中记录了线程标识)

4、synchronized 与 lock 的区别:synchronized是jvm实现的,悲观锁,lock是jdk的AQS实现的,乐观锁

5、CAS 乐观锁:乐观去操作,失败则可以采用自旋重试(底层实现为MESI协议)

6、ABA 问题:N线程读取变量为A,M线程A-->B,然后又B-->A,N线程再读取的时候还是A,认为变量没有变化,可以采用AtomicStampedReference来解决,思路是版本号

7、乐观锁的业务场景及实现方式:数据库采用版本号来解决记录的并发更新

JVM

jvm基础知识

1、JVM 由哪些部分组成?:类加载器,执行引擎,内存区,本地方法调用

2、Java 虚拟机是如何判定两个 Java 类是相同的?:类全路径名+类加载器的namespace

3、类加载器是如何加载 class 文件的?加载-->连接(验证-->准备-->解析)-->初始化-->使用-->卸载 

4、类加载?:获取类的字节码-->类的静态数据结构转化为运行时数据区数据结构-->在堆区生成Class对象,访问入口

jvm内存管理

1、jvm内存划分:方法区(运行时常量池,加载的类信息,常量,静态变量,jit后的代码),堆区(新生代(eden,s1,s2),老年代),虚拟机栈(局部变量表+操作数栈+动态链接+返回地址),本地方法栈,程序计数器

2、对象内存分配规则:优先在eden分配,无足够空间出发minor GC|大对象直接进入老年代|年轻代长期存活对象进入老年代|空间分配担保

3、Java内存模型:变量都存在主内存,每个线程有自己的工作内存|工作内存包含主内存变量副分,线程操作的是工作内存|线程间变量值传递通过主内存进行

4、线程通信:共享内存变量|wait,notify

5、

以上是关于面试-基础篇的主要内容,如果未能解决你的问题,请参考以下文章

Python面试重点(基础篇)

面试题Java基础篇-常见面试题总结p3

Python面试重点(基础篇)

Java面试题-基础篇

Java面试题-基础篇

Python面试基础篇