1、Spring 常用的注解(至少写两个)
@Autowired
:用于自动注入依赖的bean。Spring会自动寻找并注入匹配类型的bean,如果存在多个相同类型的bean,则可以通过@Qualifier
注解来指定注入哪一个。@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的五个常用指令
- ls:列出当前目录中的文件和子目录
- pwd:显示当前工作目录的路径
- cd:切换工作目录
- mkdir:创建新目录
- rmdir:删除空目录
- rm:删除文件或目录
- cp:复制文件或目录
- mv:移动或重命名文件或目录
- touch:创建空文件或更新文件的时间戳
- cat:连接和显示文件内容
7.Java有23种常用设计模式,创建型模式(5种),结构型模式(7种),行为型模式(11种),请各列举一种并 简要 说明其核心思想。
创建型模式(Creational Patterns)(5 种)
- 单例模式(Singleton)
-
- 核心思想:确保一个类只有一个实例,并提供一个全局访问点。
- 工厂方法模式(Factory Method)
-
- 核心思想:定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
- 抽象工厂模式(Abstract Factory)
-
- 核心思想:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 建造者模式(Builder)
-
- 核心思想:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 原型模式(Prototype)
-
- 核心思想:通过复制现有的实例来创建新的实例,而不是通过新建。
结构型模式(Structural Patterns)(7 种)
- 适配器模式(Adapter)
-
- 核心思想:允许不兼容的接口之间的通信,不需要修改原有代码。
- 桥接模式(Bridge)
-
- 核心思想:将抽象与实现分离,使它们可以独立变化。
- 组合模式(Composite)
-
- 核心思想:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户对单个对象和组合对象的使用具有一致性。
- 装饰器模式(Decorator)
-
- 核心思想:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更灵活。
- 外观模式(Facade)
-
- 核心思想:为子系统中的一组接口提供一个统一的高层接口,使子系统更容易使用。
- 享元模式(Flyweight)
-
- 核心思想:通过共享来有效地支持大量细粒度的对象。
- 代理模式(Proxy)
-
- 核心思想:为其他对象提供一个代理以控制对这个对象的访问。
行为型模式(Behavioral Patterns)(11 种)
- 责任链模式(Chain of Responsibility)
-
- 核心思想:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
- 命令模式(Command)
-
- 核心思想:将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
- 解释器模式(Interpreter)
-
- 核心思想:定义如何评估语言的文法,文法由一个节点表示,该节点是解释器的组成部分。
- 迭代器模式(Iterator)
-
- 核心思想:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
- 中介者模式(Mediator)
-
- 核心思想:用一个中介对象来封装一系列的对象交互,使各对象不需要显示地相互引用。
- 备忘录模式(Memento)
-
- 核心思想:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 观察者模式(Observer)
-
- 核心思想:定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。
- 状态模式(State)
-
- 核心思想:允许一个对象在其内部状态改变时改变它的行为,看起来好像修改了它的类。
- 策略模式(Strategy)
-
- 核心思想:定义一系列算法,将每个算法封装起来,并使它们可以互换使用。
- 模板方法模式(Template Method)
-
- 核心思想:在方法中定义一个算法的框架,而将一些步骤延迟到子类中实现。
- 访问者模式(Visitor)
-
- 核心思想:为一个对象结构(如组合结构)增加新能力,而不需要修改现有结构。
8、 写出SQL语句中的十个关键字,并说明其作用
- SELECT:
-
- 作用:用于从数据库中查询数据。可以指定要查询的列名,使用星号(*)代表所有列。
- FROM:
-
- 作用:指定SELECT语句要从哪个表中检索数据。
- WHERE:
-
- 作用:对从表中选取的数据进行过滤。只有符合指定条件的记录才会被选取。
- INSERT INTO:
-
- 作用:用于向数据库表中插入新的数据行。
- UPDATE:
-
- 作用:用于修改数据库表中的现有数据。
- DELETE:
-
- 作用:用于从数据库表中删除数据。
- JOIN:
-
- 作用:用于结合多个表中的行,基于共同的列值。JOIN可以是内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)或全连接(FULL JOIN)。
- GROUP BY:
-
- 作用:用于将结果集的行分组,每组行都包含相同的列值,通常与聚合函数(如COUNT、SUM、AVG等)一起使用。
- ORDER BY:
-
- 作用:用于对结果集进行排序。可以指定一个或多个列,并且可以指定升序(ASC)或降序(DESC)。
- HAVING:
-
- 作用:与GROUP BY一起使用,用于对分组后的结果进行过滤。HAVING通常与聚合函数一起使用。
9、 启动一个线程调用哪个方法,同步有几种实现方法,都是什么?
启动一个线程通常有两种方式:
继承Thread类:创建一个类继承自Thread
类,并重写其run
方法,然后创建该类的实例并调用其start
方法来启动线程。
实现Runnable接口:创建一个类实现Runnable
接口,并实现其run
方法。然后创建该类的实例,并将其作为参数传递给Thread
类的构造器,最后调用新线程实例的start
方法。
实现线程同步主要有以下几种方法:
- synchronized关键字:
-
- 可以修饰方法或代码块。当一个线程访问某个对象的
synchronized
方法或者synchronized
代码块时,它就获得了对象的锁,其他线程不能同时访问这个对象的其他synchronized
方法或代码块。
- 可以修饰方法或代码块。当一个线程访问某个对象的
- Lock接口:
-
java.util.concurrent.locks.Lock
是一个接口,提供了与synchronized
关键字类似的同步功能,但提供了更灵活的锁定机制。常用的实现类有ReentrantLock
。
- volatile关键字:
-
- 用于修饰变量,确保变量的值在多线程间立即可见,即一个线程修改了变量的值,新值对其他线程来说是立即可见的。
- 原子类:
-
java.util.concurrent.atomic
包下提供了一组原子类(如AtomicInteger
),它们利用CAS(Compare-And-Swap)操作来保证操作的原子性,适用于不需要锁的情况。
- CountDownLatch、CyclicBarrier、Semaphore等并发工具类:
-
- 这些类提供了更高级的线程间协调机制,可以用来控制线程的执行顺序和同步。
- volatile字段的long和double读写操作:
-
- 对于
volatile
修饰的long
和double
类型的字段,其读写操作也是原子的。
- 对于
- 使用ThreadLocal:
-
ThreadLocal
提供了线程局部变量,每个使用该变量的线程都有其自己的变量副本,因此不存在多线程间的可见性问题。
10、从世界经济的发展历程来看,如果一国或地区的经济保持着稳定的增长速度,大多数商品和服务的价格必然随之上涨,只要这种涨幅始终在一个较小的区间内就不会对经济造成负面影响,判断以下逻辑哪些是正确的。
- 如果经济发展水平下降,该国的大多数商品价格也会降低。
- 如果大多数商品价格不上涨,说明该国经济没有保持稳定增长。
- 如果大多数商品价格涨幅过大,对该国经济必然有负面影响。
- 如果大多数商品价格上涨,说明该国经济正在稳定增长。
11、一个 3 升的烧杯、一个 5 升的烧杯和一个装满水的水池,烧煤没有刻度和其他工具,那么如何准确的装出 4 升水?
- 首先,将5升烧杯装满水。
- 然后,使用5升烧杯中的水将3升烧杯装满。这时,5升烧杯里剩下2升水。
- 倒空3升烧杯,将里面的水倒掉。
- 将5升烧杯中剩余的2升水倒入3升烧杯中。
- 再次将5升烧杯装满水。
- 最后,使用5升烧杯中的水继续填满3升烧杯,直到3升烧杯装满。由于3升烧杯已经有2升水,所以只需要再倒入1升水即可装满。这时,5升烧杯里剩下的水就是4升。
现在,5升烧杯中就准确地装有4升水了。
12、小红、小芳、小惠三个同学帮助生病的小明补好了笔记,当小明问谁干的时,小红说:是小芳干的。小芳说:不是我干的。小惠说:也不是我干的。如果知道三人中有且仅有一人说真话,那到底是谁做的好事?
请输入答案
- 假设小红说的是真话:
-
- 小红说:“是小芳干的。”
- 如果小红说的是真话,那么小芳补了笔记。
- 但是,小芳说:“不是我干的。”如果小芳说的是假话,那么小芳补了笔记,这与我们的假设一致。
- 小惠说:“也不是我干的。”如果小惠说的是假话,那么小惠补了笔记,这与我们的假设矛盾,因为只有一个人补了笔记。
- 因此,小红不可能是说真话的人。
- 假设小芳说的是真话:
-
- 小芳说:“不是我干的。”
- 如果小芳说的是真话,那么小芳没有补笔记。
- 小红说:“是小芳干的。”如果小红说的是假话,那么小芳没有补笔记,这与我们的假设一致。
- 小惠说:“也不是我干的。”如果小惠说的是假话,那么小惠补了笔记,这与我们的假设一致。
- 因此,小芳可能是说真话的人,小惠补了笔记。
- 假设小惠说的是真话:
-
- 小惠说:“也不是我干的。”
- 如果小惠说的是真话,那么小惠没有补笔记。
- 小红说:“是小芳干的。”如果小红说的是假话,