女Java年底被裁努力面试第六天💪🏻

104 阅读7分钟

Java开发工程师 13-20K

集团背景:自研非外包
1、学历要求:全日制统招(学信网可查);
2、经验要求:目前招聘2年及以上经验,3-5年优先;
3、应聘流程:发送简历及学信网截图—推荐用人部门—安排现场面试(当天完成机试或笔试+面试)

岗位职责:
1、能够理解产品需求,进行代码开发,保证代码质量、可靠性和性能达标;
2、参与企业级产品后端架构设计工作,接口设计、实现及文档编写;
3、按时保质的完成工作,配合测试组完成项目测试工作,系统交付工作;
4、对项目实施提供支持,参与产品设计,与前端工程师一同探讨技术方案。
任职要求:
1、大专及以上学历,计算机相关专业,3年左右Java研发经验;
2、精通JAVA开发,熟悉常见的设计模式,有系统设计经验;
3、熟悉TCP/IP协议,进程间通讯编程,熟悉Unix/Linux下常用工具及架构设计方法;
4、熟悉Spring框架,熟练掌握SpirngBoot、Springcloud,SpringMVC、HibernateMyBatis等;
5、熟练掌握Oracle和MySQL应用开发及优化,熟悉NoSQL存储,熟练掌握Redis并理解其适用场景;
6、熟悉RPC框架、消息队列框架、分布式存储系统,了解分布式协调服务Zookeeper;
7、熟悉常用的项目构建工具及版本管理工具,如Maven.Git.SVN;
8、积极主动,认真负责,头脑灵活,具有良好的沟通和团队协作能力。

机试题 一个半小时 五个题目 这个公司用了postgreSql没整出来

  1. 设计模式 策略模式
    比如根据用户等级不同返回不同的优惠券类型的场景
// 策略模式

// 1、定义策略接口    
public interface CouponStrategy {
    String getCouponType();
}

// 2、定义策略实现类 
@Service
public class ManJianCouponStrategy implements CouponStrategy {
    @Override
    public String getCouponType() {
        return "manJian";
    }
}

// 3、定义上下文 Context 管理所有策略 切换策略
@Service
public class ZheKouCouponStrategy implements CouponStrategy {
    @Override
    public String getCouponType() {
        return "zhekou";
    }
}

// 4、使用 传给上下文当前选择的策略
public class CouponContext {
    private CouponStrategy couponStrategy;
    public void setCouponStrategy(CouponStrategy couponStrategy) {
        this.couponStrategy = couponStrategy;
    }
    public String chooseCoupon() {
        return couponStrategy.getCouponType();
    }
}


public class TestMain {
    public static void main(String[] args) {
        CouponContext couponContext = new CouponContext();
        String userLevel = "1";
        switch (userLevel) {
            case "1": {
                couponContext.setCouponStrategy(new ZheKouCouponStrategy());
                break;
            }
            case "2": {
                couponContext.setCouponStrategy(new ManJianCouponStrategy());
                break;
            }
        }
        String result = couponContext.chooseCoupon();
        System.out.printf(result);
    }
}

  1. 索引为什么快

索引就像一本书的目录。而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点。这样就帮助用户有效地提高了查找速度。所以,使用索引可以有效地提高数据库系统的整体性能。

参考 zhuanlan.zhihu.com/p/62018452#…

  1. btree是什么

B-树(B-tree)是一种自平衡的搜索树数据结构,常用于在磁盘或其他存储介质上进行有效的索引操作。B-树具有以下特点:

  1. 多路搜索树:B-树是一种多路搜索树,每个节点可以包含多个键和对应的值。相比于二叉搜索树,B-树的节点可以拥有更多的子节点,从而减少树的高度,提高搜索效率。
  2. 自平衡性:通过保持特定的不变性,B-树能够自动调整树的结构以保持平衡状态,防止树的高度过高或过低。这样可以确保在最坏情况下,搜索、插入和删除操作的时间复杂度都为 O(log n)。
  3. 顺序访问:B-树的节点按照键的顺序存储,这使得范围查询变得更加高效。同时,B-树支持按照键的顺序进行遍历操作。
  4. 适用于大规模数据存储:由于B-树的节点可以包含多个键,它在处理大量数据时非常有效。相比于二叉搜索树,B-树在同样的高度下可以存储更多的键值对,从而减少了磁盘或存储介质的访问次数,提高了性能。
    B-树主要应用在数据库系统和文件系统等需要高效索引和存储大量数据的场景。它能够保持数据的有序性、提供快速的搜索和范围查询,并且适应动态数据的插入和删除操作。常见的变种有B+树和B*树,它们在B-树的基础上进行了优化和扩展,进一步提升了性能和效率。
  1. @Transaction原理

AOP

@Transactional实现原理三要素切面切点通知

  • InfrastructureAdvisorAutoProxyCreator后置处理器拦截所有Bean
  • 遍历所有类型为Advisor切面
  • 返回满足切点条件的切面列表
  • 选择代理方法
  • 生成代理
  • 调用通知invoke()方法
    • 开启事务
    • 调用其它通知invoke()方法,如果没有执行目标方法
    • 执行异常,回滚事务
    • 执行成功,提交事务
  • 执行目标方法

参考 juejin.cn/post/696838…

  1. 事务失效场景

1、数据库引擎不支持事务
这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。

2、没有被 Spring 管理
如果把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。

3、方法不是 public 的
@Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。

4、自身调用问题
就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效,这也是老生常谈的经典问题了。

5、数据源没有配置事务管理器

6、不支持事务
Propagation.NOT_SUPPORTED: 表示不以事务运行,当前若存在事务则挂起,都主动不支持以事务方式运行了,那事务生效也是白搭。

7、异常被吃了
try catch了

8、异常类型错误 因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:

@Transactional(rollbackFor = Exception.class)
  1. 分布式事务

2阶段提交
3阶段提交
TCC
seata方案
参考zhuanlan.zhihu.com/p/263555694…

  1. 分布式锁

  2. 同一个jvm部署多个实例,用@Transactional会有分布式事务问题么

在同一个 JVM 中部署多个实例,并且使用 Spring Framework 中的 @Transactional 进行事务管理时,通常不会涉及到分布式事务问题。因为这些实例共享同一个 JVM,它们可以直接共享相同的事务管理机制和资源。

在这种情况下,Spring 的事务管理器会在同一个 JVM 中对事务进行管理,保证事务的一致性、隔离性和持久性。@Transactional 注解注释的方法会在同一个事务上下文中运行,即使是在不同的实例中也会被视为同一个事务。

然而,需要注意的是,如果涉及到跨多个 JVM 或者跨多个数据库实例的分布式事务,那么就需要考虑分布式事务管理的相关问题。在这种情况下,可能需要使用分布式事务管理器(如 Atomikos、Bitronix 等)或者消息队列(如 RabbitMQ、Kafka 等)来实现跨系统或跨数据库的事务一致性。

总的来说,在同一个 JVM 中部署多个实例并使用 @Transactional 进行事务管理时,不会出现典型的分布式事务问题。但如果涉及到跨 JVM 或者跨数据库的分布式事务,则需要额外的处理和考虑分布式事务管理方面的内容。

  1. 分库分表逻辑

  2. 线程池核心参数有哪些

最大线程数、核心线程数、任务队列、拒绝策略、空闲线程等待时间