2017面试遇到的问题

  • MySQL实现多表更新
UPDATE a SET a.name = b.name from a,b where a.age = b.age;
或者
UPDATE a SET a.name = b.name from a join in b on a.age = b.age;
  • Switch 怎么判定字符串?
    通过将需要判定的字符串内容封装到一个枚举类中,然后调用枚举的属性.这里其实是错误的.现在可以直接使用字符串进行swicth判断.
  • jar包和war包的区别?
    war包:是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。war包是Sun提出的一种web应用程序格式,与jar类似,是很多文件的压缩包。war包中的文件按照一定目录结构来组织。根据其根目录下包含有html和jsp文件,或者包含有这两种文件的目录,另外还有WEB-INF目录。通常在WEB-INF目录下含有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的servlet类和jsp,或者servlet所依赖的其他类(如JavaBean)。通常这些所依赖的类也可以打包成jar包放在WEB-INF下的lib目录下。
    jar包:通常是开发时要引用的通用类,打成包便于存放管理。简单来说,jar包就是别人已经写好的一些类,然后对这些类进行打包。可以将这些jar包引入到你的项目中,可以直接使用这些jar包中的类和属性,这些jar包一般放在lib目录下。
  • 通过以下数据表返回各科成绩都大于80分的学生?
name course score
张三 语文 75
张三 数学 81
李四 语文 80
李四 数学 82
王五 语文 81
王五 数学 85
王五 英语 65
  1. 第一种方法:先查询出一个有至少一科成绩小于80分的学生的去重临时表
    (select distinct s.name from list s where s.score<80;)
    然后在全表的去重学生查询中排除掉这个临时表的数据
    (select distinct l.name from list l where l.name not in(select distinct s.name from list s where s.score<80);)
    或者
    (select distinct l.name from list where not exists(select 1 from list s where s.score<80 and s.name = l.name);).关于exists及not exists的用法,以前的理解一直很模糊并不清楚怎么用.通过这个方法,可以加深理解.
    https://www.cnblogs.com/beijingstruggle/p/5885137.html
    配合这个链接方便理解其中的定义.
  2. 第二种方法:
    select distinct l.name from list l group by l.name having(min(l.score)>80);
  3. 第三种方法:
    SELECT D.name FROM ( SELECT S.name,S.score AS ITEM1,S1.score AS ITEM2,S2.score AS ITEM3 FROM Student S inner join Student S1 on S.name = S1.name and S.course <> S1.course inner join Student S2 on S.name = S2.name and S.course <> S2.course WHERE S.score>=80 and S1.score>=80 and S2.score>=80 ) D GROUP BY D.name
  • 插入排序,并删除其中重复的数字
    5,3,10,15,12,20,10,8,13,18
    关于插入排序,我之前有一个理解错误的地方,可能是网上代码的理解错误.
    在需要插入的数据对其前面有序数据的大小判定后,不是交换数据.而是将前一个的数据赋值给当前需要插入的数据.然后往前循环,不断将有序部分比该数据大的数据往后移动一位,当前循环结束后将该值插入到判定结束时的位置.
    //插入排序
    public static void sort(int[] arr, int l) {
        for (int i = 1; i < l; i++) {//设定arr[0]为有序数组,从1位开始循环.
            int temp = arr[i];//将i的值复制出来备用
            int j = i - 1;//将有序数组的最大下标赋值复制出来用于循环
            //并在循环结束后将i的值赋给循环最后j的j+1下标.
            for (; j >= 0 && temp < arr[j]; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }

这里顺便也想重新学习下归并排序.

  • 以下代码的执行结果
    (在父类构造器中引用它的两个方法,在子类构造器中引用它实现的两个方法).
    主函数中创建一个子类对象.
public class FatherAndSon {

    public static void main(String[] args) {
        Father f = new Son();
    }
}

class Father {
    String FNAME = "Father name@" + this.getClass() + " ";

    public Father() {
        call();
        print();
    }

    public void call() {
        System.out.println("Father call:" + FNAME);
    }

    public void print() {
        System.out.println("Father print:" + FNAME);
    }
}

class Son extends Father {

    String SNAME = "Son name@" + this.getClass() + " ";

    public Son() {
        call();
        print();
    }

    public void call() {
        System.out.println("Son call:" + SNAME + FNAME);
    }

    public void print() {
        System.out.println("Son print:" + SNAME + FNAME);
    }
}

输出结果:
Son call:nullFather name@class interview.Son
Son print:nullFather name@class interview.Son
Son call:Son name@class interview.Son Father name@class interview.Son
Son print:Son name@class interview.Son Father name@class interview.Son
这里父类构造器调用到子类call()方法后,SNAME变量是null,是因为父类中并没有这个成员变量.

  • 1G的文件,每行一个词,每个词最多16个字节,内存为1M,返回出现频率最高的100个词.
  • 关于switch 的default的执行情况。
  • 以下这两段代码的区别?
short s = 1; s = s + 1 ;

short s = 1; s += 1;

前一段会出现incompatible types的错误信息.第二段则不会出现错误.

你可能感兴趣的:(2017面试遇到的问题)