JAVA面经复习(二十六)面试难度:☆☆☆☆
面试难度:☆☆☆☆
推荐指数:☆☆☆☆☆
推荐原因:总体来说本篇面经难度不高,且基本都是基础知识,不涉及复杂的分布式应用的工具,适合新手复习。
声明:答案均为网上搜索汇总得到的参考答案,如有不妥或意见相左之处欢迎指出!
问:hashmap了解吗,时间复杂度是多少,底层是什么数据结构
答:hashmap采用数组+链表/红黑树的情况,时间复杂度在链表的情况下是O(n),在红黑树情况下是O(logn)的时间复杂度。
问:线程创建,多线程的四种实现?
答:线程创建可以使用1、实现Runnable接口,2、继承Thread类,3、实现Callable接口,4、从线程池中获取。
问:Redis数据结构,redis跳表是怎么实现的。
答:hash,String,set,zset,List。跳表,是一种用于加快有序链表检索的数据结构,其查找的时间复杂度为O(log2n),其通过将一部分的数据按照概率提取到上一层来实现逐层有序的一个结构,检索时先检索上层再检索下层,从而达到O(log2n)的复杂度。
问:Mysql底层数据结构,b树和b+树的区别 ?
答: mysql底层索引采用B+树的结构。B树和B+树的最大区别在于分支节点是否存储数据,B树是存储的,而B+树不存储数据,同时B+树底层的节点采用链表的形式连接,在进行范围查询的时候,速度较快。
问:B+树怎么实现的,是二叉树嘛 ?
答:B+树是一颗多叉平衡树,不是二叉树,其与B树类似,都是通过对插入的节点进行维护确保不超过特定的阶数来。与B树不同的是,B+树分支节点不包含具体数据,而是采用叶子节点保存数据,且叶子节点采用链表连接,支持顺序查找。
问:BST Trie树 红黑树的了解 ?
答:BST是二叉搜索树,对于二叉搜索树的每一个节点其左节点小于根节点,根节点小于右节点。
Trie为字典树,其一般用在字符串上,是为了用尽可能少的空间存储字符串和匹配字符串,简单来说,字典树将字符串的相同部分抽象成一颗树的上层节点,当我们从根节点出来遍历到叶节点,沿途节点上的字母可以组成一个存在的字符串。具体如下:
问:如果一个b+树的节点存不下了会怎么办,分裂 ?
答:一般是进行分裂,往上推举中间节点,并维持原有的左小右大的结构。篇幅原因,就不展开了。
问:进程间通信方式 ?
答:1、管道/命名管道,2、消息队列;3、信号量;4、共享内存。
问:Word单词拼写检错你怎么实现?
答:hashmap存储所有单词然后比较 。
问:字典树怎么实现的 ?
答:采用多个hashmap可以实现。每一层节点保存对应的key和value。
问:如何读取多个文件,并统计单词出现的频率 ?
答:采用str.splits("")对单词进行分词,再采用hashmap统计每个单词出现的频率。
问:Java进程和mysql进程如何通讯 ?
答:???(题意不明有待补充。。。)
问: 乐观锁和悲观锁?
答:乐观锁,其假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。如CAS。
悲观锁,直接对数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观锁。
悲观锁又分为共享锁和排他锁:
- 共享锁【shared locks】又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
- 排他锁【exclusive locks】又称为写锁,简称X锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据行读取和修改。
问: java里面final finally finalize区别?
答:final是用于修饰类、方法、成员变量的,被修饰的对象不能不继承、重载、修改。主要用途是为了避免后续程序改动一些关键的代码。
finally是用于try{} catch{} 语句的,其总是在 try 和任何 catch 块之后、方法完成之前运行。往往用于关闭文件、关闭连接之用。
finalize则是用于GC回收的,是Object中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情。
问:zookeeper?
答:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
问:arraylist和linkedlist区别?
答:arraylist采用数组实现,而linkedlist采用链表实现。检索是arraylist更快,删除插入时linkedlist更快。
问:hashmap和treemap的区别?
答:1、HashMap是通过hashcode()对其内容进行快速查找的;HashMap中的元素是没有顺序的;而TreeMap中所有的元素都是有某一固定顺序的,如果需要得到一个有序的结果,就应该使用TreeMap;
2、都非线程安全的。
3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals() 方法,以确保两个相等的映射返回相同的哈希值 ;TreeMap继承SortedMap类;他保持键的有序顺序;
4、HashMap:基于hash表实现的;使用HashMap要求添加的键类明确定义了hashcode() 和equals() ;为了优化HashMap的空间使用,可以调优初始容量和负载因子;TreeMap:基于红黑树实现的;TreeMap就没有调优选项,因为红黑树总是处于平衡的状态;
5、HashMap:适用于Map插入,删除,定位元素;TreeMap:适用于按自然顺序或自定义顺序遍历键(key);
问:为什么用红黑树实现treemap?
答:TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。同时,由于红黑树是一颗不是非常严格的平衡二叉树,因此维护红黑树的时间复杂度会比维护一颗严格的平衡二叉树要小。
问:java里面的反射原理?
答:编译: .java文件编译后生成.class字节码文件
加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的本地方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例
连接:细分三步
1、 验证:格式(class文件规范) 语义(final类是否有子类) 操作
2、准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。
3、解析:符号引用转化为直接引用,分配地址
初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。
Java的反射就是利用上面第二步加载到jvm中的.class文件来进行操作的。.class文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射获取class,然后进行各种操作。