Java面试 汇总-补充

Java面试 汇总-补充

  • Java基础以及多个比较
  • 网络、数据库
  • 数据结构/算法

Java基础以及多个比较

  1. Collections.sort排序内部原理
    在Java 6中Array.sort()和Collections.sort()使用的是MergeSort(),而在Java 7中,内部实现变成了TimSort,其对对象间比较的实现要求更加严格。
    MergerSort():归并排序
    TimSort():起源于归并排序和插入排序的混合排序算法
  2. HashMap原理,Java 8 做的改变
    一文读懂HashMap
    从实现结构来讲,HashMap的实现是数据+链表+红黑树(JDK1.8增加了红黑树部分)。
    HashMap最多只允许一条记录的键为null。HashMap为非线程安全。
    ConcurrentHashMap为线程安全。解决碰撞,出现冲突是运用拉链法,将关键词为同义词的节点链接在一个单链表中,散列表长m,则定义一个由m个头指针组成的指针数组T,地址为i的节点插入以T(i)为头指针的单链表中。Java8中冲突的元素超过限制(8),用红黑树替换链表。
    HashMap:数组的默认长度为16,HashTable数组的默认长度是11
    新的Entity插入位置永远在链表的最前面
    null key总是存在放Entity[]数组的第一个位置
    线程安全:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
    链表法
  3. String 和 StringBuilder的区别
    1)可变与不可变:String不可变,每一次执行‘+’都会形成一个新的对象,所以频繁改变字符串的情况中不用String,以节省内存。
    2)是否多线程安全:StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
    StringBuffer和String均是线程安全的。
  4. Vector和ArrayLIst的区别
    1)ArrayList在内存不够时默认是扩展50%+1个,Vector是默认扩展1倍。
    2)Vector是属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
  5. HashMap与HashTable的区别
    1)历史原因:HashTable继承于Dictonary类,HashMap继承于abstractMap
    2)HashMap允许空的键值对,但最多只有一个空对象,而HashTable不允许。
    3)HashTable同步,而HashMap非同步,效率上比HashTable要高。
  6. ConcurrentHashMap和HashTable的比较(两个线程并发访问map中同一条链,一个线程在尾部删除,一个线程在前面遍历查找,问为什么前面的线程还能正确的查找到后面被另一个线程删除的节点?)
    ConcurrentHashMap融合了HashTable和HashMap两者的优势.HashTable是做了同步的, 即线程安全,HashMap未考虑同步,所以HashMap在单线程情况下效率较高。HashTable在多线程情况下,同步操作时能保证程序执行的正确性。但是HashTable是阻塞的,每次执行的时候都要锁住整个结构,ConcurrentHashMap正是为了解决这个问题而诞生的。
    ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术(一个Array保存多个Object,使用这些对象的锁作为分离锁,get/put是随机使用一个)。它使用了多个锁来控制对Hash表的不同部分进行的修改。在JDK1.6中,有HashEntity结构存在,每次插入将新添加的节点作为头节点(同HashMap实现),而且每次删除一个节点时,会将删除节点之前的所有节点拷贝一份组成新的链,而将当前节点的上一个节点的next指向当前节点的下一个节点,从而在删除以后有两条链存在,因而可以保证即使在同一条链中,有一个线程在删除, 而另一个线程在遍历,它们都能继续工作良好,因为遍历的线程能够继续使用原有的链。
    Java8中采用volatile HashEntity保存数据,table元素作为锁;从table数组+单向链表加上了红黑树,红黑树是一种特别的二叉查找树,特性为:1、节点为红或者黑;2、根节点为黑;3、叶节点为黑;4、一节点为红,则叶节点为黑;5、一节点到其子孙节点所有路径上的黑节点数目相同
  7. ArrayList和 LinkedList 的区别
    ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。LinkedList是双向链表
  8. Java 中,Comparator 与Comparable 有什么不同?
    Comparable 接口用于定义对象的自然顺序,是排序接口,而 comparator 通常用于定义用户定制的顺序,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。
    9.抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?
    抽象类是指不允许被实例化的类;一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
    abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系
    实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。但在Java8中允许接口中有静态默认的方法。
    接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
    子类中实现父类中的抽象方法时,可见性可以大于等于父类中的;而接口实现类中的接口 方法的可见性只能与接口中相同(public)。
    用抽象类是为了重用。减少编码量,降低耦合性。
  9. 描述 Java 中的重载和重写?
    重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动,而重写是运行时活动。你可以在同一个类中重载方法,但是只能在子类中重写方法。重写必须要有继承
    重写:1、在子类中可以根据需要对从基类中继承来的方法进行重写。2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。3、重写方法不能使用比被重写的方法更严格的访问权限。
    重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
  10. Collection与Collections的区别是什么?
    Collection是Java集合框架中的基本接口;
    Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。
  11. Java中多态的实现原理
    所谓多态,指的就是父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”。
  12. object中定义了哪些方法?
    clone(), equals(), hashCode(), toString(), notify(), notifyAll(),
    wait(), finalize(), getClass()
  13. Java泛型和类型擦除?
    泛型即参数化类型,在创建集合时,指定集合元素的类型,此集合只能传入该类型的参数。类型擦除:java编译器生成的字节码不包含泛型信息,所以在编译时擦除:1.泛型用最顶级父类替换;2.移除。
  14. 说出 5 个 JDK 1.8 引入的新特性?
    Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:
    Lambda 表达式;
    允许像对象一样传递匿名函数 Stream API,充分利用现代多核 CPU,可以写出很简洁的代码 ;
    Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用;
    扩展方法,现在,接口中可以有静态、默认方法;
    重复注解,现在你可以将相同的注解在同一类型上使用多次。
  15. java中public,private,protected以及默认关键字的访问范围:
    Java面试 汇总-补充_第1张图片
  16. 常用数据结构:
    集合,线性结构(数组,队列,链表和栈),树形结构,图状结构
  17. 匿名内部类是什么?如何访问在其外面定义的变量?
    匿名内部类也就是没有名字的内部类,匿名内部类只能使用一次,它通常用来简化代码编写。
    匿名内部类只能访问外部类的Final变量. Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰。
  18. 如何创建单例模式?说了双重检查,他说不是线程安全的。如何高效的创建一个线程安全的单例?
    一种是通过枚举,一种是通过静态内部类。
    21.poll() 方法和 remove() 方法的区别?
    poll() 和remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
    22.写一段代码在遍历 ArrayList 时移除一个元素
    使用迭代器。
Iterator itr = list.iterator();
while(itr.hasNext()) {if(…) { itr.remove();} }

网络、数据库

  1. TCP如何保证可靠传输?三次握手过程?
    在TCP的连接中,数据流必须以正确的顺序送达对方。TCP的可靠性是通过顺序编号和确认(ACK)来实现的。TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。第一次是客户端发起连接;第二次表示服务器收到了客户端的请求;第三次表示客户端收到了服务器的反馈。
  2. Linux下你常用的命令有哪些?
    1)cd命令用来改变所在目录。cd / 转到根目录中cd ~ 转到用户目录下
    2) ls命令用来查看目录的内容。
    3)cp命令用来拷贝文件cp
    4)mv命令 mv t.txt Document 把文件t.txt 移动到目录Document中。
  3. 常用的hash算法有哪些?
    1)加法hash:所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。
    2)位运算hash:这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素
    3)乘法hash:33*hash + key.charAt(i)
  4. 什么是一致性哈希?
    设计目标是为了解决因特网中的热点(Hot spot)问题,一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:1、平衡性(Balance) 2、单调性(Monotonicity) 3、分散性(Spread) 4、负载(Load)
  5. 数据库中的范式有哪些?
    第一范式----数据库中的表(所有字段值)都是不可分割的原子数据项。
    第二范式----数据库表中的每一列都和主键相关,而不能只和主键的某一部分相关。
    第三范式----数据库表中每一列数据都和主键直接相关,不能间接相关。范式是为了减小数据冗余。
    数据库范式
  6. 数据库中的索引的结构?什么情况下适合建索引?
    数据库中索引的结构是一种排序的数据结构,数据库索引是通过B树和变形的B+树实现的。什么情况下不适合建立索引:1.对于在查询过程中很少使用或参考的列;对于那些只有很少数据值的列;对于那些定义为image,text和bit数据类型的列;当修改性能远大于检索性能。
    根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行
  7. 常用的数据库有哪些?redis用过吗?
  8. 10.表单提交中,get和post区别
    1.get从服务器获取信息,post向服务器传信息
    2.get传送数据量比较小,post可以比较大
    3.get安全性比较低
  9. TCP 协议与 UDP 协议有什么区别?(answer答案)
    TCP(Tranfer Control Protocol)的缩写,是一种面向连接的保证传输的协议,在传输数据流前,双方会先建立一条虚拟的通信道。可以很少差错传输数据。
    UDP(User DataGram Protocol)的缩写,是一种无连接的协议,使用UDP传输数据时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的 路径传到目的地,因此,能否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。
    所以TCP必UDP多了建立连接的时间。相对UDP而言,TCP具有更高的安全性和可靠性。
    TCP协议传输的大小不限制,一旦连接被建立,双方可以按照一定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K。
  10. 5层,7层网络相关问题。
    5层网络
  11. http和https(对称加密、非对称加密)
    http和https

数据结构/算法

Hash及冲突解决
二叉搜索树
手写快排,单链表反转,字符串部分逆序(如moc.anis.www转为www.sina.com)
手写二叉树层序遍历、二分查找、递归算法实现
超大文件寻找top K算法设计(单机1M内存、Hadoop集群、外部排序+uniq命令)
订单超大并发访问-队列批量处理
观察者模式、工厂模式、适配器模式
hashmap 底层实现,为什么查询快?
常见排序算法时间复杂度为O(nlogn)的有哪些,最佳、最差时间复杂度分别是多少?
进程线程区别
多线程实现方式,线程冲突是什么、怎么解决
海量数据排序(分治)
常见排序算法的复杂度和一些细节以及改进优化。

你可能感兴趣的:(面试)