Java基础面试总结

90 阅读27分钟

Java的平台版本

    • java ME
      • 小型版   嵌入式软件开发
    • java SE
      • 标准版   pc端软件开发
    • java EE
      • 企业版  web网页软件开发

Java语言的特点

1.简单性 2.分布式 3.安全性 4.健壮性 5.动态性 6.跨平台性 7.多线程 8.面向对象

 

jdk jre jvm分别是什么?他们的关系是什么?

1.jdk java开发工具包

2.jre java运行环境

3.jvm java虚拟机

 它们之间是包含关系jdk包含jre和工具包;jre包含jvm和运行环境

 

java跨平台

    • 只要在需要运行java应用程序此操作系统上,先安装一个java虚拟机(jvm)。由JVM来负责java程序在该系统中的运行。因为有了JVM所有同一个java程序就可以在三个不同的操作系统上都可以执行。这样就实现了java程序的可移植性。也称具有良好的跨平台性

 

JAVA编译执行流程

    • 编写以.java的文件-然后将java文件以javac编译成.class字节码文件-然后交由虚拟机jvm运行

注释的分类与功能

解释说明,提高代码的可以阅读性,在运行时不会被执行

    • 单行注释
    • 多行注释
    • 文档注释

三目运算与if的区别

    • 三目运算符必须声明变量来接收结果,它由:条件,真值和假值个部分组成的
    • 而if语句是流程控制语句,用于根据条件执行不同的代码块。它的真假代码块都可以直接打印输出
    • 总的来说,三目运算符适用于简单的条件判断,并且可以在单个表达式中返回不同的值,而if语句适用于更复杂的条件判断和控制流程

面向对象的三大特性

    • 封装
      • 封装是指将数据和操作封装在一个类,封装可以隐藏实现细节,提供对外公开的属性和方法,增强了代码的可维护性和安全性
    • 继承
      • 子类继承父类所有非私有的属性与行为
    • 多态
      • 是指同一个方法可以根据不同的对象调用出现不同的行为,多态存在要有3个必要条件:继承,方法重写,父类引用指向子类对象,它提供了灵活性和扩展性,同一个对象,在不同时刻表现出来的形态是不同的

if与switch语句的区别

    • if语句是一种基本的条件表达式,它的结果是boolean类型,它根据给定的条件表达式的结果来决定执行哪个代码块
    • switch语句是一种更复杂的条件语句,表达式类型不能是boolean类型,可以是byte,int,char,String,根据给定的表达式的值来决定执行哪个代码块。不同与if语句,switch语句可以处理多个不同的值,并根据这些值来执行相应的代码块

for循环与while循环的区别

    • for循环是一种迭代循环
    • while循环是一种条件循环
    • 声明变量地方不同,for循环声明在判断条件的括号里,而while声明的变量在循环体外面
    • 使用场景不同:while判断的是未知循环次数,而for循环判断已知循环次数、

 

全局变量与局部变量的区别

    • 作用域不同
      • 全局变量:可以被本类使用,或其他类使用
      • 局部变量:只能在本类中对应的方法中使用
    • 修饰符不同
      • 全局变量:属性可以加修饰符
      • 局部变量:不可以加修饰符

什么是数组

    • 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致
    • 用于存储具有相同数据类型的容器称之为数组

static关键字

    • static关键字的主要用途就是方便在没有创建对象时调用方法和变量和优化程序性能。
    • static变量(静态变量)
    • 用static修饰的变量被称为静态变量,也被称为类变量,可以直接通过类名来访问它。静态变量被所有的对象共享,在内存中只有一个副本,仅在类初次加载时会被初始化,而非静态变量在创建对象的时候会被初始化,并且存在多个副本,各个对象拥有的副本互不影响。
    • static方法(静态方法)
    • static方法不依赖于任何对象就可以进行访问,在static方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象所以不能被它们调用,但是在非静态成员方法中是可以访问静态成员方法/变量的。
    • statiac代码块(静态代码块)
    • 静态代码块的主要用途是可以用来优化程序的性能,因为它只会在类加载时加载一次,很多时候会将一些只需要一次的初始化操作都放在static代码块中进行。如果程序中有多个static块,在类初次被加载的时候,会按照static块的顺序来执行每个static块。
    • 可以通过this访问静态成员变量吗?(可以)
    • this代表当前对象,可以访问静态变量,而静态方法中是不能访问非静态变量,也不能使用this引用。
    • 初始化顺序

重载与重写的区别

    • 重载(overload) 是发生在同一个类里面,方法名字相同,个数不同,顺序不同,数据类型不同。返回类型和访问修饰符可以相同也可以不同。每个重载的方法都必须有一个独一无二的参数类型列表
    • 重写(override) 子类继承父类的可允许访问的方法,然后父类的方法无法满足子类的需求所以需要方法的重写,返回值和形参都不能改变,只能修改方法体

抽象类与接口的区别

在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明

    • 一个类只能继承一个抽象类,而一个类却可以实现多个接口
    • 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法
    • 抽象类中也可以不书写抽象方法,而接口中必须书写抽象方法
    • 抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public类型的
    • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
    • 抽象类,接口不能实例化
    • 接口没有构造方法

this和super的区别

    • this:代表当前对象,谁调用就指向谁,this在本类内调用本类的其他构造方法
    • this可以用于区分当前类的属性和局部变量
    • super:它引用当前对象直接父类中的成员和方法,super在子类中调用父类的构造方法
    • this和super都指的是对象,所以都不可以在static环境中使用,均放在第一行

== 和 equals的区别

    • 对于基本数据类型,==比较的是值;对于引用数据类型,==比较的是内存地址
    • 对于没有重写equals方法的类型,equals方法和==作用类似;对于重写过equals方法的类equals比较的是值

构造方法有那些特性

    • 方法名称和类同名
    • 不用定义返回值类型
    • 不可以写retrun语句
    • 构造方法可以被重载
    • 用于初始化

final关键字

    • 被final关键字修饰性的类不能被继承
    • 被final关键字修饰的方法不能被重写
    • 被final关键字修饰的变量只能被赋值一次,修饰的引用类型的话指向的内容是可以改变的;

为什么重写equals方法需要重写hashCode方法

    • 因为重写equals方法比较值是相等的,那么它们的hashCode也一定相等,反之不然;
    • 因为hashCode在具有哈希机制的集合中有着非常关键的作用

String、StringBuffer、Stringbuilder的区别

    • String声明的是不可变的对象,每次操作都会生成新的String对象, 再将指针指向新的String对象
    • StringBuffer.Stringbuilder它们都是可变的
    • StringBuffer 是线程安全的,它们都是拥有缓冲池的可以直接修改数据,要是操作数据较多建议使用
    • StringBuilder 是非线程安全的,StringBuilder的性能却高于StringBuufer
    • 所以单线程环境下推荐使用StringBuilder,多线程推荐使用StringBuffer

final、finally、finlize的区别

    • final   是关键字,修饰符
      • 可以修饰类、变量、方法,修饰类不能被继承、修饰变量只能赋值一次、修饰方法不能重写
    • finally   一种异常处理机制
      • 一般配合try-catch一起使用处理异常,无论是否发生异常都会执行finally代码块
    • finalize   是一个方法名
      • 属于Object类的一个方法,该方法一般由垃圾回收器来调用

ArrayList与LinkedList的区别

    • ArrayList
      • 底层是由动态数组实现,ArrayList提供了更快的元素访问和修改操作,因为它使用的底层是数组所以支持索引,比LinkedList改查效率更高一些
    • LinkedList
      • 底层是双向链表实现,因为LinkedList的每个节点中存储的是实际的数据和前后节点的位置所以增删效率更高一些
      • LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

List接口与Set接口的区别

List有序,按对象进入的顺序保存对象,可重复,运行多个Null元素对象,可以使用Iterator获取元素或增强for循环,在逐一遍历,还可以使用get(int index)获取指定下标的元素
Set无序,不可重复,最多运行有一个Null元素对象

HashSet的存储流程

    • HashSet是java编程语言中的一个集合类,它实现了Set接口。HashSet的底层是HashMap,HashSet的值存放与HashMap的key上,所以实现了元素的无序且唯一,工作原理是基于哈希表的数据结构
    • 当在HashSet中添加一个元素时,它首先会计算该元素的哈希码,以这个哈希码来确定元素在数组中的存储位置。
    • 然后使用equsal来比较链表存储的数据,判断是否存在相等值,如果没有就可以添加,如果有就覆盖。

HashMap初始容量?扩容倍数?负载因子?(为什么负载因子是0.75 其他可不可以)

    • 在JDK中默认长度是16,并且默认长度和扩容后的长度都必须是2倍
    • 是用来控制哈希表的装填程度的,当负载因子超过一定阈值时,哈希表会自动进行扩容操作,以保持较低的哈希冲突率和较高的性能
    • 可以但不建议,因为会频繁扩容比较浪费空间。0.75比较合理,因为这个数和2的幂乘积结果都是整数

创建线程的方式?

    • 继承Thread类创建线程类
    • 通过Runnable接口创建线程类
    • 通过Callable和Future创建线程
    • 通过线程池创建

Thread和Runnable的区别

    • Thread
      • Java中表示线程的类,它提供了内置的方法管理线程,比如启动,暂停、恢复、停止等,要使用Thread类创建一个线程,需要重写它的run()方法,run()方法包含了线程要执行的代码
    • Runnable
      • Java中的一个接口,定义了一个可运行的任务,它只有一个run()方法,用于定义线程执行的代码。为了创建一个线程,可以实现runnable接口,并实现run()方法的对象传递给Thread类的构造函数

线程的生命周期

    • 创建状态-->new
    • 就绪状态-->start
    • 运行状态-->run
    • 阻塞状态-->lock
    • 等待状态-->wart
    • 死亡状态-->data

线程同步的方式

    • 同步代码块
synchronized(同步锁){ 
	需要同步操作的代码 
}
    • 同步方法
      • 对于非static方法,同步锁就是this
public synchronized void method(){
    可能会产生线程安全问题的代码 
}
    • Lock锁
      • 同步代码块、同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象

死锁的产生方式与解决方法

    • 指两个线程或多个线程相互持有对方所需要的资源,导致线程都处于等待状态,无法往下执行,这就是死锁
    • 死锁的出现主要是因为同步中嵌套同步了,我们只需要保证不让他们进行嵌套即可解决死锁的出现
    • 破坏“循环等待”条件

wait与sleep方法的区别

    • sleep()方法没有释放锁,而wait()方法释放了锁;
    • sleep()方法属于Thread类的静态方法,作用与当前线程;而wait()方法是Object类的实例方法,作用与对象本身
    • 执行sleep后,可以通过超时唤醒休眠中的线程,执行wait方法,通过notify或notifyAll方法唤醒;

start与run方法的区别

    • start方法用于启动一个新的线程,并让线程进入就绪状态,等待cpu调度。
    • run方法是线程的主体,包含了线程要执行的代码。当直接调用“run”方法时,代码将在当前线程中普通的方法调用执行,而不会创建新的线程。

TCP与UDP的区别

    • TCP-面向连接
      • 提供可靠的数据传输服务
      • 面向字节流
      • 数据传输慢
    • UDP-面向非连接即发送数据前不需要建立链接
      • 无法保证数据传输的可靠
      • 面向报文
      • 数据传输快

数据库引擎InnoDB与MyISAM的区别?

    • InnoDB
      • 是MySQL的默认存储引擎,支持事务、锁和外键等操作
    • MyISAM
      • MYISM是mySQL5.1版本前的默认存储引擎,MyISAM的并发性比较差,不支持事务和外键等操作,默认的锁的粒度为表级锁
表结构数据和索引是集中储存的数据和索引是分开存储的
查询性能一般情况相比于MyISAM较差一般情况相比于InnoDB较好
索引聚簇索引非聚簇索引
表锁表行锁表锁
  • 行表锁: InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表

char与varchar的区别

存储方式、存储容量、存储效率

  • char表示长度固定、varchar表示可变的
  • 对于char来说,最多能存放的字符个数为255.对于varchar,最多能存放的字符个数65532
  • char长度固定,存储速度会比varchar快一些

事务的ACID特性分别指的是什么?

  1. 原子性(Atomicity) :
    • 事务是一个不可分割的操作单元,要么全部执行成功,要么全部回滚到事务开始前的状态。如果事务中的任何操作失败,整个事务将回滚,不会对数据库造成任何影响
  1. 一致性(Consistency):
    • 事务的操作必须满足数据预定义的规则和约束,以保持数据的完整性和一致性。
  1. 隔离性(Isolation):
    • 事务的隔离性指的是并发执行的多个事务之间应该互不干扰,每个事务都感觉不到其他事务的存在
  1. 持久性(Durability):
    • 一旦事务提交成功,其所做的修改将永久保存在数据库中,及时系统发生故障或重写启动,数据也不会丢失

sql语句的分类

    • DQL
      • 数据查询语言
    • DML
      • 数据操作语言
    • DDL
      • 数据定义语言
    • DCL
      • 数据控制语言
    • TCL
      • 事务控制语言

 

SQL查询语句的执行顺序

FROM- > WHERE -> GROUPY BY -> HAVING -> SELECT -> ORDER BY -> LIMIT 

  • from:  指定查询的数据源
  • where:  用于筛选满足特定条件的数据行
  • group by:  安照指定的列对数据进行分组
  • having:  用于筛选分组后的数据
  • select:  选择要查询的列
  • order by:  按照指定的列对结果进行排序
  • limt:  用于限制返回的结果行数和指定起始位置

delete from 表名与truncate 表名 都可以删除表中所有数据区别在哪?

    • delete from
      • 以行单位逐条删除数据
      • delet from可回滚
    • truncate
      • 它会直接删除整个表的数据,而不是逐条删除,然后重新创建一个同名的空表
      • truncate不可回滚

数据库建库建表三范式指的是什么?

    • 第一范式: 确保每列保持原子性,数据表中的所有字段值都是不可分割的原子值
    • 第二范式: 确保表中的每列都和主键相关
    • 第三范式: 确保每列都和主键列直接相关而不是间接相关

where与having的区别

  • where:  用于筛选满足特定条件的数据行
    • 不能直接使用聚合函数
  • having:  用于筛选分组后的数据
    • 可以使用聚合函数

什么是视图?视图的作用是什么?有什么优缺点?

    • 视图(View)是一种虚拟的表,它是基于一个或多个表的查询结果构建的。视图并不实际存储数据,而是通过查询语句动态生成结果集。
    • 作用: 简化复杂的查询、数据安全性、数据一致性

    • 优点:
      • 简化查询
      • 数据安全性
      • 数据一致性
    • 缺点:
      • 性能问题
        • 视图是基于查询语句生成的,可能会导致查询性能下降,特别是当视图涉及复杂的连接和过滤操作时。
      • 更新限制
        • 视图通常只能读取数据,对于包含聚合函数,分组或连接等的视图,可能无法直接进行数据的插入,更新和删除操作
      • 维护复杂性
        • 当底层表结构发生变化时,可能需要对相关的视图进行相应的修改,增加了维护的复杂性

什么是索引?索引的优缺点?索引失效的场景有哪些?

    • 它类似于书籍的目录,可以加快数据库的查找速度;
    • 优点:
      • 提高查询性能
      • 加速排序
      • 提高数据的唯一性和完整性
    • 缺点:
      • 占用存储空间
      • 增删改操作的性能下降
    • 索引失效的场景
      • 对非索引列进行查询,索引操作
      • 对索引列进行函数操作
      • 数据分布不均匀
      • 使用“OR”操作符
      • %like
      • 使用select*
      • not in会导致索引失效
      • 数据库表中的数据类型不匹配,导致索引失效
      • 数据库表中存在大量的NULL值,导致索引失效
      • 数据频繁更新

sql优化

    • 基础Sql优化
      • 查询SQL尽量不要使用select *,而是具体字段
      • 避免在where子句中使用or来连接条件
      • 使用varchar代替char
      • 尽量使用数值替代字符串类型
      • 查询尽量避免返回大量数据
      • 使用explain分析你SQL执行计划
      • 是否使用了索引及其扫描类型
      • 创建name字段的索引
      • 优化like语句:
      • 字符串怪现象
      • 索引不宜太多,一般5个以内
      • 索引不适合建在有大量重复数据的字段上
      • where限定查询的数据
      • 避免在索引列上使用内置函数
      • 避免在where中对字段进行表达式操作
      • 避免在where子句中使用!=或<>操作符
      • 去重distinct过滤字段要少
      • where中使用默认值代替null
    • 高级SQL优化
      • 批量插入性能提升
      • 批量删除优化
      • 伪删除设计
      • 提高group by语句的效率
      • 复合索引最左特性
      • 排序字段创建索引
      • 删除冗余和重复的索引
      • 不要有超过5个以上的表连接
      • inner join 、left join、right join,优先使用inner join
      • in子查询的优化
      • 尽量使用union all替代union

什么是泛型 泛型的书写与注意事项

    • 泛型是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,程序员在编译时可以检测到非法的数据类型。
    • 泛型类型参数通常用大写字母表示,以便与普通的类和变量区分开来
    • 泛型类型参数可以有多个
    • 在实例化泛型类时,需要提供具体的类型参数
    • 泛型类型参数可以用于类、接口、方法的定义和使用
    • 修饰泛型类的时候去书写在类的前面
    • 修饰泛型方法的时候需要书写在返回值后面

 

什么是递归 递归的书写与注意事项

    • 递归就是书写方法,并自己调用自己陷入循环递归中
    • 递归分为两种,直接递归和间接递归
    • 直接递归称为方法自身调用自己
    • 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
  • 注意事项
  • 递归函数必须有让递归停下来的限制条件,随着递归函数的不断运行,必须越来越接近这个限制条件,以避免无限递归或错误的结果
  • 否则会发生栈内存溢出

mvc与三层架构的区别

  • MVC架构模式分别有
    • 视图层(view):用于连接用户提交请求和现实的代码
    • 控制器(Controller):用于将用户请求转发给相应的Model进行处理,并根据Model的计算结果向用户提供相应的响应
    • Model(模型):承载数据,并对用户提交请求进行计算的模块
  • 三层架构分别是  (表现层/业务逻辑层/数据访问层),采用面向抽象编程,更好的降低各层间的耦合度
    • 视图(view) 用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。主要作用是界面展示,接收请求,发布请求
    • 服务层(Service):系统的业务逻辑主要在这里完成
    • 持久层(Dao):直接操作数据库的代码

 

    • MVC是一种架构模式,可以用它来创建在域对象和UI表示层对象之间的区分
    • 它们同样是架构级别的,相同的地方在于他们都有一个表现层,但是他们不同的地方在于其他的两个层
    • 三层架构是基于业务逻辑来分的,而mvc是基于页面来分的
    • MVC模式是一种复合设计模式,一种解决方案
    • 三层是软件架构,通过接口实现编程
    • 三层模式是体系结构模式,MVC是设计模式

事务的隔离级别

    • 读未提交
      • 脏读:一个事物可以读取未提及的数据
      • 一个事务可以读取其他事务未提交的数据。这种隔离级别最低,可能导致脏读问题
    • 读已提交
      • 不可重复读: 一个事务范围内两个相同的查询却返回不同数据
      • 一个事务只能读取其他事务以及提交的数据。这种隔离级别可以避免脏读问题,但可能导致不可重复读问题
    • 可重复读
      • 幻读:一个事物在前后两次查询同一个范围的时候,后一次查询看到前一次查询未看到的行
      • 一个事务在执行期间多次读取同一数据时,能够看到相同的数据值。这个隔离级别可以避免脏读和不可重复问题,但可能导致幻读问题
    • 串行化
      • 最高的隔离级别,确保每个事务完全独立执行,避免了脏读、不可重复读和幻读问题。但是串行化级别可能会导致并发性能下降。

 

HTTP协议与TCP协议的区别

    • 目的不同:
      • TCP: 它是一种传输层协议,负责在两个设备之间建立可靠和面向连接的通信通道。它确保数据的完整性、顺序和流量控制
      • HTTP: 它是一种应用层协议,用于在万维网上传输超文本文档。它定义了客户端和服务器之间通信的格式和规则
    • 层级不同:
      • TCP:在OSI模型的传输层(第4层)
      • HTTP:在OSI模型的应用层(第七层)
      • HTTP:请求无响应无状态
      • 可以执行任何可靠性的传输
    • 功能不同:
      • TCP: 提供可靠、有序和经过错误检查的数据传输。它处理分段、重组和拥塞控制
      • HTTP:定义了客户端和服务器之间请求和响应的结构
    • 连接不同:
      • TCP:在数据传输之前,它在两个设备之间建立连接,并确保数据的可靠传递
      • HTTP:它使用TCP作为底层传输协议,在客户端和服务器之间建立连接,允许它们交换HTTP消息

servlet生命周期

    • 构造servlet,然后使用init方法将其初始化
      • 第一次发送请求的时候。执行一次
      • loadOnstartUp 默认-1 修改为0可以让init方法在刚开运行时执行一次
    • 处理来自客户端的对service方法的所有调用
      • 客户端发送一次请求,调用service方法一次。可以执行多次
    • 从服务中取出servlet,然后使用destroy方法销毁它,最后进行垃圾回收并终止它
      • tomcat服务器关闭的时候销毁

转发与重定向区别

    • 转发地址栏不会发生改变,但是重定向会发生改变
    • 转发的状态码是2xx,重定向是3xx
    • 转发可以使用request域对象传递数据,但是重定向必须使用请求将响应对象传递
    • 转发可以请求WEB-INF下的内部资源
    • 转发是一次请求和一次响应,重定向是多次请求与响应

get请求与post请求区别

    • get请求发送数据在url地址传输,post请求在请求体中传输
    • get请求没有post请求安全
    • get请求可以被书签保存,post不可以
    • get请求在浏览器页面后退时无影响,post可能导致表单的重复提交
    • get请求页面编码与后台编码相同不会乱码,post可能会乱码
    • get请求一次响应一次,post请求是先建立请求,所以get请求是被动请求

Cookie和Session区别

    • 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
    • 安全性:Cookied不安全,Session安全
    • 数据大小:Cookie最大3kB,Session几乎无大小限制
    • 存储时间:Cookie可以长期存储,Session默认30分钟
    • 服务器性能:Cookie不占服务器资源,Session占用服务器资源

jsp九大内置对象

  • pageScope
    • 代表当前页面
  • requestScope
    • 代表一次请求
  • sessionScope
    • 代表一次会话
  • applicationScope
    • 代表一次应用
  • param
    • 返回客户端请求中指定的参数字符串值,相当于request.getParameter()
  • paramValues
    • 返回客户端请求参数中的所有值,相当于request.getParameters()
  • pageContext
    • 可以获取其他八个内置对象
  • headerValues
    • 代表请求头
  • cookie
    • 代表客户端发送请求中的所有cookie

双亲委派原则

for与foreach的区别

    • for循环在遍历集合时使用下标来定位集合中的元素
    • foreach循环适用于数组或实现了iterator的集合类。foreach就是使用iterator接口来实现对集合的遍历的
    • foreach循环遍历一个集合时,不能改变集合中的元素,比如增删改

git常用指令

  • git clone 从远程仓库克隆
  • git add 将文件加入暂存区
  • git reset 将指定的文件取消暂存
  • git commit 将暂存区的文件修改提交到本地仓库
  • git rm 删除文件
  • git branch 查看分支
  • git beanch 创建分支
  • git checkout 切换分支
  • git push 地址   推送分支

Mybatis与Hibernate区别

    • Hibernate是全ORM框架,Mybatis是半ORM框架,其实是基于JPA接口书写的
    • Hibernate实现了JPA接口,操作数据库无需书写sql语句
    • Mybatis没有实现JPA接口,需要书写原生的sql语句进行数据库操作
    • 因为Mybatis没有实现JPA接口,编写的是原生的Sql语句,所以效率高
    • Hibernate内部封装完善,学习成本高
    • Mybatis甚至不用管对象与对象的关系映射设计

#{}与${}的区别

    • 都是对指定的参数进行获取填入
    • #{}使用的是占位符的形式进行填值,可以有效的解决sql注入
    • ${}使用的是字符串拼接形式 需要注意sql语句的书写规则,不能防止sql注入

mysql与oracle的区别

    • mysql开源免费,而oracle使用免费,但有些功能收费
    • mysql轻量型数据库,oracle重量型数据库
    • mysql在innodb存储引擎的行级锁的情况下才支持事务;orcal完全支持事务。
    • mysql默认自动提交事务;orcal需要用户手动提交事务
    • orcal对sql语句要求更加严格,而mysql有许多方便的扩展更加灵活
    • mysql软件体积小,安装使用简单且易于维护,维护成本低;
    • oracle对硬件要求很高、管理维护麻烦一些、操作比较复杂,需要一定技术含量

spring实例化对象的方式有哪些

    • 默认使用无参构造方法实例化对象:通过在容器中配置bean的构造函数参数来实例化对象
    • 使用静态工厂方法实例化对象:通过在容器中配置bean的静态工厂方法名和方法参数来实例化对象
    • 使用工厂的实例方法实例化对象:通过在容器中配置bean的实例工厂方法名和方法参数来实例化对象
    • 使用注解实例化对象:使用注解(如@Component、@Service、@Controller、@Repository等)标注一个类并在容器中自动扫描并实例化对象

spring依赖注入的方式有哪些

    • 构造器注入
    • set注入
    • 接口注入 注解注入 == 自动注入

@Autowired与@Resource的区别

    • @Autowired
      • 结合使用根据类型与名称进行属性的注入
      • 先通过类型匹配进行注入 如果没有相应的spring管理对象的类型 通过名称进行赋值
    • @Resource
      • 按照名称与类型的形式进行属性注入
      • 先通过变量的名字进行注入 如果没有与变量名相同的bean 则通过类型进行赋值

jdk动态代理与cglib动态代理的区别

  • 动态代理技术是实现在不修改源码的情况下对功能的增加

 

  • JDK创建代理对象效率较高,执行效率较低
  • cglib创建代理对象效率较低,执行效率高
  • jdk动态代理机制是委托机制,只能对实现接口的类生成代理,通过反射动态实现接口类;
    • JDK代理:基于接口的动态代理技术
  • cglib则使用的继承机制,针对类实现代理,被代理的类和代理类是继承关系
    • cglib代理:基于父类的动态代理技术