面经1------------------------------------------------------------------
1. list和set的区别
- list可以存储重复元素,set不能存储重复元素
- list可以存储多个null值,set只能存储一个null值
- list的存储顺序和插入顺序一致,set的存储顺序和插入顺序不一致
2. 写过切面类吗
- 横切关注点与业务逻辑无关,比如日志、声明式事务、安全等,都与业务逻辑无关,因此将这些东西抽象为单独的模块,就是切面类。
- Spring中的切面类需要两个注解,一个是@Component,将切面类加入IOC容器中,另一个是@Aspect,使其成为切面类
- 切面类中的功能被称为通知,分为五种:
(1)前置通知:在目标方法调用之前调用通知的内容
(2)后置通知:在目标方法完成之后调用通知的内容,不关心方法的输出是什么
(3)返回通知:在目标方法成功执行之后
(4)异常通知:在目标方法抛出异常后调用通知
(5)环绕通知:通知包裹了被通知的方法,在被通知方法调用之前和之后执行自定义的行为
@Component
@Aspect
public class LoggingAspect {
//现在想在实现类中的每个方法执行前、后、以及是否发生异常等信息打印出来,需要把日志信息抽取出来,写到对应的切面的类中 LoggingAspect.java 中
//要想把一个类变成切面类,需要两步,
//① 在类上使用 @Component 注解 把切面类加入到IOC容器中
//② 在类上使用 @Aspect 注解 使之成为切面类
/**
* 前置通知:目标方法执行之前执行以下方法体的内容
* @param jp
*/
@Before("execution(* com.svse.aop.*.*(..))")
public void beforeMethod(JoinPoint jp){
String methodName =jp.getSignature().getName();
System.out.println("【前置通知】the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
}
/**
* 返回通知:目标方法正常执行完毕时执行以下代码
* @param jp
* @param result
*/
@AfterReturning(value="execution(* com.svse.aop.*.*(..))",returning="result")
public void afterReturningMethod(JoinPoint jp, Object result){
String methodName =jp.getSignature().getName();
System.out.println("【返回通知】the method 【" + methodName + "】 ends with 【" + result + "】");
}
/**
* 后置通知:目标方法执行之后执行以下方法体的内容,不管是否发生异常。
* @param jp
*/
@After("execution(* com.svse.aop.*.*(..))")
public void afterMethod(JoinPoint jp){
System.out.println("【后置通知】this is a afterMethod advice...");
}
/**
* 异常通知:目标方法发生异常的时候执行以下代码
*/
@AfterThrowing(value="execution(* com.qcc.beans.aop.*.*(..))",throwing="e")
public void afterThorwingMethod(JoinPoint jp, NullPointerException e){
String methodName = jp.getSignature().getName();
System.out.println("【异常通知】the method 【" + methodName + "】 occurs exception: " + e);
}
/**
* 环绕通知:目标方法执行前后分别执行一些代码,发生异常的时候执行另外一些代码
* @return
*/
/*@Around(value="execution(* com.svse.aop.*.*(..))")
public Object aroundMethod(ProceedingJoinPoint jp){
String methodName = jp.getSignature().getName();
Object result = null;
try {
System.out.println("【环绕通知中的--->前置通知】:the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
//执行目标方法
result = jp.proceed();
System.out.println("【环绕通知中的--->返回通知】:the method 【" + methodName + "】 ends with " + result);
} catch (Throwable e) {
System.out.println("【环绕通知中的--->异常通知】:the method 【" + methodName + "】 occurs exception " + e);
}
System.out.println("【环绕通知中的--->后置通知】:-----------------end.----------------------");
return result;
}*/
}
3. TreeMap中自定义类作为key如何比较
(1)自定义类实现Comparable接口
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
class Solution {
public static void main(String[] args) {
TreeMap<Student, Integer> treeMap = new TreeMap<>();
treeMap.put(new Student(1,"xixi"), 1);
treeMap.put(new Student(1,"haha"), 1);
}
}
class Student implements Comparable<Student>{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
(2)创建TreeMap对象时,指定比较器 Comparator
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
class Solution {
public static void main(String[] args) {
TreeMap<Student, Integer> treeMap = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
treeMap.put(new Student(1,"xixi"), 1);
treeMap.put(new Student(1,"haha"), 1);
}
}
class Student{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
4. 索引,如何知道查询过程有没有使用索引,索引结构
- (1)什么是索引?
索引是将数据库中的一个或者多个字段,进行排序的一种结构,可以提高数据库的查询效率。 - (2)有哪些索引结构?
Hash表、B树、B+树等。 - (3)各个索引结构的特点
Hash表:查询时间复杂度O(1),但是不合适范围查找、模糊查找、排序等;
B树:多路搜索树,关键字和记录放在一起,非叶子节点也存储数据
B+树:叶子结点只存储关键字,非叶子节点存储所有的关键字和记录,叶子结点之间存在双向指针(便于范围查找) - (4)如何知道查询过程有没有使用索引?在查询语句前加上explain就可以了
- (5)explain列解释?
- type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
- possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引
- key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
5. 项目部署在哪里的
服务器:
- 操作系统:CentOs
- 内存:2GB
面经2------------------------------------------------------------------
1. HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。
-
(1)初始容量
默认构造函数:初始容量16
指定初始容量:Hash会选择大于该数字的第一个2的幂作为容量。(3->4、7->8、9->16) -
(2)扩容过程
-
(3)为什么都是2的N次幂的大小
2. 内存模型 new一个类的具体过程 以及调用一个成员的具体在内存中的过程
3. 静态代理 动态代理
4. 索引 联合列索引
5. 线程池
6. 线程的创建
7. 了解spring吗
8. 了解servlet吗
9. java I/O相关的简单介绍一下
10. 关于maven说一下
11. Hashmap了解吗
12. 那你说说关于红黑树
13. Java 反射机制
14. 网络层次 HTTP TCP
15. 对称加密 非对称加密
16. 乐观锁 悲观锁
17. 设计模式 说几种