Java-复习

四、Java扩展篇

  • 红黑树的实现原理和应用场景;
  • NIO是什么?适用于何种场景?
  • Java9比Java8改进了什么;
  • HashMap内部的数据结构是什么?底层是怎么实现的?(还可能会延伸考察ConcurrentHashMap与HashMap、HashTable等,考察对技术细节的深入了解程度);
  • 说说反射的用途及实现,反射是不是很慢,我们在项目中是否要避免使用反射;
  • 说说自定义注解的场景及实现;
  • List 和 Map 区别,Arraylist 与 LinkedList 区别,ArrayList 与 Vector 区别;

Java基础

封装 继承 多态

封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开:

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象**,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定**。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

多态性怎么体现

https://snailclimb.gitee.io/2018/09/18/java/java%E5%9F%BA%E7%A1%80/Java%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/#toc-heading-1

一个int类型到底占多少个字节

https://blog.csdn.net/cqupt_chen/article/details/8056023 1字节 = 8比特

Java集合

https://www.cnblogs.com/yangfei629/p/11470575.html

List, Set , Map

Set八股文

HashSet和TreeSet的区别

https://blog.csdn.net/coding_1994/article/details/80553554

HashMap八股文

hashmap的key是按照什么排序的

看是否实现compre方法,没实现就按照类名字排序,如果名字一样,按照hashcode排序。

Hashmap扰动函数

为了用上高位的特征,右移再异或混合了高位和低位的特征,增大随机性,放的时候会执行hash&(length-1),为了取出低位,直接就是table的index

hashmap为什么2倍扩容

HashMap计算添加元素的位置时,使用的位运算,这是特别高效的运算;另外,HashMap的初始容量是2的n次幂,扩容也是2倍的形式进行扩容,是因为容量是2的n次幂,可以使得添加的元素均匀分布在HashMap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询效率降低!

https://blog.csdn.net/weixin_44579258/article/details/97646580

红黑树和平衡二叉树的区别

平衡二叉树的追求的是全局均衡,如在做插入,删除操作时,需要调整整棵树,显然这是费时的,因此希望在做调整时,是局部调整,因此提出了红黑树。

为什么hashmap加载因子是0.75

和统计学里面的泊松分布有关。

红黑树的性质

二叉查找树。叶子节点都是黑色的null。根节点是黑的。不能有两个连续的红色节点,红色的子节点必须是黑的。从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

threadpoolexecutor怎么知道提交任务,哪个先完成

ThreadPoolExecutor有两个protected的方法,beforeExecutor和afterExecutor,继承ThreadPoolExecutor自己实现这两个方法就可以。

单例模式有几种实现

5种。饿汉,懒汉,双重锁,静态内部类,枚举。

https://www.cnblogs.com/ngy0217/p/9006716.html,七种:https://cloud.tencent.com/developer/article/1497592 ,实现了饿汉改版,懒汉的线程安全版本

零拷贝----没有公司考过,不过应该也是个重点东西

最原始的读数据,四步:read由用户态切换到内核态;CPU利用dma把数据从硬盘copy到内核空间;CPU将内核空间的数据拷贝到用户空间;上下文切换为用户态。写数据也是4步:write由用户态切换为内核态;把用户空间的数据拷贝到内核空间的网络缓冲区;CPU利用dma将数据从内核空间的网络缓冲区拷贝到网卡;上下文由内核态切换回用户态。原理1是通过mmap,发送数据时会先把文件dma到操作系统内核缓冲区中,应用程序和操作系统共享缓冲区,这样就是共享内存,write时就可以直接从内核复制到socket中,最后再把socket的数据dma发给网卡;原来是四次copy,现在只用三次。原理2是使用sendfile,三次copy和两次用户态切换。原理3,sendfile+dma gather,把中间的一次copy也去掉,socket缓冲区知道了数据的内存地址和大小,就不用再进行一次复制了。原理4,splice,建立了管道,减少CPU复制,其他一样。Java只有mmap和sendfile。https://www.cnblogs.com/rickiyang/p/13265043.html
nio和bio:https://www.jianshu.com/p/8ad464ed516e,https://juejin.cn/post/6844903975448215560

@transactional注解实现原理

利用threadlocal保证数据源一致

反射

为什么反射的效率低

Method#invoke 方***对参数做封装和解封操作
需要检查方法可见性
需要校验参数
反射方法难以内联
JIT 无法优化

Java异常体系

父类是Throwable,然后两个继承类error和exception,分为错误和异常。

错误一般会导致线程停止,错误分为VirtualMachineError(比如oom,stackOverFlow)和其他error。

异常分为RuntimeException(NPE)和其他。

ClassNotFind和NoClassDefine的区别

https://www.cnblogs.com/zabulon/p/5893053.html

JDK 8 新特性

jdk1.7和1.8的区别

接口可以default;lambda表达式;可以用::传递方法;

Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce,当然Google的MapReduce的灵感也是来自函数式编程。她其实是一连串支持连续、并行聚集操作的元素。从语法上看,也很像linux的管道、或者链式编程,代码写起来简洁明了,非常酷帅!https://www.cnblogs.com/aspirant/p/8617201.html

jdk8的流原理

stream流原理:中间操作与结束操作,中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一。这些Stream对象以双向链表的形式组织在一起,构成整个流水线。由于每个Stage都记录了前一个Stage和本次的操作以及回调函数,依靠这种结构就能建立起对数据源的所有操作。

https://segmentfault.com/a/1190000038361937

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值