面向问题:简历-自我介绍-面试

自我介绍

  • 面试官,您好,我叫xxx,目前就读于xxx计算机科学与技术学院,现在已经研二阶段。
  • 我比较熟悉java虚拟机反射机制以及线程死锁等问题。
  • 此外,我也了解过解决IPv4枯竭问题的NAT技术,自己也曾扩展过家里使用的无线路由。
  • 对于后端开发,我曾借助SpringBoot+Mybatis框架简单的实现过一些接口,因此熟悉一些框架常用的注解,针对业务逻辑处理,目前记忆比较深刻的是使用Mybatisplus实现分页查询功能。
  • 测试方面,我比较熟悉测试用例的设计,postman接口关联,以及JSON/CSV文件进行参数化的方式。

面试

java虚拟机反射机制?

  • (1)反射的定义
    • Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
  • (2)反射的理解
    • Java的反射机制可以理解为,虚拟机在运行期间可以将运行在自己内存中的的类反编译为.class文件,然后通过类加载器加载该字节码文件,这样我们就得到在运行期间一个完整的类。有什么用呢?这就不得不提到多态实现的三种形式。
      java中实现多态的形式主要有三种:向上转型,抽象类实现,接口类实现。我们是不可以直接实例化接口和抽象类,但是这类对象我们可以通过其实现类进行实例化。因此这三种方式实例化的对象数据类型都需要在运行时才能够确定,我们想要用这类对象的内部方法,那必须借助反射机制,反射机制诞生之前,我们不能直接获取这类对象的内部信息。但是反射机制诞生之后,我们可以在运行时,通过反射,我们可以实时动态的获取这些对象的具体的数据类型内部信息。
  • (3)反射的应用
    • 运行时动态获取任意一个类或任意一个对象的内部信息。(包括编译阶段不能确定数据类型的对象和类)
    • 实现解耦操作,用于框架的实现。

线程死锁等问题?

什么是死锁?

  • 多个进程/线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于进程/线程被无限期地阻塞,因此程序不可能正常终止。

死锁的四个必要条件?

  • 互斥条件
  • 不可剥夺条件
  • 持有并请求条件
  • 循环等待条件

解决死锁的方法?

  • 预防,避免,检测,解除
  • 预防:
    • 静态分配策略:破坏请求并持有条件:一次性申请完所有资源。
    • 层次分配策略:破坏循环等待条件:一个进程得到某一次的一个资源后,它只能再申请较高一层的资源;当一个进程要释放某层的一个资源时,必须先释放所占用的较高层的资源。
  • 避免:
    • 银行家算法 通过先 试探 分配给该进程资源,然后通过 安全性算法 判断分配后系统是否处于安全状态。
  • 检测:
    • 如果进程-资源分配图中无环路,则此时系统没有发生死锁
    • 如果进程-资源分配图中有环路,且每个资源类仅有一个资源,则系统中已经发生了死锁。
    • 如果进程-资源分配图中有环路,且涉及到的资源类有多个资源,此时系统未必会发生死锁。如果能在进程-资源分配图中找出一个 既不阻塞又非独立的进程 ,该进程能够在有限的时间内归还占有的资源,则不会发生死锁,否则会发生死锁。
  • 解除:
    • 立即结束所有进程的执行,重新启动操作系统
    • 撤销涉及死锁的所有进程,解除死锁后继续运行
    • 逐个撤销涉及死锁的进程,回收其资源直至死锁解除
    • 抢占资源:把夺得的资源再分配给涉及死锁的进程直至死锁解除。

了解过解决IPv4枯竭问题的NAT技术,自己也曾扩展过家里使用的无线路由。

端口

端口是TCP/IP协议族中,应用层进程与传输层协议实体间的通信接口。

TCP/IP协议采用了全局分配(静态分配端口)和本地分配(动态分配端口)相结合的分配方法 。

保留端口的范围是0—1023,又称为众所周知的端口或熟知端口(Well-Known Port) 。

其余的端口号,1024-65535,称为自由端口号,采用本地分配,又称为动态分配的方法。

NAT技术与内网穿透

服务器一般使用的是公网 ip ,因此客户端可以通过NAT技术,将局域网内的ip地址层层转化为公网IP。

但是如果服务器是局域网IP,客户端就无法找到,因为NAT技术只能将ip地址层层转化为公网ip。

因此内网穿透诞生,将局域网ip与公网ip进行映射,因此客户端就可以同过NAT技术将ip地址层层转化为公网ip。

内网穿透方式

  • 第一种是直接拥有公网的ip并直接进行映射;
  • 第二种是有公网服务器的,采用frp等方式来进行穿透(这种方式不需要有公网的ip,但是需要一个服务器);

(1)第一种方式存在两种形式:

​ 第一种:光猫不能进行端口映射,那么将光猫设置为桥接模式,主机连接光猫,直接拨号上网,使用的ip直接为外网ip。

​ 第二种:光猫可以进行端口映射,那么配置光猫进行接口映射,那么间接使用外网IP。

(2)第二种方式属于直接使用远程服务器进行映射。(和翻墙一个道理)

熟悉一些框架常用的注解?

  • 引导类:
    • @SpringBootApplication
      • @SpringBootConfiguration
      • @EnableAutoConfiguration
      • @ComponentScan
  • 表现层:
    • @RestController
      • @ResponseBody
      • @Controller
    • @RequestMapping
      • @PostMapping
      • @PutMapping
      • @PostMapping(“/status/0”)
      • @DeleteMapping
    • @Autowired
  • 业务层:
    • @Service
  • 数据层;
    • @Mapper
  • 全局异常处理;
    • @ControllerAdvice(annotations = {RestController.class, Controller.class})//表示这是一个aop通知类,做功能增强。
    • @ResponseBody//类中方法返回值将以JSON格式返回给前端。

Mybatisplus实现分页查询

		// 设置分页拦截器作为Spring管理的bean
		public class MybatisPlusConfig {
		    @Bean
		    public MybatisPlusInterceptor mybatisPlusInterceptor(){
		        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
		        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
		        return mybatisPlusInterceptor;
		    }

		 //创建分页构造器,使用mybatisplus提供的实体。
        Page pageInfo = new Page(page,pageSize);
        //创建条件构造器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
        //添加过滤条件,使用带bool类型的lambda表达式。
        queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
        //添加排序条件
        queryWrapper.orderByDesc(Employee::getUpdate_time);
        //执行查询
        employeeService.page(pageInfo,queryWrapper);
		return R.success(pageInfo);

Postman实现接口关联

  • 步骤
    • 通过正则表达式或则JSON提取器取值的方式,提取需要的参数。
    • 将参数设置为全局变量或则环境变量。
    • 在之后接口中,通过{{全局变量/环境变量}}代替要替换的参数值。
- JSON提取器方式
var jsonData = JSON.parse(responseBody);
pm.environment.set("token",jsonData.data.accessToken);
- 正则表达式
var jsonData = reponseBody.match(new RegExp('"accessToken":(*.?)'));
pm.globals.set("token",jsonData[1])

Postman实现参数化

  • 内置函数。
    • {{$randomint}}:添加0-1000之间的随机整数。
    • {{$guid}}:添加一个V4风格的GUID
    • {{$timestamp}}: 添加当前的时间戳,精确到秒
    • {{$randomFullName}}:随机全名(名字 姓氏)
    • {{ $randomBoolean}}: 随机布尔值 (true/false)
  • Pre-request-Script页签中使用代码实现
    • 前置脚本设置自定义变量。
  • 全局变量/环境变量/Collection变量
    • 后置脚本设置提取变量。
  • CSV/JSON文件。
    • 关键点1:{{变量名}}:变量名同CSV第一行设置的变量名和JSON文件设置变量名。
    • 关键点2:通过Run Configuration->Data导入文件->设置Iterations。

Redis/Collection/Linux

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值