1、5个常用的java-api包
- Java.util包(List,set,Map)
- Java.lang包(String,Class<>,Lock)
- Java.sql(Date)
- Java.io(字节流,字符流)
- Java.net包(反射)
2、String类中常用的5个方法。
- Equals();
- Split();
- ToString()
- ToUpcase()
- toLowerCase()
3、TCP/IP、HTTP协议。
TCP:是传输层 面向连接的可靠传输协议
HTTP:是一种超文本传输协议,默认端口是80
IP:指的是主机的地址
4、集合相关的问题(重点)
5、HashMap、Hashtable、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的实现和区别之类的。
LinkedHashMap继承于hashMap的,hashMap是无序的,而LinkedHashMap是有序;的;
- HashMap线程不安全。
- HashTable线程安全,但性能差,不推荐使用。
- ConcurrentHashMap线程安全,在hashMap的基础上的。
- ConcurrentHashMap在Java7中使用segment实现,对每个segment加锁。
- ConcurrentHashMap在Java8中是直接在HashMap的基础上进行加锁
6、上述集合中的那些是线程安全的,那些不是。
Hashtable, ConcurrentHashMap是线程安全的,hashMap、LinkedHashMap、ArrayList、LinkedList是线程不安全的;
7、List、Map、Set三个接口,存取元素时,各有什么特点。
List:存储的是一组有序且不唯一的对象
Set存储的是一组无序且唯一的对象
Map:存储的是一组以键值对的key-value映射对象
8、创建线程的几种方式。
3种方式 Thread Runnable Callnable
9、线程同步的方法。
通过Object的wait和notify方法 synchronized()实现同步
同步:A线程请求某资源时,B线程正在使用此资源,由于是同步机制,所有A线程请求不到,A线程需要等待B线程执行完后才能使用;
异步:A线程请求某资源,B线程正在使用此资源,由于是异步机制,A线程仍然请求得到,A线程无需等待
特点:同步是安全机制,而异步是不安全的机制,容易导致出现死锁的现象
10、wait和sleep区别:
- wait是Object类的方法,sleep是Thead类的方法;
- Wait是释放线程对象锁,sleep是等待线程
- Wait会释放cpu的执行权,让给其他线程,sleep不会释放线程
11、Runnable接口和Callable接口的区别。
Runnable和Callable都是通过实现接口来完成线程程序的;
Runnable在实现线程过程中没有返回值,且不会抛出受检异常,而Callable会有返回值,且会抛出受检异常。
Runnale在java1.0就有了,而Callable在java1.5才有的;
12、如何实现线程安全。
- 1.使用synchronized修饰代码块;
- 2.创建Lock对象 lock() : 获得锁 unlock() : 释放锁
13、Mybatis#和$的区别
#{}是占位符处理,${}是字符串拼接
在处理#{}的时候会使用preparestatement对象的set来赋值,而处理${}的时候只是简单的将字符串拼接起来;
使用#{}可以防止SQL注入式攻击,有效的提高程序的安全性,
14、Hibernate和Mybatis的区别;
1.Hibernate是一个全自动的orm框架,Mybatis是一个半自动的orm框架。
2. hibernate中的SQL语句已经封装好了,直接使用即可,mybatis需要自己编写SQL;
3.hibernate是完整的orm框架,开发过程中,无需关注底层实现,只需要管理对象即可,mybatis需要自行管理和映射;
4,mybatis的移植性差,hibernate相对而言较好;
5.使用hibernate框架,sql语句难以优化和维护(很多SQL都是自动生成的),性能不是很好,而使用mybatis我们可以写出性能比较高的SQL语句
15、Hibernate的缓存机制。
Hibernate有一级缓存和二级缓存
Hibernate的一级缓存:是有session提供的缓存,它存在与session生命周期中,也就是session关闭缓存结束;
一级缓存就是 Session 级别的缓存,存在与session生命周期中,也就是session关闭缓存结束。
二级缓存是 SesionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。
16、什么是Hibernate延迟加载.
所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
17、为什么要用spring。
方便解耦,简化开发,使用spring可以由我们原来的需要自己手动创建对象,现在交由给spring容器去创建及注入;
18、SQL的考察
1.查询每个班级成绩最高的学生。
2.查找出每个班级成绩第二的学生。
3.按照班级查询每个班上总分前三的学生。
4.查找入职员工时间排名倒数第三的员工所有信息。
5.薪水排序后薪水排名在第2--8的员工。
6.按工资进行排名,排名从1开始,工资相同排名相同(如果两人并列第一则没有第二名,从第三名继续排)。
7.用一条sql语句取出所有姓名有重复的学员姓名和重复的记录数。
19、JSP的内置对象以及作用。
Request:只能在同一个请求中使用
Response::
Session :只能在同一个回话中使用
Application:做同一个项目中使用
Out:输出对象
Exception:
page:jsp页面本身
pageContext:页面的上下文
config :
20、JSTL的常用标签
<c:if><c:set><c:url><c:out>
21、Servlet的生命周期。
加载和实例化,初始化,处理请求 服务结束四个阶段;
Web容器启动,加载servlet,生命周期开始,首先服务器会调用servlet的构造方法执行实例化操作,然后调用init()执行初始化操作,请求到达时UR根据servlet的service()会自动调用与请求对应的doXX方法,来处理请求,当服务器决定将实例销毁前调用destroy()
22、URL和URI的区别。
URL是统一资源定位符
URI是统一资源标识符
23、Ajax同步和异步的区别。
同步:指的是修改页面的某一处需要重新加载整个页面;
异步:无需加载整个界面,实现部分内容更新
- 使用ajax发送异步请求的流程。
- 创建ajax异步对象
- 绑定监听事件
- 打开连接(创建请求)
- 发送请求
24、&和&&的区别。
两者都是逻辑运算符:&在做判断的时候只要处理的第一个值为true则不会操作第二个值;
&&在处理数据的时候,首选判断第一个数值是否为true,为true则处理第二个数值,为false则处理不会继续处理第二个数值;
25、==和equals的区别。
== 可以比较基本数据类型,比较基本数据类型是值是否相等,比较引用类型是地址是否相等;
Equals比较的是两个对象的地址是否相等;
26、int和Integer的自动拆箱/装箱相关问题。
将整数转换为包装类型就是装箱操作
将Integer转为int则是拆箱操作
27、IO和NIO的区别。
IO是面向流的操作
NIO是面向缓冲的操作
28、final、finally、finalize的区别
final用于修饰属性,方法,类 分别表示 属性不可改变,方法不可重写,类不可被继承
29、重载(Overload)和重写(Override)的区别。
重载:在同一个作用域中方法名相同,参数列表不同,与返回值和修饰符无关;
重写:重写与被重写的方法的名和返回类型必须一致,被重写的方法不能多于重写方法所抛出的异常,重写的方法访问修饰符不能小于被重写的访问修饰符
30、String、StringBuffer和StringBuilder的区别。
STRING作为不可变字符串,而stringbuffer和stringbuild对象
当我们的某些对象需要经常改变的时候我们可以使用stringbuffer,一些不需要常修改的字符串使用string
另外string对象提供了equlas方法而stringbuffer没有
String对象赋值之后,如果去修改的话,就会重新创建一个新的对象,而stringbuffer会用原来的对象
31、如何实现浅克隆和深克隆
深克隆:实现Cloneable接口后,重现clone的方法,回去属性的对象再克隆一次;
浅克隆:实现Cloneable接口后,直接调用clone方法进行克隆称之为浅克隆;
32、单例模式的实现以及最优。
/*
* 饿汉式的实现
*/
public class Student {
private static final Student s = new Student();public Student() {
}public static Student getInstance() {
return s;
}
}/**
* 懒汉式的实现
*
* @author lmj
*
* 2021年8月17日
*/
class Teacher {
private static Teacher te = null;public Teacher() {
}public static synchronized Teacher getInstance() {
if (te == null) {
te = new Teacher();
}
return te;
}
}
33、排序的实现(冒泡、选择、快速等)。
public class Sorted {
/**
* 冒泡排序从小到大
*/
public static void sorted() {
int[] arr = { 1, 6, 3, 7, 4, 5, 2, 9, 8 };
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];// 声明一个临时变量存放数据
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}}
}
System.out.println(Arrays.toString(arr));
}/**
* 冒泡排序从大到小
*/
public static void sorted() {
int[] arr = { 1, 6, 3, 7, 4, 5, 2, 9, 8 };
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j + 1] > arr[j]) {
int temp = arr[j + 1];// 声明一个临时变量存放数据
arr[j + 1] = arr[j];
arr[j] = temp;
}}
}
System.out.println(Arrays.toString(arr));
}}
34、去除重复的元素(实际是重写equals和hashcode)。
public class ListTest {
public static void main(String[] args) {
List<Teacher> list = new ArrayList<Teacher>();
list.add(new Teacher("aaa"));
list.add(new Teacher("bbb"));
list.add(new Teacher("ccc"));
list.add(new Teacher("ccc"));
list.add(new Teacher("aaa"));/**
* 使用hashSet去重
*/
Set<Teacher> set = new HashSet<Teacher>();
set.addAll(list);
for (Teacher t : set) {
System.out.println(t.toString());
}
}}