跳至主要內容
java集合

1. 集合继承结构

  • Collection,主要由 List、Set、Queue 组成
    • List:存储的元素有序,可重复。动态数组的 ArrayList 和封装了链表的 LinkedList;
    • Set:存储的元素无序,不可重复。HashSet 和 TreeSet;
    • Queue:队列。双端队列 ArrayDeque,以及优先级队列 PriorityQueue。
  • Map,键值对集合。HashMap。键不能重复,每个键只能对应一个值。HashMap、LinkedHashMap、TreeMap

HeChuangJun大约 26 分钟面试java
jvm
  • JVM,Java虚拟机,Java实现跨平台的基石。Java 程序运行的时候,编译器会将 Java 源代码(.java)编译成平台无关的 Java 字节码文件(.class),接下来对应平台的 JVM 会对字节码文件进行解释,翻译成对应平台的机器指令并运行。

2. Jvm主要组成部分及其作用?

  • 类加载器(ClassLoader):负责从文件系统、网络或其他来源加载Class文件,将Class文件中的二进制数据读入到内存中

  • 运行时数据区(Runtime Data Area)JVM 在执行 Java 程序时,需要在内存中分配空间来处理各种数据,这些内存区域主要包括方法区、堆、栈、程序计数器和本地方法栈。

  • 执行引擎(Execution Engine)负责执行class文件中包含的字节码指令,包括一个虚拟处理器,还包括即时编译器(JIT Compiler)和垃圾回收器(Garbage Collector)。

  • 本地库接口(Native Interface)调用C或C++实现的本地方法的代码返回结果

  • 各组件的作用:首先通过类加载器(ClassLoader)把Java代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,由特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由CPU执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能
    jvmstructure.jpg


HeChuangJun大约 49 分钟面试java
linux

1. linux概述

  • 基于Unix的开源免费的操作系统,系统的稳定性和安全性成为程序代码运行的最佳系统环境
  • Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的
  • Linux系统的应用非常广泛,Android程序最底层就是运行在linux系统上的
linux.png
linux.png

HeChuangJun大约 7 分钟面试java
数学

排列

  • 从n个不同元素中取出(m<=n)个元素所有排列的个数,按照一定顺序排列成一列,叫做从n个不同元素中取出m(m<=n)个元素的排列数(number of arrangement),用符号表示。
  • 根据分布乘法计数原理可得排列数公式
  • 证明:求排列数可以按依次填m个空位来考虑:假定有排好顺序的m个空位,从n个不同元素a1,a2,a3,…,an中任意取m个去填空,一个空位填1个元素,每一种填法就对应1个排列,因此,所有不同填法的种数就是排列数。填空可分为m个步骤:
    • 第1步,第1位可以从n个元素中任选一个填上,共有n种填法;
    • 第2步,第2位只能从余下的n-1个元素中任选一个填上,共有n-1种填法;
    • 第3步,第3位只能从余下的n-2个元素中任选一个填上,共有n-2种填法;
    • ……
    • 第m步,当前面的m-1个空位都填上后,第m位只能从余下的n-(m-1)个元素中任选一个填上,共有n-m+1种填法。
    • 根据分步计数原理,全部填满m个空位共有n(n-1)(n-2)…(n-m+1)种填法

HeChuangJun大约 5 分钟面试java
MyBatis
  • Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
  • MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • 缺点:sql语句编写工作量大,要求高,据库移植性差

2. JDBC

  • JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API接口
  • 可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
  • 而JDBC驱动是数据库厂商对接口的实现,用来连接自己的数据库

HeChuangJun大约 9 分钟面试java
mysql
  • 开源的关系型数据库管理系统,隶属Oracle

2. MySQL 的内连接、左连接、右连接、交叉连接、笛卡尔积有什么区别?

  • inner join内连接,取得两张表中满足连接条件的记录。只有当两个表中都有匹配的记录时,这些记录才会出现在查询结果中。如果某一方没有匹配的记录,则该记录不会出现在结果集中。相当于两个数据集的交集。
  • 外连接(outer join):不只取得两张表中满足连接条件的记录,还包括某张表(或两张表)中不满足匹配关系的记录。分为左链接和右连接
  • left join返回左表(FROM子句中指定表)所有记录,以及右表满足连接条件的记录。如果右表中没有匹配的记录,则结果中右表的部分会以NULL填充
  • right join返回右表(FROM子句中指定表)所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配的记录,则结果中左表的部分会以NULL填充
  • 交叉连接(crossjoin):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在SQL中的实现,如果A表有m行,B表有n行,那么A和B交叉连接的结果就有m*n行。
  • 笛卡尔积:例如集合A={a,b},集合B={0,1,2},那么A✖️B={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}。

HeChuangJun大约 63 分钟面试java
问题解决

问题排查

  • 找出那个进程出问题,执行top列出系统各个进程的资源占用情况。
top.png
top.png
  • 找到CPU或者内存高的进程,执行top -Hp 【pid】列出对应进程里面的线程占用资源情况

HeChuangJun大约 23 分钟面试java
redis
  • Redis:Remote Dictionary Service 基于键值对(key-value)的 NoSQL 数据库。
  • Redis 中的 value 支持 string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数估算)、GEO(地理信息定位)等多种数据结构。
  • 因为 Redis 的所有数据都存放在内存当中,所以它的读写性能非常出色。
  • Redis 还可以将内存数据持久化到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据并不会“丢失”。
  • Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能,是互联网技术领域中使用最广泛的缓存中间件。

HeChuangJun大约 105 分钟面试java
场景设计

1. 支付系统设计

1.1. 支付系统架构图

payprocess.png
payprocess.png

1.2. 商户系统设计

  • 下单时需要同时插入需要做的记录和状态,比如报名活动下单时是delete=1,回调成功则变成delete=1,而不是成功回调才插入
  • 下单时提交额外参数最好是id,回调的时候根据id修改订单和记录的状态delete=0
  • 支付后最先判断订单是否已经处理,保持幂等性
  • 收入订单和支出订单前缀不要一样
  • 涉及支付回调或者阻塞都是先设置status为0的状态的记录并提交事务,然后调用他们的接口回填status的状态

HeChuangJun大约 44 分钟面试java
spring
  • Spring是一个轻量级、非入侵式的控制反转(IoC)和面向切面(AOP)的框架。
  • IoC和DI的支持:管理对象生命周期和依赖关系
  • AOP编程的支持:面向切面编程可以实现对程序进行权限拦截、运行监控等切面功能。
  • 声明式事务的支持:支持通过配置就来完成对事务的管理,而不需要通过硬编码的方式。
  • 快捷测试的支持:支持Junit注解测试Spring程序。
  • 快速集成功能:方便集成各种优秀框架
  • 复杂API模板封装:对JDBC、JavaMail等提供了模板化的封装,降低应用难度

HeChuangJun大约 22 分钟面试java