7月4日问题

面经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. 设计模式 说几种

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章