刚开始还是有所顾虑的,因为毕竟是大厂,进去应该不容易,但是这个朋友进去了,想想应该也没有很难吧,毕竟当时实习的时候,他技术并不怎么样。但是毕竟过去好几年了,现在人家可能变厉害了。
所以一开始并没有急着提交简历,而是说准备下再提交简历。然后就准备了一周,写简历,刷题,在网上找蚂蚁金服的面经。提交了一份简历,然后发现简历上面没有写学历,幸好他还没提交,就修改了下重新发了一份,然后他又给我提了几个建议,所以又改了一版,才最终提交。
1、2分钟的自我介绍
2、你自己认为自己最熟悉的技术是什么?
这个就因人而异了,每个人熟悉的东西都不一样,一定要说自己最擅长的东西,不要给自己挖坑。因为面试官下一步就会根据你的回答进行提问。对于我来是,工作了几年学的东西多而杂,没有什么很深入的,但是总不能说没有吧,所以就说了Java开发比较多,所以Java语言熟悉多一点。然后面试官就说:“好,那我就问你一点Java语言方面的。”
3、HashMap底层实现原理是什么?
这个作为一个面试必问的题目,所以我还是提前准备过的,看过源码。所以这个问题不是问题,答完,面试官说回答的对了。
HashMap,HashTable,ConcurrentHashMap面试必备,针对1.7和1.8的不同实现加以说明。包括底层的数据结构,Hash碰撞生成链表,Java8的链表转红黑树。
4、Java的多线程有没有使用过
根据自身情况,用过就用过,没用过就没有用过。我回答有简单的使用过,但是使用的场景不多。面试官也就没追问了,说了没关系,就继续。
5、讲一下线程池,以及实现固定大小线程池底层是如何实现的?
讲了下四中线程池,单一线程池,固定大小线程池,缓存线程池,定时线程池。但是关于固定大小线程池底层是如何实现的,回答的不好,面试官直接问底层的源码是不是没看过,就说是的。面试官说没关系。。。
追加:线程池底层都是通过ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue
6、Redis为什么这么高效,使用的场景是什么?
1、完全基于内存,大多数请求都是内存操作,非常快速;2、数据结构简单,操作简单;3、采用单线程,避免了不必要的上下文切换和竞争条件,不存在多进程或者多线程的切换,不用考虑锁带来的性能消耗;4、使用多路I/O复用模型,非阻塞IO
7、分布式服务是否了解,zookeeper,dubbo是否使用过?
关于zk和dubbo这块用的不多,zk主要是在使用kafka的时候会用到,但是不涉及原理上面的研究。dubbo虽然项目中有用过,但是并不是很深入,就没说用过,直接说没用过。
8、幂等概念有没有了解过
幂等性是数学上的含义是对于参数x,f(x)=f(f(x));比如绝对值函数。在分布式环境下表示的是对于同样的请求,在一次或者多次请求的情况下对系统的使用资源是一样的。保证失败重试不会导致提交两次。方法:带版本号的方式;采用数据库唯一索引方式;
9、常用的数据库是什么?
我们常用的数据库是MySQL,所以就回答了MySQL。
10、MySQL的事务特性有哪些?
首先事务是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行。事务是一个不可分割的逻辑单元。A(原子性)事务的各步操作是不可分的,保证一系列的操作要么都完成,要么都不完成;C(一致性)事务完成,数据必须处于一致的状态;I(隔离性)对数据进行修改的所有并发事务彼此之间是相互隔离,这表明事务必须是独立的,不应以任何方式依赖或影响其他事务;D(持久性)表示事务对数据处理结束后,对数据更改必须持久化,不管是事务成功还是回滚。事务日志都能够保持事务的永久性。
11、如果现在一台生产的数据库挂了怎么处理?
首先这题没有get的面试官想问的点是什么,所以就根据自己项目本身的情况做答了。我们项目生产上的数据库是有主备的,在主数据库挂掉的情况下是会切换到备数据库,先保证业务的稳定性,然后在对崩溃现场进行保留,方便后续分析问题,找到原因。这里面试官追问了一下,我们主备的切换是自动的还是手动的,这个由于是公司运维团队负责的,自己本身不是特别清楚,但是根据对公司运维团队的了解,应该是自动的。所以就这样如实的回答了。
12、数据库如何实现rollback的?
数据库在写入数据之前是先讲对数据的改动写入redolog和undolog,然后在操作数据,如果成功提交事务就会讲操作写入磁盘;如果失败就会根据redolog和undolog逆向还原到事务操作之前的状态。
13、工作这么久你遇到的最难的技术点是什么?
我这边根据具体的工具经理,回答的是kafka的初次使用,因为当时是公司内部第一个引入kafka,之前没有小组使用过,所以要采很多坑。并且那个时候kafka还没有发布1.0版本,官网和网上提供的版本很杂乱不兼容。
14、用过Kafka的话说下Kafka优缺点有哪些?
Kafka是一个高吞吐量的消息队列。基本的组件有生产者,消费者,node节点,生产者负责生产消息,将消息发送到指定的topic或者partition当中。每个partition可以有多个分区副本,并且存放在不同的broker节点上,保证数据的安全。partiton的底层是根据segment段存放的一系列日志文件,文件里面存放的具体的消息内容,每条消息都有一个唯一的offset偏移量,并且是按照磁盘顺序存放的。由于磁盘是顺序读写,所以kafka可以有很高的吞吐量。磁盘的顺序读写比随机读写的性能高很多。每个消费者都属于一个消费者组,可以消费指定topic下的数据。
15、TCP/IP协议是如何保证数据可靠性的?
首先TCP是面向连接的传输协议。主要通过消息确认和重试机制来保证数据传输的可靠性。
1、先进行自我介绍,然后介绍自己做过的项目,从项目流程架构设计等方面介绍
根据个人经历说了自己所做的项目,以及流程和架构方面,因为是自己参与的项目,所以整个流程说的还是很流畅的。毕竟自己很熟悉。这块尽量多从几个方面讲,流程,架构,设计等。
理想情况下是O(1)的,但是实际中会出现hash碰撞,导致无法达到效果。
3、LinkedList和ArrayList的区别
LinkedList底层是基于双向链表实现的,而ArrayList底层是基于动态数组实现的;查询的时候LinkedList的效率要低于ArrayList,因为LinkedList需要遍历链表,而ArrayList底层数组根据下标直接获取数据。插入删除数据的时候,LinkedList效率比ArrayList效率高,因为ArrayList在数据多的情况下会进行数组扩容或移动数组。多进程与多线程在编程上面有什么需要注意的
首先进程是资源分配的最小单元,线程是任务调度的最小单元
5、ThreadLocal的使用场景
ThreadLocal适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。
6、堆内存和栈内存有什么区别
堆内存是线程共享的,栈内存是线程私有的;堆内存用来存放由new创建的对象和数组,栈内存中存放一些基本类型的变量和对象的引用变量;
8、如果优化数据库的数据查询,另外应用层上还能如何优化?
1)数据库层面上:
除了主键索引,唯一索引之外,对于常用的查询字段也要加索引。查询的时候尽量使用主键索引,因为MySQL的InnoDB的主键索引索引的是整行数据,而普通索引索引的是主键,会有回表操作。当然索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,需要酌情考虑。2、优化查询语句,尽量采用确认性查询语句,减少or,in,notin,%xxx%语法的使用。
2)应用层面上:
采用缓存机制,将常用的数据进行缓存,增加访问速度;分库分表,读写分离,将数据分开读写,提升性能
9、强一致性,弱一致性,最终一致性
10、有一个一百万行的文件,内部是购买的商品ID,如何获取到购买最多的前一百个商品。
思路:首先考察的肯定是大数据处理方案,这些数据肯定不能一次性读取到内存,那就需要拆分,将数据分隔处理。假设要分隔为n个文件。分隔:如果ID是整型的话,可以直接采用取模(id%n)的方式;如果ID是字符串可以先计算hash值然后再取模(hash(x)%n)的方式,将相同ID的商品分到同一个文件中。针对每个小文件进行top100的排序,返回购买最多的100个商品ID根据n个文件中的100个ID,在进行一次排序,即可得到需要的数据。
首先很感谢内推的那个朋友才有了这次的面试机会,虽然结果不尽人意,但是为自己的学习成长之旅增加了一些精彩。
身为一个目前在职三年,工作在深圳这样的大环境下,还是有很大压力的。以前上学的时候想着什么时候能月入过万应该就不愁什么的,但是渐渐的发现,及时月入过万也还是过不好生活。周围比你厉害比你强的人多了去了,你能做的就只有不断的学习,不断的进步。
精彩回顾:
强烈推荐:
《Java极客技术》知识星球限时优惠,现在加入只需50元,仅限前1000名,机不可失时不再来。趁早行动吧!