Java面试:2021.05.13

1、什么是红黑树?哪里用到了?

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须除了满足二叉搜索树的性质外,还要满足下面的性质:
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点(NIL)是黑色。
性质4:每个红色结点的两个子结点一定都是黑色。
性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
应用:
1、java8 hashmap中链表转红黑树。
优势:
时间复杂度从O(n)-->O(logn) ,且自旋开销较其他树较低(不用整体平衡)。
2、epoll在内核中的实现,用红黑树管理事件块(文件描述符)。
优势:
因为内核态需要维护一个长久存放fd的数据结构,而fd变动十分频繁,且需要支持快速查询,且所以红黑树很适合。
红黑树可以判断是否是重复的fd。
3、Java的TreeMap实现
相对与hashMap优势,内部key保持有序,且支持自定义排序比较器。
适用场景,对数据需要排序统计。
4、linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块。

 

2、说一下项目具体负责的流程?

这里我就打个样,每家公司也都有所区别。
我们做的是外包的项目,所以相关的需求都比较明确了。拿到项目后经理这边根据我们每个人的情况划分负责的模块,沟通明确每个点的开发时间,在下班的时候会进行核对,下班前提交代码,然后汇报一下进度以及所遇问题。
遇到的问题如果不能独立解决的话,好协调人手进行处理这样也不耽搁大家的时间。
我们每做完一个功能都会先进行单元测试没问题进行提交,然后对接前端,测试部门的同事进行测试,发现问题后编写测试报告提交,项目经理这边再发给我们进行调整。这一过程我们也都有记录,便于项目研发后的总结。
工具:wiki
以上就是我这个项目的一个大致流程。(可以看看面试官还想问那些点)

 

3、项目中使用缓存了吗?比如缓存雪崩怎么解决的?

使用了redis进行缓存处理。
解决缓存雪崩,可以从以下几个方面入手:
1:保持缓存层的高可用性;
2:限流降级组件;
3:缓存不过期;
4:优化缓存过期时间;
5:使用互斥锁重建缓存;
6:异步重建缓存。

 

4、Spring事务管理的方式有几种?

      1、编程式事务:在代码中硬编码(不推荐使用)。
      2、声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。

 

5、eureka的工作原理说下?

Eureka 作为分布式系统的注册中心,主要作用是用于服务治理,Eureka 分为 Eureka Server 和 Eureka Client。
Eureka Server :服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会在服务注册表中存储该服务的信息。
Eureka Client :Eureka Client 是一个 Java 客户端,会拉取、更新和缓存 Eureka Server 中的信息。即使 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。
服务注册后,Eureka Server会将注册信息向其他 Eureka Server进行同步
Eureka Client 和 Eureka Server 会采用推拉结合的方式同步服务器提供者信息
心跳检测,微服务每30秒向eureka server发送心跳,Eureka Server 若90s之内都没有收到某个客户端的心跳,则认为此服务提供者出了问题,会从注册的服务列表中将其删除,并同步其它 Eureka Server 和服务订阅者。
保护机制:默认情况下,某个服务提供者心跳检测失败会注销。但开启自我保护机制后,将不再移除该服务,只是不会将它同步到其他节点上,当网络稳定时再进行同步。

 

6、Ribbon的负载均衡策略说几个?

轮询策略(默认)RoundRobinRule 轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个provider,第 1 次取第 1 个,第 2次取第 2 个,第 3 次取第 3 个,以此类推
权重轮询策略 WeightedResponseTimeRule 根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
随机策略 RandomRule 从 provider 列表中随机选择一个provider
最少并发数策略 BestAvailableRule 选择正在请求中的并发数最小的 provider,除非这个provider 在熔断中。

 

7、Spring MVC的工作原理了解吗?

1.客户端(浏览器)发送请求,直接请求到DispatcherServlet。
2.DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
3.解析到对应的Handler(也就是我们平常说的Controller控制器)。
4.HandlerAdapter会根据Handler来调用真正的处理器来处理请求和执行相对应的业务逻辑。
5.处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是逻辑上的View。
6.ViewResolver会根据逻辑View去查找实际的View。
7.DispatcherServlet把返回的Model传给View(视图渲染)。
8.把View返回给请求者(浏览器)。

 

8、在书写 sql 中,最大值、分页、的关键字是什么?

分页:
mysql中分页的关键字:limit
语法:select * from table limit [m],n 其中,
* m 为可选,如果填写表示跳过 m 条记录,不写可以认为 m=0(不跳过)
* n 为返回的最大记录数
例子:select * from stu limit 2,4; 即:取 stu 表中第3至第6条,共4条记录。
 
最大值:
在MySQL中,有一个统计函数:Max(列名),可以用于统计某一列的最大值。
例如:select max(列名) from 表名。

 

9、HashMap线程安全吗?为什么?

HashMap会进行resize操作,在resize操作的时候会造成线程不安全。
1、put的时候导致的多线程数据不一致。
这个问题比较好想象,比如有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落到的桶的索引坐标,然后获取到该桶里面的链表头结点,此时线程A的时间片用完了,而此时线程B被调度得以执行,和线程A一样执行,只不过线程B成功将记录插到了桶里面,假设线程A插入的记录计算出来的桶索引和线程B要插入的记录计算出来的桶索引是一样的,那么当线程B成功插入之后,线程A再次被调度运行时,它依然持有过期的链表头但是它对此一无所知,以至于它认为它应该这样做,如此一来就覆盖了线程B插入的记录,这样线程B插入的记录就凭空消失了,造成了数据不一致的行为。
2、另外一个比较明显的线程不安全的问题是HashMap的get操作可能因为resize而引起死循环(cpu100%)。在java7版本是存在的,但 java8后没有了。

 

10、在实际开发中,是使用同步代码块好,还是使用同步方法好?

这个考察的是对同步和锁的理解。结论是很明显的,同步代码块比同步方法好。
原因如下:
1:  我们只需要对临界区的代码进行同步
       因为多线程只会对临界区的代码访问顺序敏感,因此在执行同步操作的时候,如果使用的是同步方法,那么整个方法中的所有内容都会被当做一个原子操作。而事实上在大多数情况下,我们可能只是方法中某一段内容需要同步,同步代码块可以帮助我们只在必要的地方进行同步。当然,如果方法中的所有内容的确都是要当做一个原子操作进行,那么此时同步代码块和同步方法其实效果是一样的。
2:在同步代码块中,我们可以自由的选择锁
     在同步代码块中,我们可以自由的选择任何一个java对象实例作为同步过程中要使用到的锁。但是对于实例同步方法而言,这个锁是不能选择的,就是这个对象实例。对于静态同步方法而言,这个锁就是类的class对象实例。不能自由的选择锁,就会产生一个很大的问题。例如我们类中定了两个不同的实例同步方法,这两个方法在业务上并没有太多关联。当某个线程在调用其中一个同步实例方法的时候,其他的线程就无法继续调用另外的一个实例同步方法。这是因为,锁只有一个,就是这个类实例对象。必须要等到一个实例同步方法执行完成,把锁释放了之后,其他的线程得到锁,才能执行另外一个同步方法。因为两个实例同步方法的确没有什么关联,所以我们是希望两个同步方法被同时调用的,只要每个方法中的内容可以原子方式执行即可。但是因为我们使用的是同步方法,而锁只有一个(对象实例),因此没有关联的两个需要同步执行的方法互相产生了影响。如果我们使用的是同步代码块,那么我们就可以自由的选择锁,我们可以定义两个任意对象的实例作为锁,然后在不同的方法内部使用同步代码块,并且各自使用其中一个锁,这样就可以避免多个同步实例方法彼此之间的相互影响。 

 

11、wait和sleep的区别?

方法归属
* sleep(long) 是 Thread 的静态方法,而 wait(),wait(long) 以及 wait(long int) 都是 Object 的成员方法,每个对象都有
醒来特性
* 执行 sleep(long) 和 wait(long) 的线程都会在等待相应毫秒后醒来
* wait(long) 除了睡足自己醒之外还可以被 notify 唤醒,wait() 只能被 notify 唤醒
锁特性
* wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态(有时限等待 TIMED_WAITING)
* wait 方法的调用必须先获取 wait 对象的锁,而 sleep 则无此限制
* wait 方法执行后会释放对象锁,允许其它线程获得该对象锁,而 sleep 如果在 synchronized 代码块中执行,并不会释放对象锁。

 

12、数字格式的字符串转成基本数据类型的方法?

1、将一个全由数字组成的字符串转换为int类型,可以采用Integer类的方法:public static int parseInt(String s) throws NumberFormatException。
2、将一个全由数字组成的字符串转化为float类型,可以采用Float类的方法:public static float parseFloat(String s) throws NumberFormatException。

 

13、Java中如何实现序列化,有什么意义?

java 对象在程序结束后就消失了,它所包含的数据信息就会丢失,另外,一个 jvm 中的 java 对象,并不能被其它 jvm 所直接使用。
序列化可以将 java 对象变成字节流,而字节流可以存入磁盘文件,实现对象持久化保持,将来可以通过反序列化再将字节流还原为 java 对象 。
字节流也可以通过网络 api 传递给另一个 jvm,同样通过反序列化还原成 java 对象,这就实现了 java 对象在不同 jvm 之间的传输 。
除此以外,序列化也能实现对象的复制(深拷贝)。
要实现序列化,只需要让 java 类实现 Serializable接口,并配合 ObjectOutputStream 将java对象序列化为字节流,反之用 ObjectInputStream 可以把字节流还原成 java 对象。

 

14、Spring Boot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long 引用: 在执行时出现类型转换错误:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 引用: org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long 问题描述中提到的错误是java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer,而不是java.lang.Long cannot be cast to java.lang.Integer。这个错误可能发生在数据库查询中,在执行查询时,将java.lang.Long类型错误地转换为java.lang.Integer类型。 要解决这个问题,可以考虑以下几个步骤: 1. 检查数据库表中相应的列的数据类型是否为java.lang.Integer类型,而不是java.lang.Long类型。如果列的数据类型为java.lang.Long,请将其更改为java.lang.Integer。 2. 检查数据库连接是否正确,确保数据库连接的配置与实际情况相符。 3. 检查MyBatis的映射文件中的查询语句,确保查询结果被正确地映射为java.lang.Integer类型。 4. 如果以上步骤都没有解决问题,可以考虑重新编译和构建项目,以确保所有依赖项和配置文件都正确地加载和使用。 需要注意的是,这只是一种可能的解决方法,具体的解决方案可能根据实际情况而异。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long](https://blog.csdn.net/qq_36785719/article/details/90201942)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [关于hibernate执行select count( *) 出现java.lang.ClassCastException问题](https://blog.csdn.net/cekong0704/article/details/9944731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值