宁波银行面经

Java创建对象的方式

1
2
3
4
5
6
7
8
9
10
new
构造器
反射
克隆,clone

new的底层:
1.jvm的类加载机制,确保当前类已经被加载
2.分配内存
3.调用构造方法
4.返回对象的引用

servlet生命周期

1
2
3
4
5
6
7
8
servlet是Javaweb开发的一种服务器组件,主要用于处理客户请求和生产动态响应
创建、初始化、处理请求和销毁四个主要阶段
加载和实例化:当客户端第一次发送请求到某个 Servlet 时,
服务器会加载该 Servlet 类,并实例化一个 Servlet 对象
调用 init() 方法:当 Servlet 对象被创建后,服务器会调用该对象的 init() 方法来初始化 Servlet
调用 service() 方法:服务器会调用 Servlet 的 service() 方法来处理请求。
service() 方法负责根据请求的类型(如 GET、POST)调用相应的处理方法。
当服务器关闭或者 Servlet 被卸载时,服务器会调用 destroy() 方法

HashMap和HashTable

1
2
3
4
5
6
7
8
都是存储键值对的集合类
区别在于,hashmap是非线程安全的,hashTable是线程安全的
这是由于hashTable里面内部的方法是同步的,加了锁
但是hashTable是对整个map加锁
导致其性能不够好
现在都是用ConcurrentHashTable
采用分段锁的机制,降低了锁的颗粒度
提高性能

序列化和反序列化

1
2
3
4
5
6
对象和字节流之间的相互转换机制
序列化是指将 Java 对象的状态转换为字节流的过程,以便将对象的状态保存到文件中
反序列化是指将字节流重新转换为对象的过程,通过反序列化可以从存储中读取对象
Java 序列化:Serializable 是 Java 原生提供的序列化机制,但它的效率相对较低。
JSON 序列化:常见的框架如 Jackson 或 Gson,将 Java 对象转换为 JSON 字符串,
也可以视为一种序列化方式。

接口和抽象类abstract

1
2
3
4
5
接口里面都是抽象方法,不能被实例化,表示能做什么,
具体怎么做,要不同的类去实现这个接口,去重写

抽象类是以包含抽象方法(没有实现的方法)和非抽象方法(有具体实现的方法)
是类的模板设计,允许部分实现

jdbc

1
2
3
4
5
6
7
8
9
10
11
DBC是 Java 提供的一套用于连接和操作数据库的 API(应用编程接口)。
它为开发者提供了与不同类型的关系型数据库(如 MySQL、Oracle、PostgreSQL 等)
进行交互的标准方法,能够执行 SQL 语句、检索数据和管理数据库事务。
是开发 Java 数据库应用程序的基础工具。

连接过程:
1.加载MySQL驱动
2.简历数据库连接
3.创建sql语句
4.执行sql操作
5。关闭资源

IO 流,BIO和NIO

1
2
3
4
5
6
7
BIO 是传统的 I/O 处理方式,称为 阻塞 I/O
在 BIO 模型中,I/O 操作是阻塞的,意味着每一个请求都会占用一个独立的线程
在处理大量并发连接时,BIO 通常需要为每个连接创建一个独立的线程
NIO 非阻塞 I/O,提供了更高效的 I/O 操作,主要解决了 BIO 的高并发性能瓶颈问题
NIO 通过通道(Channel)和缓冲区(Buffer)进行数据操作
数据在 NIO 中被存放在缓冲区中,并通过通道(Channel)读写。
Channel 类似于传统的流,但它是双向的,既可以读也可以写,而流只能是单向的。

一个是Java父类和子类静态代码块,普通代码块,静态方法的执行顺序

1
2
3
4
5
静态代码块,是在类加载的过程中执行的,只会被执行一次
所以最先执行
然后是实例代码块,每次创建对象时都会执行一次。
且在构造方法执行前会先执行父类的实例代码块
最后才是静态方法

Bean的生命周期

1
2
3
4
5
6
7
8
Bean 是一个由 Spring IoC(控制反转)容器管理的对象。
Bean 通常用于表示应用程序的核心组件,这些组件的创建、
管理和生命周期都是由 Spring 框架来负责的。

spring的bean的生命周期主要是创建bean的过程,一个bean的生命周期主要是4个步骤,
实例化,属性注入,初始化,销毁
Spring 提供了多种机制(如注解和接口)来管理 Bean 的生命周期,
使得应用程序可以灵活地控制对象的创建和销毁过程。

深拷贝,浅拷贝

1
2
3
4
在 Java 中,深拷贝和浅拷贝是两种对象复制的方式
浅拷贝是指创建一个新的对象,并将原始对象的字段值复制到新对象中。
深拷贝是指创建一个新的对象,并递归地复制所有引用类型字段所引用的对象。
这样,拷贝对象和原始对象之间不会共享任何对象的引用,修改拷贝对象的内容不会影响原始对象。

image-20241016131809986

常用数据结构,所占空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
       ┌───┐
byte │ │
└───┘
┌───┬───┐
short │ │ │
└───┴───┘
┌───┬───┬───┬───┐
int │ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
long │ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┬───┬───┐
float │ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
double │ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┐
char │ │ │
└───┴───┘

65535:65535 是 TCP 和 UDP 协议中可用的最大端口号

6379:Redis的默认端口号

数据库

1
2
3
4
5
ddl:定义管理数据库的结构,创建表删除表这些

dml:数据库操作语言,增删改查这些

dcl:数据库控制,创建用户,给表的权限这些

搭建数据库

Windows,docker

线程的run和start

1
2
start():用于启动新线程并并发执行,真正实现多线程。
run():线程执行的逻辑,不会启动新线程,只是在当前线程中执行。

HashMap的底层实现原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Java中的HashMap是一种基于哈希表的Map接口实现,
它可以存储键值对,并且支持快速的插入、删除和查找操作。
HashMap的底层实现原理是数组+链表/红黑树。

具体来说,HashMap内部维护了一个Entry数组,每个Entry包含一个键值对。
当插入一个键值对时,HashMap会根据键的哈希值计算出该键值对在数组中的位置,
如果该位置已经有其他键值对了,则使用链表或红黑树来解决冲突。
当查找一个键值对时,HashMap会根据键的哈希值计算出该键值对在数组中的位置,
然后遍历链表或红黑树,找到对应的键值对。

在Java 8中,HashMap的底层实现原理进行了优化,
当链表长度超过一定阈值时,会将链表转换为红黑树,以提高查找效率。
此外,HashMap还支持动态扩容和负载因子等特性,以提高存储和访问的效率。

HashSet是如何检查重复的

1
2
3
4
HashSet底层还是HashMap,HashSet只考虑key的值,
value都指向一个全局object常量
比较过程:通过哈希法比较哈希值
哈希值相等再调用equals比较方法

equals和==的区别

1
2
3
==比较的是地址
equals如果不被重写,比较的是地址,底层调用==,
如果被重写,就按照重写的逻辑比较

Spring三件套框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Spring 三件套指的是 Spring 框架的三个核心模块,
分别是 Spring Core、Spring AOP 和 Spring MVC。

Spring Core:提供了 IoC(Inverse of Control)容器,
用于对象之间的解耦,通过容器自动将对象之间的依赖注入。
同时,Spring Core 还提供了对 AspectJ 的集成,
以及对基于注解的 Spring Bean 的支持。

Spring AOP:提供了基于 AOP(Aspect Oriented Programming)的编程方式,
能够在不修改源代码的情况下,
通过代理机制对对象进行增强,比如添加事务、日志、安全检查等功能。

Spring MVC:是 Spring 框架的 Web 模块,
提供了 MVC(Model-View-Controller)模式的支持,用于处理 Web 请求和响应。
Spring MVC 通过 DispatcherServlet、HandlerMapping、Controller
和 ViewResolver 等组件构成了完整的 MVC 模式的实现。