备战Java

2023-08-25 10:18:05 浏览数 (2)

一、Java 基础部分:

1.什么是面向对象?面向对象有哪些特征? 以事物为驱动的编程思想。封装、继承、多态 封装:将抽象出来的数据(属性和方法)封装到一起,private get set 继承:子类具有父类的属性与方法(extends super this)重写 重载 多态:一个实体具有多种状态(三个条件: 1、继承: 在多态中必须存在有继承关系的子类和父类。基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。 2、重写: 子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。 3、向上转型: 在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。) 2.说一下什么是 javaBean 规范: (1)javabean 类必须是一个公共类,用 public 修饰 (2)属性都是私有的–private (3)提供无参构造器 (4)属性应该通过一组存取方法(setXXX 和 getXXX 方法)来访问 (5)实现序列化接口(Serializable)

3.简述一下 java 基本数据类型及所占位数: java 基本数据类型:4 类 8 种 : byte,short,int,long,float,double,boolean,char 逻辑型: boolean false/true (1byte 8bit) 字符型: char (2byte 16bit) 运算时按照 int 类型运算 整数型:

位数

运算规则

byte(1byte 8bit)

运算时按照 int 类型运算

short(2byte 16bit)

运算时按照 int 类型运算

int(4byte 32bit)

运算时按照 int 类型运算

long(8byte 64bit)

后缀为 L/l

注:整数类型的默认类型是 int 类型,也就是说整数类型的字面量都是 int 类型

浮点数型:

位数

后缀

float(4byte 32bit)

后缀为 F/f

double(8byte 64bit)

后缀为 D/d

  • byte:字节型,用于存储整数的,占用1个字节,范围-128到127
  • short:短整型,用于存储整数的,占用2个字节,范围-32768到32767
  • int:最常⽤的整型,用于存储整数的,占用4个字节,范围 -2^31 到 2^31-1
  • long:长整型,用于存储较大的整数,占用8个字节,范围 -2^63 到 2^63-1
  • float:单精度符点数,用于存储小数的,占用4个字节,不能表示精确的值
  • double:双精度符点数,最常⽤的存储小数的类型,占⽤8个字节,不能表示精确的值
  • boolean:布尔型,用于存储true或false,占用1个字节
  • char:字符型,采用Unicode字符编码格式,用于存储单个字符,占用2个字节

注:浮点类型的默认类型是 double 类型,除了基本数据类型,其他类型都是引用类型。

4.说出 9 个运行时异常: RunTimeException |——NullPointerException:空指针异常,操作一个空引用时出现此异常 |——ArrayIndexOutOfBoundsException:数组下标越界异常 |——ArithmeticException:算数运算时,被除数为 0 时触发的异常 |——ClassCastException:类型转换异常 |——NumberFormatException:数字格式化异常 |——SystemException:系统异常 |——ArrayStoreException:数据存储异常,将与数组类型不兼容的值赋值给数组元素时抛出的异常 |——EmptyStackException:堆栈为空时出现此异常 |——OutOfMemoryException:内存不足,通常发生于创建对象之时 注:异常 Exception 分为两大类: 编译时异常:编译期间要检查的; 运行时异常:编译期间不检查的。

5.说出 5 个常用的 java-api 包 java.lang、java.util、java.sql、java.text、java.io

6.abstract class 和 interface 有什么联系和区别?什么时候用抽象类?什么时候用接口? 联系: (1)接口和抽象类都不能被实例化,用于被其他类实现和继承。 (2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。 区别: (1)接口只能定义静态常量,不能定义普通成员变量;抽象类则可以定义普通成员变量,也可以定义静态常量。 (2)接口不能包含构造器,抽象类可以包含构造器。(抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。) (3)一个类最多只有一个直接父类,包括抽象类,但一个类可以实现多个接口,通过实现多个接口可以弥补 java 单继承的不足。 (4)抽象类可以有不是抽象的方法。接口中所有的方法都是抽象的(JDK1.8以后,接口中可以有static修饰的实例方法)。 当用于关系比较密切的对象时用抽象类,当为不相关的类提供通用功能时用接口。

7.String, StringBuffer StringBuilder 的区别? String 是不可变的,底层是final修饰的;StringBuffer 是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer。StringBuilder 是从 JDK1.5 开始提供的类,通常应该优先使用 StringBuilder 类,因为它支持所有与 StringBuffer 相同的操作,但由于它不执行同步,所以速度更快。 StringBuilder 是非线程安全,执行效率高; StringBuffer 是线程安全执行效率较StringBuilder 低。

8.重写和重载的区别? 重写(overriding): 发生在父子类之间,方法名相同,参数列表(类型、个数、顺序)相同,当返回值为 8 种基本类型时应相同,为引用类型时,子类的返回值应小于等于父类,访问权限不能更封闭,抛出异常不能更宽泛。在程序运行时,根据对象的类型不同(而不是引用类型)而调用不同的版本。 重载(overloading): 发生在同一个类中,方法名相同,但是参数列表不同(类型不同或个数不同或参数的顺序不同),与返回值无关。在编译时,根据参数的个数和类型来决定绑定哪个方法。

9.IO 字节流 、字符流 IO 字节流:

Stream

操作

FileInputStream 和 FileOutputStream

对文件基本的输入输出操作

BufferedInputStream 和 BufferedOutputStream

加缓冲区的操作

DataInputStream 和 DataOutputStream

对基本操作的扩展, 可以一次读一种基本数据类型的数据.

IO 字符流:

Stream

操作

InputStreamReader 和 OutputStreamWriter

基本字符流,可以处理字符编码

BuffereReader 和 PrintWriter

可以一次读取一行数据

10.接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类? 接口可以继承接口,并且可以继承多个其它接口;抽象类可以实现接口中的方法;抽象类可以继承实体类。

11.构造器 Constructor 是否可以被继承?是否可以被 Override? 构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。

12.HashMap 和 HashTable 的区别: (1)HashMap 允许空键值对(key 和 value 都允许出现 null 值),HashTable 不允许 (2)HashMap 不是线程安全的,HashTable 是线程安全的 (3)二者虽然都实现了 Map 接口,但是 HashMap 继承 AbstractMap 类,HashTable 继承Dictionary 类 (4)HashTable 的默认容量为 11,而 HashMap 为 16 (5)HashTable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原来的 2 倍 (6)加载因子:0.75 value 是否为空;key的hash值,获得key在table数组中的index, 如果table[index]不为空,进行迭代; 如果遇到相同key值,直接替换,并且返回的是旧的value,否则直接插入到table[index] 13.final, finally, finalize 的区别 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally 是异常处理语句结构的一部分,表示总是执行。 finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

14.Collection 和 Collections 的区别。 Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

15. ArrayList,Vector,LinkedList 存储性能和特性它们都实现 List 接口 ArrayList 和 Vector 都是基于数组实现的 LinkedList 基于双向循环链表(查找效率低,添加删除容易) ArrayList 不是线程安全的而 Vector 是线程安全的,所以速度上 ArrayList 高于 Vector

16.说出 String 类中常用的 5 个方法 charAt() 返回指定索引处的 char 值 concat() 将指定字符串连接到此字符串的结尾 length() 返回此字符串的长度 split() 根据给定正则表达式的匹配拆分此字符串 trim() 返回字符串的副本,忽略前导空白和尾部空白. indexOf() 返回指定字符的索引 subString() 截取字符串

17.用一句话总结一下冒泡排序,并写出相应的代码。 依次比较相邻的两个数,将小数放在前面,大数放在后面

代码语言:javascript复制
for (int i=0;i<ary.length-1;i  ){
	for (int j=0;j<ary.length-i-1;j  ){ 
		if (ary[j]>ary[j 1]){ 
			int t = ary[j]; 
			ary[j]=ary[j 1]; 
			ary[j 1]=t;
		}
	}
}
123456789

18.实现线程安全的两种方式 1)synchronized 方法:通过在方法声明中加入 synchronized 关键字来声明 synchronized 方法。 2)synchronized 块:通过 synchronized 关键字来声明 synchronized 块。

19.实现多线程的两种方式 1)继承 Thread 类 2)实现 Runnable 接口 优先选择实现 Runnable 接口,因为比较灵活。

20.说一下“==”和 equals()方法在字串变量操作中的不同? ”==”比较的是两个字符串对象的地址,equals()是比较的两个字符串的具体值。

21. sleep()和 wait()有什么区别? sleep 是线程类(Thread)的方法,导致此线程暂停,然后执行给定时间,让出 cpu 给其他线程,但不会释放对象锁,时间到了自动恢复. wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,只有调用 notify 方法(或 notifyAll)后本线程才能进入等待运行状态。

22.&与&&的区别? & 位运算符,非短路逻辑运算符,它会把所有条件执行完毕之后,才会返回结果 && 逻辑运算符(and):短路运算符,遇到不符合条件,立即终止程序的执行

23. error 和 exception 的区别? error 表示系统级的错误和程序不必处理的异常,是 java 运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由 Java 虚拟机抛出的。 exception 表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。

24.遍历文件夹下所有.java 的文件?

代码语言:javascript复制
public void listFiles(String path){
	File dir = new File(path);
	File files [] = dir.listFiles(new FileFilter(){ 
		public boolean accept(File f){ 
			return f.getName().endWith(".java");
		}
	});
	for(File file : files){
		System.out.println(file.getName());
	}
}
1234567891011

25.描述一下 JVM 加载 class 文件的原理机制? JVM 中类的装载是由 ClassLoader 和它的子类来实现的。ClassLoader 是一个重要的 Java 运 行时系统组件,它负责在运行时查找和装入类文件,其实质是把类文件从硬盘读取到内存中。

26.同步和异步有何异同? 同步:上公交,排队 异步:同时运行,互不干扰

27.阐述一下 Collection 接口包含哪些子集?分别有什么区别?实现类分别是什么? list 和 set。 List:有序,可重复。Set:无序,不可重复 List 实现类:ArrayList----按顺序存放数据的数组 LinkedList-----按顺序存放数据的链表 Set 实现类:HashSet----根据 HashCode()和 equals()方法来判断是否有重复 TreeSet:通过实现 Comparable 和 Comparator 接口而具有排序功能的集合

28.什么是 Map?实现类是什么?有什么区别? Map 中存放是 Key 和 value 的键值对。 实现类是 HashMap(查询速度快,非线程安全的)和 TreeMap(查询速度慢,元素的排列顺序是不固定的)和 Hashtable(线程安全的,效率慢)。 遍历 key 方法:keySet(), 遍历 value 方法:values(), 遍历 entry 键值对方法: entrySet()。

29.StringBuilder 类的常用方法? append():追加字符串 insert():插入字符串 delete():删除字符串 replace():替换字符串 reverse():字符串反转

30.abstract 的 method 是否可同时是 static,是否可同时是 synchronized? 都不能

31.数组有没有 length()这个方法? String 有没有 length()这个方法? 数组没有 length()这个方法,有 length 的属性。 String 有 length()这个方法。

32.启动一个线程是用 run()还是 start()? 启动一个线程是调用 start()方法。

33.构造器 Constructor 是否可被 override? 构造器 Constructor 不能被继承,因此不能重写,但可以被重载。

34.是否可以从一个 static 方法内部发出对非 static 方法的调用? 不可以,如果其中包含对象的 method(),不能保证对象初始化.

35.在 java 中怎么设定时间的格式? 用 SimpleDateFormat 里的 format 方法

36.什么是反射? Java反射(Java Reflection)是指在运⾏时获取程序的类型信息并可以操作对象的机制。通过反射,可以在运⾏时获取类的成员变量、⽅法、构造函数等信息,并可以在运⾏时调⽤对象的⽅法,创建对象的实例,操作对象的属性等。

  • 在Java中,反射机制主要通过以下⼏个类实现:
  • Class类:表⽰类的类型,通过该类可以获取类的构造函数、成员变量、⽅法等信息。
  • Constructor类:表⽰类的构造函数类型,通过该类可以创建类的实例。
  • Field类:表⽰类的成员变量类型,通过该类可以获取、设置类的成员变量的值。
  • Method类:表⽰类的⽅法类型,通过该类可以调⽤类的⽅法。
  • 反射机制在Java中具有⼴泛的应⽤,例如:
  • 动态代理:可以通过反射⽣成实现了某个接⼝的代理类,实现动态代理。
  • 依赖注⼊:可以通过反射获取类的构造函数、成员变量等信息,实现依赖注⼊。
  • 注解处理器:可以通过反射获取类的注解信息,实现注解处理器。
  • 配置⽂件解析器:可以通过反射获取类的属性信息,实现配置⽂件解析器。
  • 尽管反射机制可以⽅便地获取类的信息并进⾏操作,但是它也具有⼀定的缺点,如性能较差、代 码可读性差、安全性差等。因此,在实际开发中,应该根据实际情况谨慎使⽤反射机制。

如何用反射获取方法

  • ⾸先找到类型的Class对象
    • Class.forName(类型)
    • 类型.class
    • 对象.getClass()
  • 然后在类型上查找⽅法
    • getMethods();//获取包括⾃⾝和继承(实现)过来的所有的public⽅法
    • getDeclaredMethods();//获取⾃⾝所有的⽅法
    • getMethod(⽅法签名);//表⽰获取指定的⼀个公共的⽅法,包括继承的
    • getDeclaredMethod(⽅法签名);//表⽰获取本类中的⼀个指定的⽅法,不包括继承的⽅法
    • ⽅法签名包括:⽅法的名字,参数的Class类型列表

37. 简述 ArrayList ,Vector ,LinkedList 的存储性能和特性 它们都实现 List 接口 ArrayList 和 Vector 都是基于数组实现的 LinkedList 基于双向循环链表(查找效率低,添加删除容易) ArrayList 不是线程安全的,而 Vector 是线程安全的,所以速度上 ArrayList 高于 Vector

38.创建对象有哪几种方式? (1)用 new 语句创建对象 (2)运用反射 newInstance()方法 (3)调用对象的 clone()方法 (4)运用反序列化调用 readObject()方法。

39.什么是回调函数? 某个程序 S(Student.main)调用服务程序 A(Arrays)中的某个方法(sort),服务程序 A 的 sort 方法在某个时候反过来调用 S 的某个方法(compareTo),这种情况下,compareTo 叫做 S 的回调方法。

40.web 三要素? 浏览器、服务器、HTTP 协议

41.JVM、JRE和JDK的关系 JDK:java开发工具包,是java的核心,包括:JRE 编译、运行等命令工具 JRE:java运行环境,是运行java程序所必须的环境集合,包括:JVM java系统类库 JVM:java虚拟机,是java实现跨平台的最核心部分,能够运行java语言所开发的程序

42.访问修饰符 public 公共的;protected 受保护的; default 默认的;private 私有的;

43.break ,continue ,return 的区别及作用 break 结束当前的循环体 continue 跳出本次循环,继续执行下次循环- return 结束当前的方法,直接返回

44.成员变量与局部变量的区别有哪些 成员变量:方法外部,类内部定义的变量 局部变量:类的方法中的变量。

作用域 成员变量:针对整个类有效。 局部变量:只在某个范围内有效。

存储位置 成员变量:存储在堆内存中。 局部变量:存储在栈内存中。

生命周期 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:在方法被调用,或者语句被执行的时候存在,当方法调用完,或者语句结束后,就自动释放。

初始值 成员变量:有默认初始值。 局部变量:没有默认初始值,使用前必须赋值。

使用原则 在使用变量时需要遵循的原则为:就近原则 首先在局部范围找,有就使用;接着在成员位置找。

45.HTTP请求结构?HTTP请求头中有什么?

  • ⼀个HTTP请求报⽂由四个部分组成:请求⾏、请求头部、空⾏、请求数据
  • 请求头 1.Accept:浏览器可接受的mime类型。 2.Accept-Charset:浏览器可接受的字符集。 3.Accept-Encoding:浏览器能够进⾏解码的⽅式。 4.Content-Length:表⽰请求消息的⻓度。 5.Host: 客户端告诉服务器,想访问的主机名。 6.Cookie:客户端可以向服务器带数据,只是⾮常重要的信息之⼀。

46.switch可以作用于哪些数据类型上? byte、short、int、char、String、枚举,其余类型都不允许

47. 实例变量与静态变量的区别

  • 实例变量和静态变量都属于成员变量
  • 实例变量 : 是属于对象的,在创建对象时存储在内存堆中,创建多少个对象,则实例变量就会在内存中存在多少份,需要通过引⽤变量来访问
  • 静态变量 : 是属于类的,在类被加载时存储在内存⽅法区中,⽆论创建多少个对象,静态变量在内存中都只有⼀份,常常通过类名点来访问

二、数据库(MySQL)部分:

1.如何创建表? create table 表名(字段 1 名类型,字段 2 名类型,字段 3 名类型);

2.查看表结构? desc 表名

3.修改表名? rename 旧名 to 新名。

4.修改表结构,添加一列信息? alter table 表名 add 字段名 数据类型;

5.修改表结构,删除一列信息? alter table 表名 drop 字段名;

6.修改字段名和类型? alter table 表名 change 原字段名 新字段名 新类型

7.修改字段类型和位置? alter table 表名 modify 字段名 类型 位置(first/after ***);

8.编码集相关设置: (1)创建数据库时设置编码集: create database db1 character set utf8; (2)建表时设置编码集: create table 表名(字段 1 名类型,字段 2 名类型,字段 3 名类型) charset=utf8; (3)修改数据库的编码集: alter database 库名 character set utf8; (4)修改表的编码集: alter table 表名 charset=gbk;

9.模糊查询使用什么关键字? like

10.数据库中用于统计返回记录的行数的函数是什么? count count(1):对表中第一列的值的行数进行计算

  • count(1)与count(*)得到的结果一致,包含null值。
  • count(字段)不计算null值
  • count(null)结果恒为0

11.数据库中排序用什么?分组用什么? order by 、group by

mysql执行顺序如下:

  1. from 阶段
  2. where 阶段
  3. group by 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. limit 阶段

12.说出几个常用的约束? 主键(primary key)、外键(foreign key)、唯一(unique)、非空(not null)、自增(auto_increment)

13.怎么把字符串转换成日期格式? str_to_date() str_to_date(str,format): datetime SELECT str_to_date(‘2023-05-20 09:47:30’,‘%Y-%m-%d %H:%i:%s’) AS RESULT;

14.数据库中怎么格式化日期? date_format() SELECT date_format(now(),‘%Y-%m-%d %H:%i:%s’)

15.怎么去除字符串的重复信息? distinct

16.数据库中常见的聚合函数? 在关系型数据库中,聚合函数(Aggregate Functions)是用于计算数据集合中的统计值的函数。 常见的聚合函数包括以下几个:

  • COUNT:计算数据集合中的记录数。
  • SUM:计算数据集合中某个字段的总和。
  • AVG:计算数据集合中某个字段的平均值。
  • MAX:获取数据集合中某个字段的最⼤值。
  • MIN:获取数据集合中某个字段的最⼩值。
  • 这些聚合函数可以与 SQL 语句的 SELECT 语句结合使⽤,对数据集合进⾏统计和汇总。

17.在一个千万级的数据库查寻中,如何提高查询效率?

  • 减少数据访问: 设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO
  • 返回更少的数据: 只返回需要的字段和数据分页处理 减少磁盘io及网络IO
  • 减少交互次数: 批量DML操作,函数存储等减少数据连接次数
  • 减少服务器CPU开销: 尽量减少数据库排序操作以及全表查询,减少cpu 内存占用
  • 利用更多资源: 使用表分区,可以增加并行操作,更大限度利用cpu资源

总结到SQL优化中,就三点:

  • 最大化利用索引;
  • 尽可能避免全表扫描;
  • 减少无效数据的查询; 分析语句,是否加载了不必要的字段/数据。 分析 SQL 执行计划(explain extended),思考可能的优化点,是否命中索引等。 查看 SQL 涉及的表结构和索引信息。 如果 SQL 很复杂,优化 SQL 结构。 按照可能的优化点执行表结构变更、增加索引、SQL 改写等操作。 查看优化后的执行时间和执行计划。 如果表数据量太大,考虑分表。 利用缓存,减少查询次数。 例子如下: a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 b.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,可以在 num 上设置默认值 0,确保表中 num 列没有 null 值, c.并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询可能不会去利用索引 d.避免频繁创建和删除临时表,以减少系统表资源的消耗。 e.应尽量避免在 where 子句中使用!=或<>操作符、使用 or 来连接条件,否则将使引擎放弃使用索引而进行全表扫描。 f.尽量不要使用模糊查询 g.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”。

18.删除一张表中所有数据的方式? 1.truncate 删除内容,不删除定义,释放空间 2.delete 删除内容,不删除定义,不释放空间 truncate 比 delete 速度快,且使用的系统和事务日志资源少。delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。

19.索引(index) 相当于书签,能够提高数据的访问效率 注:主键列自动创建索引(聚集索引),其他列必须手动创建索引(非聚集索引)。 创建索引: CREATE [ UNIQUE ] INDEX index_name ON table_name ( index_name,… ) ; 演示:例如给user表的name字段添加索引,中括号里的参数是可以省略的。 CREATE INDEX index_name ON user(name);

创建索引的条件是什么?

  • 字段的数值有唯⼀性的限制 业务上具有唯⼀特性的字段,即使是组合字段,也必须建成唯⼀索引。 说明:不要以为唯⼀索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的。
  • 频繁作为 WHERE 查询条件的字段
  • 经常 GROUP BY 和 ORDER BY 的列 索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用ORDER BY 对数据进行排序的时候,就需要对分组或者排序的字段进行索引 。如果待排序的列有多个,那么可以在这些列上建立组合索引 。
  • UPDATE、DELETE 的 WHERE 条件列 对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。
  • DISTINCT 字段需要创建索引
  • 多表 JOIN 连接操作时,创建索引注意事项 对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。
  • 使用列的类型小的创建索引
  • 使用字符串前缀创建索引
  • 区分度高(散列性高)的列适合作为索引
  • 使⽤最频繁的列放到联合索引的左侧
  • 在多个字段都要创建索引的情况下,联合索引优于单值索引

20.视图(view) 虚拟的存在于数据库中。 用到视图的时候,系统会自动搜索数据库中的表,数据都是从表中取到的,并不是从视图中直接拿到的。

21.什么是事务?事务的特性是什么? **事务:**指构成单个逻辑⼯作单元的操作集合,要么完全地执行,要么完全地不执行。 事务是指是程序中⼀系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做⼀件事情来处理,好比大家同在⼀条船上,要活⼀起活,要完⼀起完。 事务默认是自动提交。 事务的特性:ACID(原子性、一致性、隔离性、持久性)。 原子性 :操作这些指令时,要么全部执行成功,要么全部不执行。只要其中⼀个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。 一致性 : 事务的执行使数据从⼀个状态转换为另⼀个状态,但是对于整个数据的完整性保持稳定。也就是说一个事务执行之前和执行之后都必须处于一致性状态。 隔离性 :隔离性是当多个用户并发访问数据库时,比如操作同⼀张表时,数据库为每⼀个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么⼀种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。 持久性 :当事务正确完成后,它对于数据的改变是永久性的。一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

22.什么是批处理? 批处理指的是在一次操作中执行多条 SQL 语句。 addBatch():添加要执行的语句 executeBatch():获得批处理的结果

java调用addBatch()方法 addBatch() 方法是 java.sql.Statement 接口中的方法,用于将 SQL 语句添加到批处理中。批处理是一种优化技术,可以将多个 SQL 语句一起发送给数据库执行,从而减少与数据库的通信次数,提高性能。 addBatch() 方法进行批处理时,通常需要遵循以下步骤:

  1. 创建 java.sql.Statement 对象。可以使用 java.sql.Connection 接口的 createStatement() 方法创建一个 Statement 对象。
  2. 将要执行的 SQL 语句添加到批处理中。可以使用 Statement 对象的 addBatch(String sql) 方法将 SQL 语句添加到批处理中。可以多次调用 addBatch() 方法添加多个 SQL 语句。
  3. 执行批处理。可以使用 Statement 对象的 executeBatch() 方法执行批处理。该方法将批处理中的 SQL 语句一起发送给数据库执行,并返回一个整数数组,其中包含每个 SQL 语句执行所影响的行数。
  4. 提交事务。如果希望将批处理中的 SQL 语句作为一个事务执行,应该关闭自动提交事务,并在执行批处理后手动提交事务。 以下是一个示例代码片段,演示如何使用 addBatch() 方法:
代码语言:javascript复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class BatchInsertExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "myuser";
        String password = "mypassword";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement()) {
            conn.setAutoCommit(false); // 关闭自动提交事务

            String sql1 = "INSERT INTO employee (id, name, age) VALUES (1, 'Alice', 25)";
            String sql2 = "INSERT INTO employee (id, name, age) VALUES (2, 'Bob', 30)";
            String sql3 = "INSERT INTO employee (id, name, age) VALUES (3, 'Charlie', 35)";

            stmt.addBatch(sql1);
            stmt.addBatch(sql2);
            stmt.addBatch(sql3);

            int[] result = stmt.executeBatch(); // 执行批处理

            conn.commit(); // 提交事务

            System.out.println("Number of rows affected: "   result.length);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
123456789101112131415161718192021222324252627282930313233

在上面的示例中,我们首先创建了一个 Connection 对象,然后创建一个 Statement 对象。接着,我们使用 addBatch() 方法将三个 SQL 语句添加到批处理中。最后,我们使用 executeBatch() 方法执行批处理,并将受影响的行数打印出来。

需要注意的是,当使用批处理执行 SQL 语句时,应该关闭自动提交事务(通过调用 Connection.setAutoCommit(false) 方法),并在执行批处理后手动提交事务(通过调用 Connection.commit() 方法)。这样可以确保所有 SQL 语句都在同一个事务中执行,从而保持数据的一致性。

23.数据库三范式? 第一范式是指在关系模型中,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。简而言之,第一范式就是无重复的域。

第二范式要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

第三范式,在第二范式的基础上,任何非主属性不依赖于其它非主属性(在第二范式基础上消除传递依赖)。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足第二范式的基础上,任何非主属性不得传递依赖于主属性。

三、JDBC&XML 部分:

1. jdbc 连接数据库的步骤 1.注册驱动 Class.forName(“”); 2.获得连接 Connection conn=DriverManager.getConnection(“”); 3.创建声明(Statement/PreparedStatement 对象) 4.执行 sql 语句,获得结果集(ResultSet),进行结果集的处理 5.关闭结果集 6.关闭声明 7.关闭连接,释放资源

2. Statement 和 PreparedStatement 的区别 1)Statement 是 PreparedStatemnet 的父类 2)Statement 是直接发送 sql 语句到数据库,事先没有进行预编译,PreparedStatement 会将 sql 进行预编译,当 sql 语句要重复执行时,数据库会调用以前编译好的 sql,所以PreparedStatement 在性能方面会更好 3)PreparedStatement 在执行 sql 时,对传入的参数进行强制类型转换,以保证数据格式与底层数据库格式一致。 4)PreparedStatement 相对于 Statemnet 要安全一些,可以有效防止 sql 注入.

3. JAVA 中如何进行事务的处理? setAutoCommit():设置是否自动提交事务,默认为自动提交事务,即为 true。 commit():提交事务; rollback():回滚事务。

4.数据库连接池的工作机制: J2EE 服务器启动的时候,会创建一定数量的池连接,并维持不少于此数量的池连接。程序需要时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动会新建一批,数量由配置参数决定。当调用池连接完成后,池驱动将此连接标记为空闲,其他调用就可以使用这个连接。

四、HTML/CSS/JavaScript 部分

1.一个完整的网页由结构、表现、行为组成。 结构指 HTML、XHTML、XML 等 表现指 CSS 样式 行为指 脚本(JS)

2.什么是 HTML? 超文本标记语言。

3.Html 基本结构:

代码语言:javascript复制
<html> <head><title></title></head><body></body></html>
1

4.设置隐藏文本框:

代码语言:javascript复制
<input type="hidden" name="id">
1

设置只读文本框:

代码语言:javascript复制
<input type="text" readonly="readonly" name="username">
1

5. ” == ” 和” === ”有什么区别?

== : 等于 比较的是值

=== :绝对等于 不仅比较值,还要比较类型

6.获得对象: document.getElementById(“id”); 获得对象的值: document.getElementById(“id”).value

7.文本元素包括什么? 标题元素 段落元素 列表元素 分区元素 行内元素

8.怎么引入一个 js 文件?怎么引入一个 css 文件? 在 script 中使用 src;使用 link

9. Undefined:未定义 (1)声明但没有赋值 (2)没有声明的变量

五、Servlet&Jsp 部分:

1.servlet 的生命周期 (1)web 容器加载 servlet,生命周期开始。 (2)通过调用 servlet 的 init()方法进行 servlet 的初始化。 (3)通过调用 service()方法实现,根据请求的不同调用不同的 doGet()或者 doPost()方法。 (4)结束服务,web 容器调用 servlet 的 destroy()方法。

2.请简单阐述什么是 Servlet?什么是 jsp?二者有什么区别与联系? Servlet:全称 Java Servlet,是用 Java 编写的服务器端程序。其主要功能在于交互式的浏览和修改数据,生成动态 Web 内容。 Jsp:全称 Java Server Page,是 Sun 公司提供的一种服务器端动态页面技术规范。 联系:jsp 是 Servlet 技术的扩展,其本质就是 Servlet,jsp 经编译后形成“Servlet 类”。 区别: 1)Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 里分离开来。 而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。 2)jsp 更擅长于页面显示,Servlet 更擅长于逻辑控制。 3)jsp 有内置对象,Servlet 没有。

3 .jsp 有哪些内置对象?作用分别是什么? 答:JSP 共有以下 9 种基本内置组件: (1)request 客户端请求,此请求包含来自 GET/POST 的请求参数 (2)response 响应客户端的请求的有关信息。 (3)session 指客户端与服务器的一次会话 (4)out 是向客户端输出内容常用的对象 (5)page 它指当前 JSP 页面本身,有点类似于 this (6)application 实现用户间的数据共享,可以改变全局变量 (7)exception 它是一个异常对象,当一个页面的运行过程中发生异常时产生 (8)pageContext 它提供了对 JSP 页所有对象及名字空间的访问。 (9)config 它是在一个 Servlet 初始化时,JSP 引擎向它传递信息用的。

4.转发(forward)和重定向(redirect)的区别? forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect 就是服务端根据逻辑,发送一个 302 状态码和 Location,告诉浏览器重新去请求那个地址。 具体区别如下: (1)转发在服务器端完成的;重定向是在客户端完成的 (2)转发的速度快;重定向速度慢 (3)转发的是同一次请求;重定向是两次不同请求 (4)转发不会执行转发后的代码;重定向会执行重定向之后的代码 (5)转发地址栏没有变化;重定向地址栏有变化 (6)转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

5.get 和 post 的区别?

  • GET⽅式是通过请求⾏传递⽤户所输⼊的内容,其内容会全部显⽰的浏览器的地址栏中;
  • GET提交具有⻓度限制:get 传输的数据量小,这主要是因为受 URL 长度限制
  • GET是从服务器上获取数据,get 参数通过 url 传递
  • GET请求没有HTTP消息体
  • POST提交将⽤户所输⼊数据放到HTTP消息体中发送到服务器端,post 放在 request body 中
  • POST没有提交⻓度限制: post 可以传输大量的数据,所以在上传文件只能使用 Post
  • POST是向服务器传送数据
  • GET比 POST更不安全,因为参数直接暴露在 url 中,所以不能用来传递敏感信息

6.Tomcat 常用的部署方式有哪些? (1)在 confCatalinalocalhost 目录下添加.xml 配置文件 (2)修改 server.xml 文件进行部署 (3)将项目拷贝到 webapps 目录下

7.什么是 cookie?什么是 session?二者的区别是什么? cookie(cookies)是服务器在本地机器上存储的小段文本,并随每一个请求发送至同一服务器,是在客户端保持状态的方案。 session 是一次浏览器和服务器的交互的会话,是在一次会话中解决 2 次 HTTP 的请求之间的关联问题,让它们产生联系,让两个页面都能读取到这个全局的 session 信息。 区别: 1、Cookie 和 Session 都是会话技术,Cookie 是运行在客户端,Session 是运行在服务器端; 2、session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象; 3、Cookie 有大小限制(单个 cookie 保存的数据不能超过 4k),而且浏览器在存 cookie 的个数也有限制(很多浏览器都限制一个站点最多保存 20 个 cookie);Session 没有大小限制,和服务器的内存大小有关; 4、Cookie 有安全隐患,通过拦截或本地文件找得到你的 cookie 后可以进行攻击; 5、Session 是保存在服务器端上会存在一段时间才会消失,如果 session 过多会增加服务器的压力。

六、框架部分

1. 什么是 MVC?MVC 分别代表什么? MVC 是一种编程模式。 M——Model——模型(封装业务逻辑) V——View——视图(实现表示逻辑) C——Controller——控制器(协调模型和视图)

2.使用 MVC 的目的是什么?优点,缺点各是什么? 使用 MVC 思想来设计软件,最根本的目的是为了实现模型的复用。 1)优点: ①可以实现模型的复用。 ②模型或者视图发生改变,不会相互影响。 ③方便测试(比如,将业务逻辑写在 Java 类里面,可以直接测试,如果写在 Servlet 里面,必须要先部署才能测试)。 2)缺点:使用 MVC 后, ①会增加设计的难度。 ②代码量也会增加。 ③相应地也会增加软件的开发成本。

3.介绍一下 SpringMVC 的工作原理 1).SpringMVC 将所有的请求都提交给 DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。 2).DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller. 3).DispatcherServlet 将请求提交到目标 Controller 4).Controller 进行业务逻辑处理后,会返回一个 ModelAndView 5).DispatcherServlet 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象 6).视图对象负责渲染返回给客户端。

4. 什么是 Spring?为什么要用 spring? Spring 是一个开源的轻量级的 IOC 和 AOP 框架。其本质是管理软件中的对象,即创建对象和维护对象之间的关系。 IOC(控制反转):是指程序中的对象的获取发生反转,把创建对象的权利交给框架,是框架的重要特征。它包括依赖注入和依赖查找。 AOP(面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

5.拦截器(Interceptor)和过滤器(Filter)的区别? 1)拦截器是 Spring MVC 中的,仅当使用这个框架时可以使用,而过滤器是 Java EE 体系的,无论使用哪种框架,都可以使用过滤器; 2)过滤器会在所有的 Servlet 之前运行,而拦截器会在 Spring MVC 中的 DispatcherServlet 之后运行,所以,过滤器在项目中可以过滤任何请求(只要是配置了对应的路径的),而拦截器只能在 DispatcherServlet 处理的请求的基础之上进行拦截。

6.Spring 和 SpringMVC 是什么关系? Spring 是轻量级开源框架,是为了解决企业应用开发的复杂性,其核心是:IOC,AOP. springMVC 是基于 Spring 实现的一个表示层应用组件,其人为的把项目分成 Model、View、Controller 三层,方便代码的维护和管理。

7.什么是 mybatis?使用 mybatis 的好处是什么? 答:封装了 JDBC 的代码。 好处:使用简单的 xml 或注解做配置和定义映射关系,sql 语句可以独立封装在一个 xml 映射文件里。

8.Java 中都有哪些常用的设计模式? Factory(工厂模式),Singleton(单例模式),Proxy(代理模式)等。

9.spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了 AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring 对于主流的应用框架提供了集成支持,如 hibernate,JPA,Struts 等 7.spring 属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring 的 DI 机制降低了业务对象替换的复杂性 10.Spring 的高度开放性,并不强制应用完全依赖于 Spring,开发者可以自由选择 spring 的部分或全部

10.什么是 DI 机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在 spring 中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由 spring 来完成,然后注入调用者,因此也称为依赖注入。 spring 以动态灵活的方式来管理对象, 注入的两种方式:设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造器中决定依赖关系的顺序。

11.什么是 AOP? 面向切面编程(AOP)完善 spring 的依赖注入(DI),面向切面编程在 spring 中主要表现为两个方面: 1.面向切面编程提供声明式事务管理 2.spring 支持用户自定义的切面 面向切面编程(aop)是对面向对象编程(oop)的补充,面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP 从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop 是静态的抽象, AOP是动态的抽象,是对应用执行过程中的步骤进行抽象,从而获得步骤之间的逻辑划分。

12.AOP框架具有的两个特征: 1.各个步骤之间的良好隔离性 2.源代码无关性 4. 应用服务器有哪些:weblogic ,jboss ,tomcat

13.什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式处理方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

14.Spring Boot 需要独立的容器运行吗? 可以不需要,内置了 Tomcat/ Jetty 等容器。

15.开启 Spring Boot 特性有哪几种方式? 1)继承 spring-boot-starter-parent 项目 2)导入 spring-boot-dependencies 项目依赖

16.运行 Spring Boot 有哪几种方式? 1)打包用命令或者者放到容器中运行 2)用 Maven/ Gradle 插件运行 3)直接执行 main 方法运行

17.Spring Boot 可以兼容老 Spring 项目吗,如何做? 可以兼容,使用@ImportResource 注解导入老 Spring 项目配置文件。

18.springboot 读取配置文件的方式 springboot 默认读取配置文件为 application.properties 或者 application.yml

19.RequestMapping 和 GetMapping 的不同之处在哪里? RequestMapping 具有类属性的,可以进行 GET,POST,PUT 或者其它的注释中具有的请求方法。 GetMapping 是 GET 请求方法中的一个特例。它只是 ResquestMapping 的一个延伸,目的是为了提高清晰度。

20.SpringBoot 框架的优点(为什么要使用 SpringBoot 框架): 1.创建独立的 Spring 应用程序 2.嵌入的 Tomcat,无需部署 WAR 文件 3.简化 Maven 配置 4.自动配置 Spring 5.去除了大量的 xml 配置文件

21.Spring注入bean的方式及Java代码 Spring提供了多种方式来注入bean,包括构造函数注入、属性注入、方法注入、注解注入等

  • 构造函数注入
代码语言:javascript复制
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
   
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // other methods...
}
123456789
  • 属性注入
代码语言:javascript复制
public class UserController {
    @Autowired
    private UserService userService;
    
    // other methods...
}
123456
  • 方法注入
代码语言:javascript复制
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // other methods...
}
12345678910
  • 注解注入
代码语言:javascript复制
@Component
public class UserRepositoryImpl implements UserRepository {
    // implementation...
}

@Component
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
    
    // other methods...
}
123456789101112

预祝家人们前程似锦,未来可期,面试成功!!!

0 人点赞