宁波银行面经 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 中,深拷贝和浅拷贝是两种对象复制的方式 浅拷贝是指创建一个新的对象,并将原始对象的字段值复制到新对象中。 深拷贝是指创建一个新的对象,并递归地复制所有引用类型字段所引用的对象。 这样,拷贝对象和原始对象之间不会共享任何对象的引用,修改拷贝对象的内容不会影响原始对象。
常用数据结构,所占空间
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 模式的实现。