java面试题——java高级(二)

四、Java高级部分

1.红黑树的实现原理和应用场景;

1.(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
2.红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。
参考链接:https://www.cnblogs.com/skywang12345/p/3245399.html
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

2.NIO是什么?适用于何种场景?

1.NIO是为了弥补IO操作的不足而诞生的网络通信模型,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道。管道(Channel),缓冲(Buffer) ,选择器( Selector)是其主要特征。
2.服务器需要支持超大量的长时间连接。比如10000个连接以上,并且每个客户端并不会频繁地发送太多数据。例如总公司的一个中心服务器需要收集全国便利店各个收银机的交易信息,只需要少量线程按需处理维护的大量长期连接。
Jetty、Mina、Netty、ZooKeeper等都是基于NIO方式实现。

参考链接:https://www.jianshu.com/p/59f610d8f97d

3.Java9比Java8改进了什么;

1. Java 平台级模块系统。模块化的 JAR 文件都包含一个额外的模块描述器。在这个模块描述器中, 对其它模块的依赖是通过 “requires” 来表示的。另外, “exports” 语句控制着哪些包是可以被其它模块访问到的。所有不被导出的包默认都封装在模块的里面。
2.Linking, jlink 工具实现创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。
3.Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。
4.集合工厂方法添加了Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");些方法也可以避免您选择特定的集合实现
5.从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。
6.Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:
7.接口的默认方法
8.新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。
9.多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本
参考链接:http://www.importnew.com/24528.html

4.HashMap内部的数据结构是什么?底层是怎么实现的?(还可能会延伸考察ConcurrentHashMap与HashMap、HashTable等,考察对技术细节的深入了解程度);

HashMap的底层实现都是数组+链表结构实现,添加、删除、获取元素时都是先计算hash,根据hash和table.length计算index也就是table数组的下标,然后进行相应操作.
参考链接:https://blog.csdn.net/u011202334/article/details/51496381

5.说说反射的用途及实现,反射是不是很慢,我们在项目中是否要避免使用反射;

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法,很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。

参考链接:https://blog.csdn.net/SongYuxinIT/article/details/81872066

6.说说自定义注解的场景及实现;

使用场景:①类属性自动赋值。②验证对象属性完整性。③代替配置文件功能,像spring基于注解的配置。④可以生成文档,像java代码注释中的@see,@param等

参考链接:https://blog.csdn.net/bluuusea/article/details/79996572

7.List 和 Map 区别,Arraylist 与 LinkedList 区别,ArrayList 与 Vector 区别;

1.List是有顺序的 可重复的,Map是通过键值对进行取值的    key和value是一一对应的
2.①ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
  ②对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
  ③对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 
3.①Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 
 ②当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

五、Spring相关

8.Spring AOP的实现原理和场景?

Spring bean的作用域和生命周期;

Spring Boot比Spring做了哪些改进? Spring 5比Spring4做了哪些改进;

如何自定义一个Spring Boot Starter?

Spring IOC是什么?优点是什么?

SpringMVC、动态代理、反射、AOP原理、事务隔离级别;

猜你喜欢

转载自www.cnblogs.com/LiLiliang/p/9901496.html