使用 switch 时碰到的一个坑

首先看一段程序。

int type=2;  
switch (type){  
    case 1:  
        System.out.print(1);  
    case 2:  
        System.out.print(2);  
    case 3:  
        System.out.print(3);  
}

踩过这个坑或者仔细看过 switch 语法的人都知道,上面的程序会打印出:23 ,而不是 2。因为 switch 语句会从相匹配的 case 开始执行,直到遇到 break 语句,或者执行整一个 switch 语句。如果没加 break ,则会将 2 和 3 的 case 都执行,而不是只执行匹配的 case ,所以在使用 switch 时,一定要注意加 break ,或者在 case 里 return,否则很容易出现程序错误。

在编程时,我们可以通过一些插件来提醒我们这些的错误的发生,例如 SonarLint 、Alibaba Java Coding Guidelines。

bean的创建过程分析

既然是源码分析,那最好的办法还是编写一个测试用例,然后 debug 来看程序是怎样运行的。 测试例子:

public static void main(String[] args) {  
    ApplicationContext context=new AnnotationConfigApplicationContext(TestConfiguration.class);  
    TestBean tb= (TestBean) context.getBean("testBean");  
}
@Configuration  
public class TestConfiguration {  
    @Bean("testBean")  
    @Scope("prototype")  
    public TestBean testBean(){  
        return new TestBean();  
    }  
}

Mock的使用

Mock 常用于单元测试,用来模拟测试代码所依赖的外部类。因为我们所编写的代码往往存在大量复杂的外部依赖,或者依赖于特定的环境才能正常运行。这时我们可以选择使用 Mock 来构造这些外部依赖,使它们产生符合我们期待的行为(例如返回特定的值),但不需要真正地去构造外部依赖。需要注意的是,Mock 出来的对象并不会真实执行。

Java 中常用的 Mock 框架为 Mockito 和 Powermock,Powermock 主要在 Mockito 上添加了 final、private、static 方法的支持,两者可以结合使用。

HashMap1.8 的源码解析

结构

HashMap的结构为数组+链表+红黑树。

//对象数组
transient Node<K,V>[] table; 
// 链表节点
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash; //哈希值
        final K key; //建
        V value; //值
        Node<K,V> next;  //下一个节点
}
//红黑树节点
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
        TreeNode<K,V> parent;  // red-black tree links
        TreeNode<K,V> left;
        TreeNode<K,V> right;
        TreeNode<K,V> prev;    // needed to unlink next upon deletion
        boolean red;
}

后端接收表单方式上传的文件和数据

通过 Postman 上传多个文件和数据,后端接收文件和数据。

后端

因为 Postman 是通过表单方式上传,所以需要通过 @RequestParam 注解接收文件,value 属性定义请求参数,required 定义该参数是否必须,默认为 true。 上传文件需要使用 MultipartFile 对象来接收,因为允许上传多个文件,所以使用了数组的形式。