得物一面Java后端经验分享

面试时间:30分钟
整体面试问题难度一般
面试官人挺好的

和大家分享一下,面试大概过程:

  1. 首先进行自我介绍
  2. 然后开始提问问题
  3. 总结性的开放问题
  4. 反问面试官问题

大概问了以下几个问题,我也把问题的答案分享给大家:

1.说下对JVM内存模型的理解

JVM内存模型主要是指Java虚拟机在运行时所使用的内存结构。它主要包括堆、栈、方法区和程序计数器等部分。
堆是JVM中最大的一块内存区域,用于存储对象实例。一般通过new关键字创建的对象都存放在堆中,堆的大小可以通过启动参数进行调整。堆被所有线程共享,但是它的访问是线程不安全的,需要通过锁机制来保证线程安全。
栈用于存储方法调用和局部变量。每个线程在运行时都会有一个独立的栈,栈中的每个方法调用都会创建一个栈帧,栈帧包含了方法的参数、局部变量和返回值等信息。栈的大小是固定的,并且栈中的数据是线程私有的,不会被其他线程访问。
方法区用于存储类的信息和静态变量。它是所有线程共享的内存区域,存储了类的结构信息、常量池、静态变量和方法字节码等。方法区的大小也可以通过启动参数进行调整。
程序计数器是每个线程私有的,用于记录当前线程执行的字节码指令的地址。每个线程都有一个独立的程序计数器,用于控制线程的执行流程。
JVM内存模型的设计可以提供内存管理和线程安全的机制,同时也保证了Java程序的跨平台性。不同的内存区域有不同的作用和访问规则,合理地管理和利用这些内存区域可以提高Java程序的性能和稳定性。

2.说一下HashMap的Put方法

先说HashMap的Put方法的大体流程:

  1. 根据Key通过哈希算法与与运算得出数组下标

  2. 如果数组下标位置元素为空,则将key和value封装为Entry对象(JDK1.7中是Entry对象,JDK1.8中是Node对象)并放入该位置

  3. 如果数组下标位置元素不为空,则要分情况讨论

    1. 如果是JDK1.7,则先判断是否需要扩容,如果要扩容就进行扩容,如果不用扩容就生成Entry对象,并使用头插法添加到当前位置的链表中
    2. 如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红黑树Node,还是链表Node
      1. 如果是红黑树Node,则将key和value封装为一个红黑树节点并添加到红黑树中去,在这个过程中会判断红黑树中是否存在当前key,如果存在则更新value
      2. 如果此位置上的Node对象是链表节点,则将key和value封装为一个链表Node并通过尾插法插入到链表的最后位置去,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会判断是否存在当前key,如果存在则更新value,当遍历完链表后,将新链表Node插入到链表中,插入到链表后,会看当前链表的节点个数,如果大于等于8,那么则会将该链表转成红黑树
      3. 将key和value封装为Node插入到链表或红黑树中后,再判断是否需要进行扩容,如果需要就扩容,如果不需要就结束PUT方法

3.设计模式:单例模式

4.线程中execute方法

在Java中,线程池是一种管理和重用线程的机制,可以有效地管理资源和提高程序性能。

在线程池中,execute通常是用于提交一个任务(Runnable对象)以异步执行的方法。这个方法将任务交给线程池,由线程池中的某个线程执行。具体的实现可以使用Executor框架,比如ThreadPoolExecutor。

一个简单的例子可以是这样:

javaCopy codeimport java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个固定大小的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 提交任务给线程池执行
        executor.execute(new MyRunnable("Task 1"));
        executor.execute(new MyRunnable("Task 2"));
        executor.execute(new MyRunnable("Task 3"));

        // 关闭线程池
        executor.shutdown();
    }

    static class MyRunnable implements Runnable {
        private final String taskName;

        public MyRunnable(String taskName) {
            this.taskName = taskName;
        }

        @Override
        public void run() {
            System.out.println("Executing task: " + taskName + " in thread: " + Thread.currentThread().getName());
        }
    }
}

在这个例子中,我们创建了一个固定大小为5的线程池,并提交了三个任务给线程池执行。execute方法负责将任务交给线程池进行异步执行。

5.避免索引失效

  • 选择合适的索引列:选择经常用于查询和条件筛选的列作为索引列,确保索引具有高选择性。
  • 考虑多列索引:对于经常一起使用的多个列,创建联合索引,提高多列条件查询的效率。
  • 确保索引区分度高:选择具有较多不同值的索引列,以减小索引范围,提高查询速度。
  • 避免过多索引:根据业务需求,选择性地创建必要的索引,避免过多索引增加维护成本和降低更新性能。

6.MySQL 事务隔离级别

MySQL提供了四种事务隔离级别,可以通过设置来控制事务的并发行为和数据一致性。

  1. 读未提交(Read Uncommitted):最低隔离级别,一个事务可以读取到其他事务尚未提交的数据,可能导致脏读、不可重复读和幻读的问题。
  2. 读已提交(Read Committed):一个事务只能读取到其他事务已经提交的数据,避免了脏读的问题,但仍可能导致不可重复读和幻读的问题。
  3. 可重复读(Repeatable Read):默认的隔离级别,确保在同一个事务中多次读取同样的数据时,会得到一致的结果。其他事务对数据的修改不可见,避免了脏读和不可重复读的问题,但仍可能导致幻读的问题。
  4. 串行化(Serializable):最高隔离级别,将事务串行执行,确保数据的一致性。避免了所有并发问题,但牺牲了并发性能。

7.什么是数据库事务

数据库事务是指作为单个逻辑工作单元执行的一组数据库操作,这些操作要么全部成功完成,要么全部失败回滚。事务以保证数据的一致性和完整性为目标。

事务具有以下几个特性,通常缩写为ACID:

  • 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部回滚,不会出现部分操作成功或部分操作失败的情况。
  • 一致性(Consistency):事务在执行前后数据库的数据状态必须保持一致。如果一个事务违反了数据库的完整性约束,那么事务将回滚到执行之前的状态,保证数据的正确性。
  • 隔离性(Isolation):事务的执行是相互隔离的,一个事务的操作在提交之前对其他事务是不可见的。隔离级别可以控制事务之间的可见性和并发性。
  • 持久性(Durability):一旦事务提交,其所做的修改会永久保存在数据库中,即使在系统故障或重启后,也能保证数据的持久性。

8.什么是 Spring 的 IOC

Spring的IOC(全称 Inversion of Control,控制反转),它是Spring框架的*核心概念之一。它主要包括以下关键点:

  1. IOC的目的是将应用程序的控制权从应用程序代码中转移到框架或容器中。
  2. IOC容器管理bean的生命周期和依赖注入。
  3. 开发者只需配置bean的依赖关系,IOC容器会根据配置创建对象并进行注入。
  4. 通过IOC实现松耦合、提高代码可维护性****和可测试性。
  5. Spring的IOC提供了一种灵活、易于管理和维护的组件****组织方式。

9.什么是 Spring 的 AOP

Spring的AOP(也称为面向切面编程)是Spring框架的另一个核心概念,主要包括以下关键点:

  1. AOP用于将横切关注点(如日志、事务处理)从应用程序的核心业务逻辑中分离出来。
  2. AOP通过切面(Aspect)实现对横切关注点的模块化组织。
  3. 切面可以定义在哪些连接点(Join Point)上执行哪些通知(Advice),并可以使用切点(Pointcut)指定连接点。
  4. Spring AOP支持多种类型的通知,包括前置通知、后置通知、环绕通知等。
  5. AOP能够提高代码的重用性,降低系统耦合度,使得系统更易于维护和扩展。

10.选择自己的项目介绍一下

11.自己在学习中的总结的一些具有价值的经验,结合自身经历

  • 23
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值