前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试:2021.05.13

Java面试:2021.05.13

原创
作者头像
夕梦
修改2021-05-17 15:35:10
2630
修改2021-05-17 15:35:10
举报
文章被收录于专栏:每日面试

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 等容器。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、什么是红黑树?哪里用到了?
  • 2、说一下项目具体负责的流程?
  • 3、项目中使用缓存了吗?比如缓存雪崩怎么解决的?
  • 4、Spring事务管理的方式有几种?
  • 5、eureka的工作原理说下?
  • 6、Ribbon的负载均衡策略说几个?
  • 7、Spring MVC的工作原理了解吗?
  • 8、在书写 sql 中,最大值、分页、的关键字是什么?
  • 9、HashMap线程安全吗?为什么?
  • 10、在实际开发中,是使用同步代码块好,还是使用同步方法好?
  • 11、wait和sleep的区别?
  • 12、数字格式的字符串转成基本数据类型的方法?
  • 13、Java中如何实现序列化,有什么意义?
  • 14、Spring Boot 需要独立的容器运行吗?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档