ThoughtWorks面试
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
1. 写代码,向原作业中添加功能(20min) 2. Java基础 * hashMap底层实现(底层是数据+链表+红黑树,冲突的元素放入链表中,当链表的长度大于8时,将链表转换为红黑树) <br> * hashmap中冲突的元素是放在链表最后还是最前(底层是单链表,每次发生冲突,在链表中都是遍历到最后一个next=null的节点进行插入) <br> * Java中常用的容器(从容器的分类上来答,Map,List,Set,Vector) <br> * ArrayList和LinkedList的区别(最大的区别是底层实现,ArrayList基于数组,LinkedList基于链表,数组各元素内存是连续的,进行随机访问时效率很高,需要扩容,链表不需要扩容。数组在每次插入和删除中间的元素时都需要将后续的元素进行移动,而链表不需要,所以当存多于取使用链表,当取多于存时使用数组) <br> * 什么时候用ArrayList什么时候用LinkedList <br> * 为什么重写equals还要重写hashCode(当这个对象作为hash映射类容器的Key时,判断两个键是否相等是通过两个键的hash值是否相同来判断的,不重写hashcode()时,默认调用Object类的hashCode方法对对象的地址进行hash,那么我们认为内容相同的两个对象就会被hash认为不相同) <br> * 虚拟机内存模型(分为主内存和线程的工作区间两个部分,主内存中包括) <br> * Java中类的加载过程(首先通过类加载器根据类的全限定名将类的字节码加载进虚拟机中,存储在方法区中,并生成一个对应的Class对象,然后虚拟机验证这个对象是否符合虚拟机的规范,通过验证以后为类中所有静态变量分配内存空间和初始值,再将栈中引用指向内存空间,再执行所有static关键字修饰的语句,这样一个类就加载完成了) <br> * 双亲委派原则(Java中两个类是否相同是由类本身和类的加载器一起决定的,一个类加载器接到加载任务时,先判断类是否已经被加载,如果没有则尝试将任务委托给他的父类进行加载。使用双亲委派模型有两个好处:防止重复加载,防止覆盖系统类) <br> * 知道Java中哪些锁(互斥锁,自旋锁,自适应自旋锁,偏向锁,轻量级锁,锁粗化,锁消除,乐观锁,悲观锁等) <br> * 知道哪些设计模式(单例模式,工厂模式,抽象工厂模式,适配器模式) <br> * 单例模式有哪些实现方法(懒汉式和饿汉式,双重检查,静态内部类,枚举) <br> * 双重检查实现单例模式每一层检查的解释(将单例模式写出来进行讲解,只初始化一次,防止拿到脏实例,防止大量线程阻塞) <br> * Java中有哪些线程池,这些线程池的区别是什么(Java有四种线程池FixdThreadPool固定线程池的size,超过阈值的加入工作队列,CachedThreadPool不固定线程池容量,新任务优先使用已有空闲线程处理,SingleThreadPool只用一个线程处理任务,保证任务执行的顺序,ScheduledThreadPool固定线程池容量,可以定时定期计划执行任务) <br> * Java8有哪些新特性(Stream,lambda,元空间,HashMap底层实现添加了红黑树,Optional) <br> * 讲讲元空间(虚拟机中原来存在方法区,线程共享,主要存储类的信息,常量池,方法数据,方法代码等,HotSpot虚拟机中方法区的实现是PermGen Space即永久代,在JDK1.8之后,永久代被从虚拟机中移出,使用一块本地内存来承接这块数据,即[元空间](http://blog.leanote.com/post/1130229445@qq.com/Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8BJMM)) <br> * Function和Consumer了解吗?(JDK8新添加的函数式接口,Function<T,R>功能型函数式接口表示一个输入一个返回,Consumer<T>消费型函数式接口表示一个输入没有返回,Predicate<T>断言型函数式接口,表示一个输入返回一个boolean值, Supplier<R>供给型函数式接口,没有输入返回一个结果) <br> * 知道Optional吗(Java8新特性,一个对象容器,可以对对象进行一些基础判断如是否等于null,为null返回设定值等操作,规范化对象null判断,简化ifelse代码) 3. 数据库 * Mysql有哪些底层引擎(InnoDB,MyISAM,BDB) * InnoDB和MyISAM有什么区别(InnoDB支持事务,MyISAM不支持事务等7种区别[区别](http://blog.leanote.com/post/1130229445@qq.com/InnoDB%E5%92%8CMyISAM%E7%9A%84%E5%8C%BA%E5%88%AB)) * sql操作中各种join之间的区别(left,right以不同的表为基,inner求两个表的交集) * 数据库中的行级锁是怎么实现的(对索引项加锁) * InnoDB的事物隔离级别有哪些(四种读未提交,读提交,可重复读,串行化) * InnoDB的默认事物隔离级别是什么(可重复读) * Redis有哪些数据结构(String,Hash,List,Set,Zset) * Redis操作常用命令(针对全局keys*,dbsize,expire,针对数据结构get,set,hget,hset,lpush,lpop,brpop...) * Redis为什么是单线程的(Redis本身的性能非常快,他是存在于内存中的数据库,就算采用多线程用多个cpu来进行并行运行也不会对整个应用程序的性能带来太大的提升,反而会因为线程上下文的切换和竞争死锁等问题大大增加实现的难度,Redis的性能瓶颈在网络传输速度上) 3. 框架 * 讲讲spring-boot starter(在开发某一类项目时所用到的依赖都差不多,stater就将这些依赖打包,简化了开发流程) * spring中日志记录框架的使用方式,日志相关注解,包路径扫描(项目中使用了两种记录,第一种是通过logger在程序中会抛出异常的地方打印异常日志,第二种是通过配置对controller这个包中所有的方法进行切片,在方法开始执行时打印传入的参数) * spring事务传播级别和隔离级别(7种传播级别,4中隔离级别) * Mybatis缓存机制() 4. 网络 * 讲讲OSI七层协议和TCP/IP四层协议 * TCP四次挥手 * 讲讲NIO * 讲讲Netty * 讲讲Netty中的ChannelFuture和Java中自带的Future有什么区别,为什么要自己实现Future 5. 其他 * 平时怎么学习的 * 对哪一方面的技术最感兴趣 * 最近的学习方向和打算 * 有没有什么要问我的
Pre:
Java线程池
Next:
HTTP协议