阿里企业金融二面复盘

Java

这次竟然没有一个Java基础相关的。。。。

我极度怀疑面试官看了我博客,故意避开我会的。。。

框架

1. @bean的作用

声明该返回值是一个bean

运行还是编译 运行

bean如何起作用

通过@ComponentScan对包进行扫描

通过什么查看注解

反射有个查看annotation方法

2. 为什么@Before可以AOP

在spring的生命周期的后置方法中,先查找实现了pointcutAdvisor的切面类,该类包含了Pointcut和Advice对象,检查在Pointcut中的表达式能否匹配到当前的bean类,如果匹配则对bean进行织如

代理类没有接口怎么办 cglib

如何代理final 通过aspectJ或者动态代理

3. SpringBoot的@SpringBootApplication

有三个nb注解@EnableAutoConfiguration,@ComponentScan和@SpringBootConfiguration,第一个里面会有一个@Import注解,导入一个Select.class,该class会通过拿到每一个starter里面的resources/META-INF的文件

如何写一个starter

在自定义的starter里面增加一个spring.proprites文件用来通知SpringBoot配置类的位置,然后在配置类中注入bean,如果需要映射参数的时候,可以通过@ConfigurationProperties注解

DB

4. 为什么索引用B+树

深度浅,每个节点的key值更多

5. 为什么只有右模糊查询走索引

用B+树来解释,MySQL的B+树索引是按照从左向右的原则进行匹配的,如果其他模糊效率将是index

网络

6. 面试时语音走得所有协议

语音如何通过网络传输

微信文字的传输

微信发文字和图片传输的区别

反正没有回答到点上,有知道的logo可以发消息给我

算法

7. 了解哪些数据结构和算法

dp,贪心,dfs,bfs,prime,kruskal,树,栈,图,链表,数组,字符串

堆排序是稳定的吗 不稳定

堆排序的最终结果集是平衡二叉树吗 不是

Arrays.sort()源码

有三种排序方式:双轴快排,并发归并,以及修改的归并

主要是修改的归并:如果长度小于7的话会使用插入排序(即将删除)

另外一种修改的归并排序是TimSort:

  1. 扫描数组,确定其中的单调上升段和严格单调下降段,将严格下降段反转;

  2. 定义最小基本片段长度,短于此的单调片段通过插入排序集中为长于此的段;

  3. 反复归并一些相邻片段,过程中避免归并长度相差很大的片段,直至整个排序完成,所用分段选择策略可以保证O(n log n)时间复杂性。

可以看到,原则上TimSort是归并排序,但小片段的合并中用了插入排序。TimSort的最好复杂度是O(N),但是普通规并是O(nlogn)

OS

8. .java文件如何被OS执行

我回答的是虚拟机的那一块

项目

9. 如何提高并发量

集群,缓存,数据库

10. 如何保证数据一致性

加锁,双删,MQ

做题

面试官说给我个不常见的题,我吐。。。

11. 请用JAVA代码完成以下功能,要求使用多线程

cat /home/admin/logs/*.log | grep "Login"| sort -nr | uniq -c

/**
 * 读取 这个文件夹下 以.log结尾的文件
 * 匹配包含Login的字符串
 * 并将字符串逆序排列相同的字符串合在一起
 * 并在左侧标出重复出现的次数
 *
 * @author wxxlamp
 * @date 2020/03/11~14:53
 */
public class Ali {
    public static String dir = "/home/admin/logs/";
    public static String target = "Login";

    public static void run() throws ExecutionException, InterruptedException {
        Tree tree = new Tree();
        List<String> stringList = getMultiFile(dir);
        for (String s : stringList) {
            tree.add(s);
        }
        tree.print();
    }

    private List<String> getMultiFile(String dir) throws ExecutionException, InterruptedException {
        File fileDir = new File(dir);
        File[] files = fileDir.listFiles();
        List<String> list = new ArrayList<>();
        assert files != null;
        for (File file : files) {
            if (file.getName().matches("^((?!log).*).log$")) {
                FutureTask<List<String>> futureTask = new FutureTask<>(new Worker(file));
                new Thread(futureTask).start();
                list.addAll(futureTask.get());
            }
        }
        return list;
    }

    private List<String> getTargetStringLine(File file) {
        Charset charset = StandardCharsets.UTF_8;
        StringBuilder sb = new StringBuilder();
        try(FileChannel fin = new FileInputStream(file).getChannel()) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (fin.read(buffer) != -1) {
                buffer.flip();
                sb.append(charset.decode(buffer));
                buffer.clear();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        String[] ss = sb.toString().split("\\r");
        List<String> stringList = new ArrayList<>();
        for (String s : ss) {
            if (s.contains(target)) {
                stringList.add(s);
            }
        }
        return stringList;
    }

    private class Worker implements Callable<List<String>> {
        private File file;
        public Worker (File file){
            this.file = file;
        }

        @Override
        public List<String> call() {
            return getTargetStringLine(file);
        }
    }
    
    private static class Tree {

        private Map<String,Integer> map = new TreeMap<>(
                Comparator.reverseOrder());

        public synchronized void add(String str) {
            if(!map.containsKey(str)) {
                map.put(str,1);
                return;
            }
            Integer num = map.get(str);
            map.put(str, ++num);
        }

        public void print() {
            print(map);
        }

        public void print(Map<String, Integer> map) {
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
        }
    }
}

12. LeetCode打家劫舍

13. 写一个黑名单过滤系统

这两个算法题是淘宝一面后的笔试题,不是本次面试题

复盘

以前都是听说阿里越往后项目越多,为什么这次全是基础啊QAQ

突然发现面试官会看我CSDN,我在考虑要不要把我的面经设为私人可见,因为最近发现面试官问的问题基本刚好撇开了我整理的

这次的面试官和往常的大不一样,完全不走常规路,就像是和我讨论问题一样,一点一点问,完全问到我不会。还有一个就是写第一个场景题的时候,我多线程写完没来得及提交就到时间了,淦。这个场景题据我所知会成为最终评级考核的参考之一,我伤心555

面试官夸说我在本科生中还不错,对我印象挺好,但是还是要多实践。幸好二面险过。

你可能感兴趣的:(Java,EE,计算机网络,数据库)