Java面试题
-
JRE:Java运行时环境,包含了Java虚拟机、Java基础类库
-
JDK:Java开发工具包,它包含了JRE,编译器和其他工具
-
如果需要运行java程序,只需要安装JRE就可以了。
-
如果需要编写java程序,需要安装JDK
-
JAVA_HOME ----> JDK的安装目录
2、== 和 equals 的区别是什么?
-
==比较的是地址
-
equals 比较的是 两个对象的内容
3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
-
是相同,因为 equals() 比较的是两个对象的内容,hashCode相同说明值相同
4、final 在 java 中有什么作用?
-
final可以修饰类,这样的类不能被继承,比如String类
-
final可以修饰方法,这样的方法不能被重写
-
final可以修饰变量,这样的变量的值不能被修改
5、java 中的 Math.round(-1.5) 等于多少?
-
-1
-
Math.round() 的返回值类型是long
-
Math.round(11.5f),那它的返回值类型是int,取值向正无穷方向取舍
-
-
Math.round(11.5) --> 12
-
Math.round(-11.5) --> -11
-
Math.round(0.5) --> 1
-
Math.round(-0.5) --> 0
6、String 属于基础的数据类型吗?
-
String 是引用类型
-
基础的数据类型有:byte、short、int、long、Boolean、double、float、char
-
7、基础类型与引用类型的区别:
-
基础类型只表示简单的字符或数字
-
引用类型可以是任何复杂的数据结构
8、java 中操作字符串都有哪些类?它们之间有什么区别?
-
String
-
一旦被创建,就不能修改它的值
-
适用于少量的字符串操作的情况
-
-
StringBuffer
-
StringBuffer是线程安全的
-
-
StringBuilder
-
StringBuilder是线程不安全的
-
运行速度比StringBuffer快
-
9、String str="i"与 String str=new String("i")一样吗?
-
不一样
-
String str = 'i' 先去内存中找是否存在 ’i‘ 这个字符串,若是存在,则将地址引用,不存在则创建。
-
String str = new String('i'),不管事先是否存在’i‘ 每次都会创建其新的对象
10、如何将字符串反转
-
调用StringBuffer类中的reverse方法
-
String str = "abc";
StringBuffer sb = new StringBuffer(str);
System.out.println(sb.reverse());
-
-
通过charAt(int index)返回char值进行字符串拼接
-
String str = "abc";
String reverse = "";
for (int i = 0; i <str.length() ; i++) {
reverse = +str.charAt(i) + reverse ;
}
-
11、String 类的常用方法都有那些?
-
length(): 返回字符串长度
-
charAt():返回指定索引处的字符
-
substring():截取字符串
-
concat():拼接字符串
-
indexOf():返回指定字符的索引
-
toLowerCase():将字符串转成小写字母
-
toUpperCase():将字符串转成大写字母
-
replace():字符串替换
-
trim():去除字符串两端空白
-
split():分割字符串,返回一个分割后的字符串数组
-
format():格式化字符串
-
equals():字符串比较
12、抽象类必须要有抽象方法吗?
-
抽象类可以没有抽象方法
-
抽象方法不能声明为静态
-
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译不通过
13、普通类和抽象类有哪些区别?
-
抽象类不能被实例化
-
抽象方法不能被声明为静态
14、抽象类能使用 final 修饰吗?
-
不能
-
抽象类所抽取的我们关注的共同特征所形成的基类,如果不能继承这个抽象类将是无意义的
15、接口和抽象类有什么区别?
-
抽象类使用 abstract 关键字 继承
-
接口使用 implements 关键字 实现
-
接口中不能有方法体
-
抽象类中可以有方法体
-
抽象类可以继承一个类实现多个接口
-
接口只可以继承一个或多个其他接口
-
抽象类中添加新方法,只需提供默认的实现,不需要改变你现在的代码
-
接口中添加新方法,那你必须改变实现该接口的类
-
抽象类除了不能被实例化,和普通Java类没有区别
-
接口是完全不同的类型
16、java 中 IO 流分为几种?
-
按流向分
-
输入流
-
输出流
-
-
按类型分
-
字节流
-
字符流
-
17、BIO、NIO、AIO 有什么区别?
-
BIO
-
同步阻塞
-
第一次请求还没有结束的话,后面的请求就一直等待
-
-
NIO
-
同步非阻塞
-
将每一个请求分配给一个线程来单独处理
-
-
AIO
-
异步非阻塞
-
18、File的常用方法都有哪些?
-
createNewFile 指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
-
mkdir 指定位置创建一个单级文件夹。
-
mkdirs 指定位置创建一个多级文件夹。
-
delete 删除文件或者一个空文件夹,不能删除非空文件夹,马上删除文件,返回一个布尔值
-
exists 文件或文件夹是否存在。
-
isFile 是否是一个文件,如果不存在,则始终为false
-
getName 获取文件或文件夹的名称,不包含上级路径。
-
getAbsolutePath 获取文件的绝对路径,与文件是否存在没关系
-
getParent 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null
19、java有多个访问修饰符?各有什么含义?
-
public 公开的 任何一个类都可以访问
-
private 私有的 只能在本类访问
-
default 默认的 只能被同一个包中类访问
-
protected 受保护的 同包和继承的类可以访问
20、什么是继承?
-
继承是面向对象实现软件复用的重要手段,当子类继承父类,可直接或者间接获取父类里的成员
21、什么是封装?
-
封装是指将对象的实现细节隐藏起来,通过公共方法暴露出该对象的功能
22、什么是多态?
-
多态指的是同一行为具有多个不同表现形态和状态的能力
23、方法重载与重写有什么区别?
-
重写(Override)发生在继承中
-
方法名称、参数类型、返回值类型全部相同
-
-
重载(Overload)发生在一类中
-
方法名相同、参数的类型或个数不同
-
24、抽象类与接口 相同与不同之处? 他们分别什么时候使用?
相同处:
不相同处:
-
子类需要使用extends关键字来继承抽象类
-
接口子类使用implements来实现接口
-
抽象类可以有构造器,接口不能有构造器
-
抽象类除了不能实例化之外和普通的java类没有区别
-
接口是完全不同的类型
如果想实现多重继承,则使用接口
如果基本功能在不断改变,则使用抽象类
25、什么是类?
-
类是一个模板,它描述着一类对象的行为和状态
26、什么是对象?
-
对象是类的一个实例,有状态、行为,客观存在的事物都可以成为对象(万物皆对象)
27、构造函数的作用是什么?
-
对类进行初始化
28、局部变量 实例变量 类变量 全局变量
-
局部变量
-
在方法或者代码块中,或者方法的声明上(即在参数列表中)
-
-
实例变量
-
在类的声明中,属性是使用变量来表示的。称为实例变量
-
-
类变量(静态变量)
-
独立于方法之外的变量
-
-
全局变量
-
在函数外部定义的变量 称为全局变量
-
29、Java是什么?
-
Java是一门面向对象编程语言
-
Java的优点
-
简单、安全、稳定、跨平台
-
-
Java缺点
-
需要运行环境、不合适开发桌面应用程序
-
-
30、Java的特性是什么?
-
封装
-
将对象的实现细节隐藏起来,通过公共方法暴露出该对象的功能
-
-
继承
-
继承是面向对象实现软件复用的重要手段,当子类继承父类后,可直接或间接获取父类里的成员
-
-
多态
-
同一行为具有多个表现形式和状态的能力
-
-
抽象
+是指定从特定的角度出发,从已存在的一些事物中抽取我们所关注的特性、行为从而成一个新事物的思想过程
31、SE、EE、ME
-
SE
-
用于桌面或简单的服务器应用的Java平台
-
-
EE
-
用于复杂的服务器应用Java平台
-
-
ME
-
用于手机和其他小型设备的Java平台
-
32、面向对象 和 面向过程的区别?
-
面向过程
-
面向过程是一种站在过程的角度思考问题的思想,强调的是功能行为,功能的执行过程
-
-
面向对象
-
面向对象是一种基于面向过程的新编程思想,是一种站在对象的角度思考问题,我们把多个功能台合理的放到不同对象,强调的是具备某些功能的对象
-
33、基础数据类型
-
byte
-
short
-
int
-
float
-
double
-
long
-
char
-
boolean
对于 byte、short、int、double、float、long等基本数据类型的变量来说会默认初始化为0(boolean变量默认初始化为false)
对于引用类型的变量,会默认初始化为null
34、什么是 Java Ide?
-
IDE是集成开发环境,简单来说就是Java开发工具,比如IDEA、Eclipse
35、什么是B/S架构?
-
浏览器和服务器架构模式
37、什么是C/S架构
-
客户端/服务端架构模式
38、什么是JVM?
-
java虚拟机,运用硬件或者软件手段实现的虚拟的计算机
39、Java虚拟器包括什么?
-
寄存器、堆栈、处理器
40、Java是否需要开发人员回收内存垃圾吗?
-
大多情况下是不需要的。Java提供了一个系统级的线程来跟踪内存分配,不再使用的内存区将会自动回收
41、Java的数据结构有哪些?
-
线性表 (ArrayList)
-
链表 (LinkedList)
-
栈 ( Stack )
-
队列 ( Queue )
-
图 ( Map )
-
树 ( Tree )
42、类与对象的关系?
-
类是对象的抽象,对象是类的具体,类是对象的模板,对象是类的实例
43、什么是隐式转换?
-
大范围的变量能够接受小范围的数据
44、什么是显示转换?
-
把一个大类型的数据强制赋值给小类型的数据
45、什么是拆装箱?
-
拆箱:把包装类型转成基本数据类型
-
装箱:把基本数据类型转成包装类型
46、一个Java类中包含哪些内容?
-
属性、方法、内部类、构造方法、代码块
47、if ( a +1.0 == 4.0 ) ,这样做好吗?
-
不好,因为计算机在浮点型数据运算的时候,会有误差,尽量在布尔表达式中不使用浮点型数据
48、针对浮点型数据运算出现的误差的问题,你怎么解决?
-
使用 Bigdecimal 类 进行 浮点型数据的运算
49、 ++i 与 i++ 的区别?
-
i ++ ,先运算,后赋值
-
++ i ,先赋值,后运算
50、程序的结构有哪些?
-
顺序结构
-
选择结构
-
循环结构
51、数组实例化有几种方式?
-
静态实例化:创建数组的时候已经指定数组中的元素
-
int[] a = new int[]{1,2,3,4};
-
-
动态实例化:实例化数组的时候,只指定了数组长度
52、Java常用包有哪些?
-
Java.lang
-
Java.IO
-
Java.sql
-
Java.util
-
Java.awt
-
Java.net
-
Java.math
53、Java最顶级的父类是哪个?
-
Object
54、Object类常用方法有哪些?
-
equals
-
hashcode
-
toString
-
wait
-
notify
-
clone
-
getClass
55、Java中没有有指针?
-
有指针,但是隐藏了,开发人员无法直接操作指针,由JVM来操作指针
56、Java中是值传递?还是引用传递?
-
理论上说,java都是引用传递,对于基本数据类型,传递是值的副本,而不是值的本身,对于对象类型,传递是对象的引用
57、假设数组内有5个元素,如果对数组进行反序,该如何做?
-
创建一个新数组,从后到前循环遍历每个元素,将取出的元素依次顺序放入新数组中
58、形参与实参
-
形参:是定义方法名和方法体的时候使用的参数,用于接收调用该方法时传入的实际值
-
比如 public void method(int a ,int b ); a,b就是形参
-
-
实参:是在调用方法时传递给该方法的实际值
-
如如 public void method( 1,2 );1,2就是实参
-
59、构造方法能不能显式调用?
-
不能将构造方法当成普通方法调用,只有在创建对象的时候它才会被系统调用
60、内部类与静态内部类的区别?
-
静态内部类相对于外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象访问。但是可以直接访问静态的变量、调用静态的方法
-
如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法
-
。。。
61、static 关键字有什么作用?
-
static 可以修饰内部类、方法、变量、代码块
-
static修饰的类是静态内部类
-
static修饰的方法时静态方法,表示该方法属于当前类的,而不属于某个对象的,静态方法也不能被重写,可以直接使用类名调用。在static方法中不能使用this或者supper关键字
-
staic修饰变量是静态变量或者叫类变量,静态变量被所有实例共享,不会依赖对象。静态变量在内存中只有一份拷贝,在JVM加载类的时候,只为静态分配一次内存
-
static修饰的代码块叫静态代码块,通常用来做程序优化,静态代码块中的代码在整个类加载的时候,只会执行一次,静态代码块可以有多个,如果有多个,按照先后顺序依次执行
62、final 在 java 中 的作用
-
final 可以修饰类,修饰方法,修饰变量
-
修饰的类叫最终类。该类不能被继承
-
修饰的方法不能被重写
-
修饰的变量叫常量,常量必须初始化,一旦初始化后,常量的值不能发生改变
63、String str = 'aa' ,String str = new String('aa'); 一样吗?
-
不一样的,因为内存分配的方式不一样
-
第一种,创建的 'aa' 是常量,jvm都将其分配在常量池中
-
第二种,创建的是一个对象,jvm将其值分配在堆内存中
64、String str ='aa' , String s ='bb' , String aa =aa + s ;一共创建了几个对象?
-
一共有两个引用,三个对象
65、Java中的math类有哪些常用方法?
-
pow() : 幂运算
-
sqrt() : 平方根
-
round():四舍五入
-
Abs() : 求绝对值
-
Random() :生成一个 0-1 的随机数,包括 0 不包括 1
66、判断两个对象是否相同,能使用equals比较吗?
-
不能,equals大多用来做字符串比较,要判断基本数据类型或者对象类型,需要使用 ==
67、 == 与 equals 有什么区别?
-
== 可以判断基本数据类型值是否相同,也可以判断两个对象指向的内存地址是否相同,也就是说判断两个对象是否同一个对象,equals通常用来做字符串比较
68、如何将字符串反转?
-
StringBuilder 和 StringBuffer 的 revers 方法
69、Java中的继承是单继承还是多继承?
-
Java中既有单继承,又有多继承,对于Java类来说只能有一个父类,对于接口来说可以同时继承多个接口
70、创建一个子类对象的时候,父类的构造方法会执行吗?
-
会执行,当创建一个子类对象,调用子类构造方法的时候,子类构造方法会默认调用父类的构造方法
71、什么是父类引用指向子类对象?
-
是java多态一种特殊的表现形式,创建父类引用,让该引用指向一个子类的对象
-
比如 类A ,B类继承了类A,
-
A a =new B(); 这就称父类的引用a 指向了子类的对象 new B()
-
72、当父类引用指向子类对象的时候,子类重写了父类方法和属性,那么当访问属性的时候,访问是谁的属性?调用方法时,调用的是谁的方法?
-
子类重写了父类方法和属性,访问的是父类的属性,调用的是子类的方法
73、Supper 与 this 表示什么?
-
supper 表示当前类的父类对象
-
this表示当前类的对象
74、接口有什么特点?
-
接口中声明全是public static final 修饰的常量
-
接口中所有方法都是抽象方法
-
接口中是没有构造方法
-
接口也不能直接实例化
-
接口可以多继承
75、除了使用new创建对象之外,还可以用什么方法创建对象?
-
Java反射
76、Java反射创建对象效率高还是通过new创建对象的效率高?
-
通过new创建对象的效率比较高
-
通过反射时,先找类资源,使用类加载器创建,过程比较繁琐,所以效率低
77、Java 中集合框架的有几个?
-
Collection、Map
78、Collection接口下有哪些集合框架?
-
List :线性表
-
Set:无序集合
79、List接口有什么特点?
-
顺序存储、可以有重复值
80、Set接口有什么特点?
-
无序存储、不能有重复值
81、ArrayList 和 LinkedList有什么区别?
-
ArrayList 与 LinkedList 都实现了List接口
-
ArrayList是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高
-
LinkedList是双向链表,它在中间插入或者插入是效率较高,在访问数据时效率较低
82、Array 与 ArraList 有什么区别?
-
Array 与 ArrayList 都是用来存储数据的集合。ArrayList底层是使用数组实现的,但是ArrayList对数组进行了封装和功能扩展
83、Map有什么特点?
-
以键值对存储数据
-
元素存储循序是无序的
-
不允许出现重复键
84、JDBC操作的步骤
-
加载数据库驱动
-
打开数据库连接
-
执行sql语句
-
处理返回结果
-
关闭资源
85、在使用jdbc的时候,如何防止出现sql注入问题?
-
使用 PreparedStatement 类
86、怎么在JDBC 调用 存储过程?
-
使用 CallableStatement
87、& 和 && 的区别?
-
&是位运算。
-
条件 全部要执行
-
比如 if ( a==b & a==c ) 这里面两个条件都要执行
-
-
-
&& 是布尔逻辑运算符
-
第一个条件通过,后面的条件就不管了
-
比如 If( a==b &&a==c ) 当 a==b 结果为false时, a==c 条件就不执行了
-
-
容器
1、java 容器都有哪些?
-
数组、String、java.util下的集合容器
反射
1、什么是反射?
-
指程序可以访问、检测和修改它本身状态或行为的一种能力
2、什么是 java序列化?
-
序列化:把Java对象转换为字节序列的方法
3、什么情况下需要序列化?
-
把对象的字节序列化到永久的保存到硬盘中
-
在网络上传递对象的字节序列
4、动态代理是什么?有哪些应用?
-
动态代理 指的是 可以任意控制任意对象的执行过程
-
本来应该自己做的事情,因为没有某种原因不能直接做,只能请别人代理做。被请的人就是代理
-
比如春节买票回家,由于没有时间,只能找票务中介来买,这就是代理模式。
-
-
应用: Spring的AOP
5、怎么实现动态代理
-
jdk动态代理
-
cglib动态代理
MySQL
1、自定义函数
-- 函数 --> 模块化,封装,代码复用
create function 函数名([参数列表]) returns 数据类型
begin
SQL语句;
return 值;
end;
示例:
--最简单的仅有一条sql的函数
create function myselect1() returns int return 666;
--调用
select myselect1();
--带传参的函数
create function mysql(name varchar(15)) returns int
begin
return (select id from table_name where column_name = name);
end;
--调用
select mysql("张三");
2、存储过程
-- 存储过程 --> 一组为了完成特定功能的SQL语句集
-- IN 传入参数
delimiter //
create procedure mysql (
IN id int
)
begin
select * from table_name where id = id;
end;
//
delimiter;
--其中in是传进去的变量;
drop procedure mysql;//销毁这个存储过程
--调用存储过程
call mysql(1);
-- OUT 输出参数
delimiter //
create procedure demo
(in id1 int,OUT ids int)
begin
select id into ids from users where id = id1;
select ids;
end
//
delimiter ;
--调用
set @result;
call demo(1,@result);
--INOUT输入输出
delimiter //
create procedure demo (inout ids int)
begin
select id into ids from users where id =ids;
select ids;
end
//
delimiter ;
--调用
set @result1 =2;
call demo(@result1);
3、视图
-- 视图就是一条select 语句 执行后返回结果集,是一种虚拟表,是一个逻辑表
-- 方便操作,减少复杂的SQL语句,增加可读性,更加安全一些
create view demo_view
as
select u.id,u.name,n.stuNo from users u inner join number n on u.stuId=n.id;
--调用
select * from demo_view;
--删除
drop view demo_view;
4、索引
-- 索引分类?
1、普通索引 2、唯一索引 3、全文索引 4、组合索引
普通索引:仅加速查询,最基本的索引,没有任何限制
唯一索引:加速查询 + 列值唯一(可以有null)
全文索引:仅适用于MyISAM引擎的数据表,作用于char、varchar、text数据类型的列
组合索引:将几个列作为一条索引进行检索,使用最左匹配原则
--索引用于快速找出在某个列中有一特定值的行,不使用,MySQL必须从第一条记录开始读完整个表
-- 优点
1、所有的MySQL列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引
2、大大加速数据的查询速度
-- 缺点
1、创建索引和维护索引要耗费时间
2、对表的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度
create table healerjean (
id int AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
name VARCHAR(32) NOT NULL COMMENT '姓名',
email VARCHAR(64) NOT NULL COMMENT '邮箱',
message text DEFAULT NULL COMMENT '个人信息'
#INDEX index_name (name) COMMENT '索引name'
) COMMENT = '索引测试表';
--给已创建的表 添加索引
create index index_name on healerjean(name);
--删除索引
drop index index_name on healerjean;
5、触发器
-- 监视某种情况,并触发某种操作
--触发器创建语法四要素
1、监视地点
2、监视事件
3、触发时间
4、触发事件
-- 触发器只能创建在永久表上,不能对临时表创建触发器
create trigger 触发器名称
after/before insert/update/delete on 表名
for each row #这句话在mysql是固定的
begin
sql语句;
end;
示例:
delimiter //
create trigger trigger_demo before insert on demo1
for each row
begin
insert into demo1(name) values('触发器修改啦...');
end
//
delimiter ;
--删除触发器
drop trigger trigger_demo;
SQL Server 中 Order by 排序
-
select * from 表名 order by 字段名 (升序)
-
select * from 表名 order by 字段名 desc (降序)
SQL Server 与 MySQL 简单分页查询
-
sql server : select top 10 * from 表名
-
sql server: select * from 表名 order by 字段名 offset 10 rows Fetch next 10 rows only
-
mysql : select * from 表名 limit 页数,条数
SQL查询语法
-
select * from a inner join b on a.id=b.aId; (内连接)
-
select * from a left join b on a.id = b.aId;(左连接)
-
select * from a right join b on a.id = b.aId;(右连接)
-
(select * from a left join b on a.id = b.aId) union (select * from a right join b on a.id = b.aId);(全连接)
行列转换
create table t_score
(
name varchar(20) ,
subject varchar(20),
score float
)default charset=utf8;
INSERT INTO `t_score` VALUES
('王海', '语文', '86'),
('王海', '数学', '83'),
('王海', '英语', '93'),
('陶俊', '语文', '88'),
('陶俊', '数学', '84'),
('陶俊', '英语', '94'),
('刘可', '语文', '80'),
('刘可', '数学', '86'),
('刘可', '英语', '88'),
('李春', '语文', '89'),
('李春', '数学', '80'),
('李春', '英语', '87');
要求实现的效果:
select name, max(case subject when '语文' then score end) as 语文 , max(case subject when '数学' then score end) as 数学, max(case subject when '英语' then score end) as 英语, sum(score) 成绩 from t_score group by name union all select 'TOTAL', sum(case subject when '语文' then score end), sum(case subject when '数学' then score end), sum(case subject when '英语' then score end), sum(score) from t_score;
2、求出每科每门成绩大于等于80分的人名字
select * from t_score group by name having min(score) >=80;
多线程
1、什么是线程?
-
线程有时被称为经量级进程,是程序执行流的最小单位
-
线程是CPU调度的一个基本单位
2、什么是进程?
-
进程是系统中正在运行的一个程序,程序一旦运行就是进程
3、什么是多线程?
-
多线程是指从软件或者硬件上实现多个线程并发执行的技术
4、并行 和 并发的区别?
-
并行:是两个任务同时运行(需要多核CPU)
-
比如我跟两个网友聊天,左手操作一个电脑跟甲聊,同时右手用另一台电脑跟乙聊天
-
-
并发:指两个任务都请求运行,而处理器只能接受一个任务,就把这个两个任务安排轮流进行。
-
如果用一台电脑我先给甲发个消息,然后立刻再给乙发消息,然后再跟甲聊,再跟乙聊。
-
5、进程和线程的区别?
-
地址空间:同一进程的线程共享本进程的地址空间,进程之间则是独立的地址空间
-
资源拥有:同一进程内的线程共享本进程的资源,进程之间的资源是独立的
-
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉,多进程要比多线程健壮
-
线程是处理器调度的基本单位,进程不是
6、创建线程几种方式?
-
继承 Thread 类
-
实现Runnable 接口
-
实现Callable 接口
7、什么是守护线程?
-
守护线程是个服务线程,服务于其他线程
-
典型案例:垃圾回收线程
-
8、什么是用户线程?
-
用户线程就是应用程序里的自定义线程
9、线程有哪些状态?
-
新建状态
-
就绪状态
-
运行状态
-
阻塞状态
-
死亡状态
10、sleep() 方法 和 wait() 有什么区别?
-
sleep() 可以在任何地方使用
-
wait() 只能在同步方法或同步块中使用
11、notify 和 notifyAll 有什么区别?
-
notify是唤醒某个线程
-
notifyAll是唤醒所有暂停线程
12、线程的 run()和 start()有什么区别?
-
run() 相当于线程的任务处理逻辑的入口方法
-
start() 的作用是启动相应的线程
13、ThreadLocal 是什么?有哪些使用场景?
-
ThreadLocal用于保存某个线程共享变量
-
使用场景:解决数据库连接,Session管理
Java Web
1、jsp 和 servlet 有什么区别?
-
jsp经编译后就成了Servlet(Jsp的本质就是Servlet,JVM只能识别Java类,不能识别Jsp代码,Web容器将Jsp的代码编译成JVM能够识别的java类)
-
jsp更擅长表现于页面显示,servlet更擅长于逻辑控制
-
Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。
2、session 和 cookie 有什么区别?
-
cookie 以文本格式存储在浏览器上,存储量有限
-
session存储在服务端,可以无限量存储多个变量并且比cookie更安全
异常
1、throw 和 throws 的区别?
-
throw则是指抛出的一个具体异常类型
-
throws是用来声明一个方法可能抛出的所有异常信息
2、异常是什么?
-
异常是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流
3、异常处理的几个关键字有哪些?
-
try、catch、finally、throw、throws
4、运行时异常都是什么异常类型的子类?
-
Exception异常类
5、检查异常是什么?
-
简单来说,你代码还没有运行,编码器就会检查你的代码,对可能出现的异常必须做出相对的处理
6、有哪些常见的检查异常?
-
除了 RuntimeException与其子类,以及错误(Error).其他的差不多都是检查异常
7、异常传播
-
这个从异常抛出到控制转移给合适的异常处理语句的过程就叫做异常传播
8、final、finally、finalize 有什么区别?
-
final 用来修饰类、方法、变量
-
finally 只能用在 try catch 语法中,表示这段语句最终一定会被执行
9、try-catch-finally 中哪个部分可以省略?
-
catch和finally语句不能同时省略
网络
1、http 响应码 301 和 302 代表的是什么?有什么区别?
-
301表示网页永久性转移到另一个地址
-
302表示临时性转移
-
区别
-
301是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址
-
302重定向是临时的重定向,搜索引擎抓取新的内容而保留旧的网址
-
2、forward 和 redirect 的区别?
-
forward是服务器内部重定向
-
redirect是服务器收到请求后发送一个状态头给客户,客户将再请求一次
3、get 和 post 请求有哪些区别?
-
get请求的参数包含在URL中
-
post请求参数是放在请求body中
-
get请求传参有长度限制,post请求没有长度限制
-
get请求的参数只能是ASCII码,post请求传参没有这个限制
4、如何实现跨域?
-
使用CORS技术
-
使用JSONP
5、什么是json?
-
json是一种经量级的数据交换格式
概念
1、AOP:面向切面编程
-
通过预编译方式 和 运行期动态代理 实现程序功能的统一维护的一种技术
-
利用AOP
-
将业务逻辑的各部分之间的耦合度降低
-
提高程序的可重用性
-
不干扰源码
-
2、IoC:控制反转
-
是面向对象编程的一种设计原则
-
可以减低代码之间的耦合度‘
-
IoC是一种描述通过第三方去产生或获取特定对象的方式
-
将类的创建 和 依赖关系 写在配置文件里,由配置文件注入,实现了松耦合
3、MVC:模型 - 视图 - 控制器
-
是一种软件规范
-
用一种 业务逻辑、数据、界面显示分离的方法组织代码
4、MVVM:模型 - 视图 - 视图模型
-
视图通过视图模型的dom监听将事件绑定到模型上,而模型则通过数据绑定来管理视图中的数据,视图模型从中起到一个连接桥的作用
5、RESTful
-
一种软件架构风格、设计风格、不是标准,只是提供了一组设计原则和约束条件
-
主要用于客户端和服务端交互类的软件
-
基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
6、Vue生命周期
-
beforeCreate、create、beforeMount、mounted、beforUpdate、update、beforDestroy、destroyed
7、MyBatis
-
MyBatis 是一个支持定制化SQL、存储过程以及高级映射的持久层框架
8、Hibernate
-
Hibernate是一个开放源码的对象关系映射框架,它对JDBC进行了简单封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架
9、ORM:对象关系映射
-
是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
10、OOP:面向对象编程
-
它是一种计算机编程架构
11、JPA:Java持久层API
-
是JDK注解或XML描述对象 - 关系表的映射关系