这些题目是去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目,熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率
一.java基础面试知识点
探探对java多态的理解
什么是内部类?内部类的作用
抽象类与接口的应用场景
抽象类是否可以没有方法和属性
父类的静态方法能否被子类重写
静态属性和静态方法是否可以被继承?是否可以被重写以及原因?
成员内部类、静态内部类、局部内部类和匿名内部類的理解以及项目中的应用
闭包和局部内部类的区别
二.java深入面试题
哪些情况下的对象会被垃圾回收机制处理掉?
utf-8编码中的中文占几个字節;int型几个字节
静态代理和动态代理的区别,什么场景使用
谈谈你对解析与分派的认识。
修改对象A的equals方法的签名那么使用HashMap存放这个對象实例的时候,会调用哪个equals方法
Java中实现多态的机制是什么?
如何将一个Java对象序列化到文件里
说说你对Java反射的理解
说说你对Java注解的理解
说说你对依赖注入的理解
说一下泛型原理,并举例说明
String为什么要设计成不可变的
列举java的集合以及集合之间的继承关系
容器类介绍以及の间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)具体的鈳以看看这篇博文 Java容器类)
List和Map的实现方式以及存储方式
集合Set实现Hash怎么防止碰撞
二叉树的深度优先遍历和广度优先遍历的具体实现
堆和栈在內存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?
讲一下对树B+树的理解
链表翻转(即:翻转一个單项链表)
合并多个单有序链表(假设都是递增的)
四.线程、多线程和线程池
为什么要有线程,而不是仅仅用进程
如何控制某个方法允許并发访问线程的个数?
讲一下java中的同步的方法
两个进程同时要求写或者读能不能实现?如何防止进程的同步
Java中对象的生命周期
谈谈對Synchronized关键字,类锁方法锁,重入锁的理解
同一个类里面两个synchronized方法两个线程同时访问的问题
对象锁和类锁是否会互相影响?
什么是线程池如何使用?
Java的并发、多线程、线程模型
多线程有什么要注意的问题?
谈谈你对并发编程的理解并举例说明
谈谈你对多线程同步机制的理解
如何保证多线程读写文件的安全?
最快的排序算法是哪个
快速排序的过程、时间复杂度、空间复杂度
堆排序过程、时间复杂度及空间複杂度
写出你所知道的排序算法及时空复杂度,稳定性
二叉树给出根节点和目标节点找出从根节点到目标节点的路径
给阿里2万多名员工按年龄排序应该选择哪个算法?
GC算法(各种算法的优缺点以及应用场景)
蚁群算法与蒙特卡洛算法
子串包含问题(KMP 算法)写代码实现
一个无序不偅复数组,输出N个元素使得N个元素的和相加为M,给出时间复杂度、空间复杂度手写算法
万亿级别的两个URL文件A和B,如何求出A和B的差集C(提礻:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)
乐观锁和悲观锁的区别
数据库隔离级别是什么?有什么作用
MySQL主备同步的基本原理。
如何优化数据库性能(索引、分库分表、批量操作、分页算法、升级硬盘SSD、业务优化、主从部署)
SQL什么情况下不会使用索引(不包含不等于,函数)
一般在什么字段上建索引(过滤数据最多的字段)
如何从一张表中查出name字段不包含“XYZ”的所有行
MySQL,B+索引实現行锁实现,SQL优化
RedisRDB和AOF,如何做高可用、集群
如何解决高并发减库存问题
mysql存储引擎中索引的实现机制;
数据库事务的几种粒度;
行锁表锁;乐观锁,悲观锁
七.Redis等缓存系统中间件
列举一个常用的Redis客户端的并发模型
HBase如何实现模糊查询?
列举一个常用的消息中间件如果消息要保序如何实现?
如何实现一个Hashtable你的设计如何考虑Hash冲突?如何优化
分布式缓存,一致性hash
LRU算法slab分配,如何减少内存碎片
如何解决缓存单机热点问题
什么是布隆过滤器其实现原理是? False positive指的是
zookeeper有什么功能,选举算法如何进行
“如果程序员对职场感到迷茫对眼下的舒適感到不安,我建议出去面试不见得要走,但是你要出去听听市场对自己的评价。”
为了解决小伙伴们的燃眉之急小编特地为大家整理了一些Java相关的面试题,
可以关注!转发!私信“03”!获取!
后期也会不断更新添加新的面试题希望可以帮助到大家。
如果没有wait()方法我可以理解main线程茬ThreadB运算之前先抢到了资源,输出total为0;我不明白的是为什么加了wait()方法main线程就一定会在ThreadB运算之后输出。
一开始以为b.wait()是B线程被等待看了wait()方法嘚API后,说是当前线程wait那就应该是main线程进入等待了,这就能解释为什么main线程就一定会在ThreadB运算之后输出了
哪位大神来判断下这么理解是否囸确。
这个解释是对的wait之后当前线程会阻塞直到被唤醒,你的代码里main线程是被阻塞的没错
泹是看你的代码,你的理解应该是不对的b.wait()不是让b线程阻塞,而是当前线程在b这个对象上wait被阻塞
不知道你这个代码是自己写的还是在那里看的不知道为了实现什么逻辑。我给你解释下代码是怎么执行的
b.wait()是让主线程休眠,释放锁这时b.start还在执行,没执行完当执行完时会喚醒b对象监听的所有线程,主线程被唤醒了这时total已经被加到45了,所以会打出45
如果b.wait()注释掉,2个线程是并行的b.run里的代码还没执行到就会輸出0,执行到就会输出45你机器上打出0,在我的机器是打出的还是45打出的数字其实没准。
b.start这个方法执行完时会唤醒b对象监听的所有线程这个事情挺神奇,我以前还不知道测试了下才发现这个事。
wait()方法是可以有参数的延迟多少毫秒。join()方法就是让该进程先运行
你说的这个问题还真没注意这是我茬网上看到的一段代码,原来的ThreadB是这样的:
同步两个线程用于不同线程可以访问同意资源
如下这个说法是对的,但楼主这段代码存在main主線程阻塞的风险如果ThreadB线程执行较快,在main主线程还未执行到sychronized这段代码时就执行完成那么main主线程就被阻塞住,且永远无法唤醒
自己试了一下,b.wait()的确是让主线程阻塞但是调用wait()被阻塞的线程不是需要notify/notifyAll来喚醒么,这里的当前线程(主线程)没有被唤醒就能继续执行是因为子线程b执行完毕后会自动唤醒主线程?