马力回忆笔试题

1、Spring 常用的注解(至少写两个)

  1. @Autowired:用于自动注入依赖的bean。Spring会自动寻找并注入匹配类型的bean,如果存在多个相同类型的bean,则可以通过@Qualifier注解来指定注入哪一个。
  2. @Service:用于标注服务层的组件。这个注解通常用于业务逻辑层,表明该类是一个服务组件,Spring容器会将其自动注册为一个bean。

除此之外,还有许多其他注解,例如:

  • @Component:用于标注一个类为Spring容器的组件,通常用于非服务层的单例对象。
  • @Repository:用于标注持久层组件,即DAO组件。
  • @Controller:用于标注控制层组件,即Web应用的控制器。
  • @RequestMapping:用于将HTTP请求映射到特定的处理方法上。
  • @ResponseBody:用于将返回值作为HTTP响应的正文返回,常用于RESTful Web服务。
  • @PathVariable:用于将URL中的占位符参数绑定到控制器处理方法的参数上。
  • @RequestParam:用于将请求参数区的数据绑定到控制器处理方法的参数上。

@Configuration:配置类

2、面向对象程序设计的三个特征,封装、继承多态

3、多线程的实现方式有几种?

继承Thread类 通过创建一个新的类继承java.lang.Thread类,并重写其run方法,然后创建该类的实例并调用其start方法来启动新线程。

实现Runnable接口 创建一个类实现java.lang.Runnable接口,并实现其run方法。然后可以将这个类的实例传递给Thread类的构造器,并启动线程。

实现Callable接口Runnable类似,但Callable允许任务返回值,并且可以抛出异常。需要结合FutureTask使用,并将FutureTask传递给Thread的构造器。

使用Executor框架 Java 5引入了基于固定池大小的线程池、可缓存的线程池、单线程执行器和程序化地创建线程的线程池的java.util.concurrent包。通过ExecutorService接口来管理线程池和任务的执行。

4、 子类对父类继承来单属性重新定义为 重写,子类对自身拥有的同名方法的重写定义为 重载

5、ISO七层协议模型架构、各层的解析及其协议

名称

传输协议

传输单元

主要功能设备/接口

物理层

IEEE 802.1A、IEEE 802.2

bit-flow 比特流

光纤、双绞线、中继器和集线器 & RJ-45(网线接口)

数据链路层

ARP、MAC、 FDDI、Ethernet、Arpanet、PPP、PDN

frame 帧

网桥、二层交换机

网络层

IP、ICMP、ARP、RARP

数据包(packet)

路由器、三层交换机

传输层

TCP、UDP

Segment/Datagram

四层交换机

会话层

SMTP、DNS

报文

QoS

表示层

Telnet、SNMP

报文

应用层

FTP、TFTP、Telnet、HTTP、DNS

报文

6、linux的五个常用指令

  1. ls:列出当前目录中的文件和子目录
  2. pwd:显示当前工作目录的路径
  3. cd:切换工作目录
  4. mkdir:创建新目录
  5. rmdir:删除空目录
  6. rm:删除文件或目录
  7. cp:复制文件或目录
  8. mv:移动或重命名文件或目录
  9. touch:创建空文件或更新文件的时间戳
  10. cat:连接和显示文件内容

7.Java有23种常用设计模式,创建型模式(5种),结构型模式(7种),行为型模式(11种),请各列举一种并 简要 说明其核心思想。

创建型模式(Creational Patterns)(5 种)

  1. 单例模式(Singleton)
    • 核心思想:确保一个类只有一个实例,并提供一个全局访问点。
  1. 工厂方法模式(Factory Method)
    • 核心思想:定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  1. 抽象工厂模式(Abstract Factory)
    • 核心思想:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
  1. 建造者模式(Builder)
    • 核心思想:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  1. 原型模式(Prototype)
    • 核心思想:通过复制现有的实例来创建新的实例,而不是通过新建。

结构型模式(Structural Patterns)(7 种)

  1. 适配器模式(Adapter)
    • 核心思想:允许不兼容的接口之间的通信,不需要修改原有代码。
  1. 桥接模式(Bridge)
    • 核心思想:将抽象与实现分离,使它们可以独立变化。
  1. 组合模式(Composite)
    • 核心思想:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户对单个对象和组合对象的使用具有一致性。
  1. 装饰器模式(Decorator)
    • 核心思想:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更灵活。
  1. 外观模式(Facade)
    • 核心思想:为子系统中的一组接口提供一个统一的高层接口,使子系统更容易使用。
  1. 享元模式(Flyweight)
    • 核心思想:通过共享来有效地支持大量细粒度的对象。
  1. 代理模式(Proxy)
    • 核心思想:为其他对象提供一个代理以控制对这个对象的访问。

行为型模式(Behavioral Patterns)(11 种)

  1. 责任链模式(Chain of Responsibility)
    • 核心思想:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  1. 命令模式(Command)
    • 核心思想:将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
  1. 解释器模式(Interpreter)
    • 核心思想:定义如何评估语言的文法,文法由一个节点表示,该节点是解释器的组成部分。
  1. 迭代器模式(Iterator)
    • 核心思想:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  1. 中介者模式(Mediator)
    • 核心思想:用一个中介对象来封装一系列的对象交互,使各对象不需要显示地相互引用。
  1. 备忘录模式(Memento)
    • 核心思想:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  1. 观察者模式(Observer)
    • 核心思想:定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。
  1. 状态模式(State)
    • 核心思想:允许一个对象在其内部状态改变时改变它的行为,看起来好像修改了它的类。
  1. 策略模式(Strategy)
    • 核心思想:定义一系列算法,将每个算法封装起来,并使它们可以互换使用。
  1. 模板方法模式(Template Method)
    • 核心思想:在方法中定义一个算法的框架,而将一些步骤延迟到子类中实现。
  1. 访问者模式(Visitor)
    • 核心思想:为一个对象结构(如组合结构)增加新能力,而不需要修改现有结构。

 

8、 写出SQL语句中的十个关键字,并说明其作用

  1. SELECT
    • 作用:用于从数据库中查询数据。可以指定要查询的列名,使用星号(*)代表所有列。
  1. FROM
    • 作用:指定SELECT语句要从哪个表中检索数据。
  1. WHERE
    • 作用:对从表中选取的数据进行过滤。只有符合指定条件的记录才会被选取。
  1. INSERT INTO
    • 作用:用于向数据库表中插入新的数据行。
  1. UPDATE
    • 作用:用于修改数据库表中的现有数据。
  1. DELETE
    • 作用:用于从数据库表中删除数据。
  1. JOIN
    • 作用:用于结合多个表中的行,基于共同的列值。JOIN可以是内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)或全连接(FULL JOIN)。
  1. GROUP BY
    • 作用:用于将结果集的行分组,每组行都包含相同的列值,通常与聚合函数(如COUNT、SUM、AVG等)一起使用。
  1. ORDER BY
    • 作用:用于对结果集进行排序。可以指定一个或多个列,并且可以指定升序(ASC)或降序(DESC)。
  1. HAVING
    • 作用:与GROUP BY一起使用,用于对分组后的结果进行过滤。HAVING通常与聚合函数一起使用。

9、 启动一个线程调用哪个方法,同步有几种实现方法,都是什么?

启动一个线程通常有两种方式:

继承Thread类:创建一个类继承自Thread类,并重写其run方法,然后创建该类的实例并调用其start方法来启动线程。

实现Runnable接口:创建一个类实现Runnable接口,并实现其run方法。然后创建该类的实例,并将其作为参数传递给Thread类的构造器,最后调用新线程实例的start方法。

实现线程同步主要有以下几种方法:

  1. synchronized关键字
    • 可以修饰方法或代码块。当一个线程访问某个对象的synchronized方法或者synchronized代码块时,它就获得了对象的锁,其他线程不能同时访问这个对象的其他synchronized方法或代码块。
  1. Lock接口
    • java.util.concurrent.locks.Lock是一个接口,提供了与synchronized关键字类似的同步功能,但提供了更灵活的锁定机制。常用的实现类有ReentrantLock
  1. volatile关键字
    • 用于修饰变量,确保变量的值在多线程间立即可见,即一个线程修改了变量的值,新值对其他线程来说是立即可见的。
  1. 原子类
    • java.util.concurrent.atomic包下提供了一组原子类(如AtomicInteger),它们利用CAS(Compare-And-Swap)操作来保证操作的原子性,适用于不需要锁的情况。
  1. CountDownLatch、CyclicBarrier、Semaphore等并发工具类
    • 这些类提供了更高级的线程间协调机制,可以用来控制线程的执行顺序和同步。
  1. volatile字段的long和double读写操作
    • 对于volatile修饰的longdouble类型的字段,其读写操作也是原子的。
  1. 使用ThreadLocal
    • ThreadLocal提供了线程局部变量,每个使用该变量的线程都有其自己的变量副本,因此不存在多线程间的可见性问题。

10、从世界经济的发展历程来看,如果一国或地区的经济保持着稳定的增长速度,大多数商品和服务的价格必然随之上涨,只要这种涨幅始终在一个较小的区间内就不会对经济造成负面影响,判断以下逻辑哪些是正确的。

  • 如果经济发展水平下降,该国的大多数商品价格也会降低。
  • 如果大多数商品价格不上涨,说明该国经济没有保持稳定增长。
  • 如果大多数商品价格涨幅过大,对该国经济必然有负面影响。
  • 如果大多数商品价格上涨,说明该国经济正在稳定增长。

11、一个 3 升的烧杯、一个 5 升的烧杯和一个装满水的水池,烧煤没有刻度和其他工具,那么如何准确的装出 4 升水?

  1. 首先,将5升烧杯装满水。
  2. 然后,使用5升烧杯中的水将3升烧杯装满。这时,5升烧杯里剩下2升水。
  3. 倒空3升烧杯,将里面的水倒掉。
  4. 将5升烧杯中剩余的2升水倒入3升烧杯中。
  5. 再次将5升烧杯装满水。
  6. 最后,使用5升烧杯中的水继续填满3升烧杯,直到3升烧杯装满。由于3升烧杯已经有2升水,所以只需要再倒入1升水即可装满。这时,5升烧杯里剩下的水就是4升。

现在,5升烧杯中就准确地装有4升水了。

12、小红、小芳、小惠三个同学帮助生病的小明补好了笔记,当小明问谁干的时,小红说:是小芳干的。小芳说:不是我干的。小惠说:也不是我干的。如果知道三人中有且仅有一人说真话,那到底是谁做的好事?

请输入答案

  1. 假设小红说的是真话
    • 小红说:“是小芳干的。”
    • 如果小红说的是真话,那么小芳补了笔记。
    • 但是,小芳说:“不是我干的。”如果小芳说的是假话,那么小芳补了笔记,这与我们的假设一致。
    • 小惠说:“也不是我干的。”如果小惠说的是假话,那么小惠补了笔记,这与我们的假设矛盾,因为只有一个人补了笔记。
    • 因此,小红不可能是说真话的人。
  1. 假设小芳说的是真话
    • 小芳说:“不是我干的。”
    • 如果小芳说的是真话,那么小芳没有补笔记。
    • 小红说:“是小芳干的。”如果小红说的是假话,那么小芳没有补笔记,这与我们的假设一致。
    • 小惠说:“也不是我干的。”如果小惠说的是假话,那么小惠补了笔记,这与我们的假设一致。
    • 因此,小芳可能是说真话的人,小惠补了笔记。
  1. 假设小惠说的是真话
    • 小惠说:“也不是我干的。”
    • 如果小惠说的是真话,那么小惠没有补笔记。
    • 小红说:“是小芳干的。”如果小红说的是假话,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值