分享

大数据技术之高频面试题(十四):常见面试SQL和JVM

问题导读:
1、如何用SQL对表进行操作?
2、JVM内存分哪几个区,每个区的作用是什么?
3、如何判断一个对象是否存活?


上一篇:大数据技术之高频面试题(十三): Redis和MySQL


12.6 常见面试sql
1.用一条SQL语句查询出每门课都大于80分的学生姓名
name   kecheng   fenshu
张三    语文    81
张三    数学    75
李四    语文    76
李四    数学     90
王五    语文    81
王五    数学    100
王五    英语    90

A:
  1. select distinct name from table where name not in (select distinct name from table where fenshu<=80)
复制代码

B:
  1. select name from table group by name having min(fenshu)>80
复制代码


2. 学生表 如下:
自动编号   学号  姓名 课程编号 课程名称 分数
1     2005001 张三   0001   数学   69
2     2005002 李四   0001   数学   89
3     2005001 张三   0001   数学   69
删除除了自动编号不同, 其他都相同的学生冗余信息

A:
  1. delete tablename where 自动编号 not in(select min(自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)
复制代码


3.一个叫team的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球队,现在四个球队进行比赛,用一条sql语句显示所有可能的比赛组合.

答:
  1. select a.name, b.name
  2. from team a, team b
  3. where a.name < b.name
复制代码


4.面试题:怎么把这样一个
year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成这样一个结果
year m1  m2  m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4

答案
  1. select year,
  2. (select amount from aaa m where month=1 and m.year=aaa.year) as m1,
  3. (select amount from aaa m where month=2 and m.year=aaa.year) as m2,
  4. (select amount from aaa m where month=3 and m.year=aaa.year) as m3,
  5. (select amount from  aaa m where month=4 and m.year=aaa.year) as m4
  6. from aaa group by year
复制代码


5.说明:复制表(只复制结构,源表名:a新表名:b)

SQL:
  1. select * into b from a where 1<>1 (where1=1,拷贝表结构和数据内容)
复制代码

ORACLE:
  1. create table b
  2. As
  3. Select * from a where 1=2
复制代码


[<>(不等于)(SQL Server Compact)
比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE。]

6.
原表:
courseid coursename score
-------------------------------------
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
-------------------------------------
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseid coursename score mark
---------------------------------------------------
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
---------------------------------------------------
写出此查询语句

  1. select courseid, coursename ,score ,if(score>=60, "pass","fail")  as mark from course
复制代码


7.表名:购物信息
购物人      商品名称     数量
A            甲          2
B            乙          4
C            丙          1
A            丁          2
B            丙          5
……

给出所有购入商品为两种或两种以上的购物人记录

答:
  1. select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);
复制代码


8.
info 表
date result
2005-05-09 win
2005-05-09 lose
2005-05-09 lose
2005-05-09 lose
2005-05-10 win
2005-05-10 lose
2005-05-10 lose
如果要生成下列结果, 该如何写sql语句?
         win lose
2005-05-09  2   2
2005-05-10  1   2

答案:
(1)
  1. select date, sum(case when result = "win" then 1 else 0 end) as "win", sum(case when result = "lose" then 1 else 0 end) as "lose" from info group by date;
复制代码

(2)
  1. select a.date, a.result as win, b.result as lose
  2.   from
  3.   (select date, count(result) as result from info where result = "win" group by date) as a
  4.   join
  5.   (select date, count(result) as result from info where result = "lose" group by date) as b
  6.   on a.date = b.date;
复制代码


13.1 JVM内存分哪几个区,每个区的作用是什么?
1.png
java虚拟机主要分为以下几个区:
1)    方法区:
a.    有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载
b.    方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。
c.    该区域是被线程共享的。
d.    方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。
2)    虚拟机栈:
a.    虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
b.    虚拟机栈是线程私有的,它的生命周期与线程相同。
c.    局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定
d.    操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索引来访问,而是压栈和出栈的方式
e.    每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。
3)    本地方法栈:
本地方法栈和虚拟机栈类似,只不过本地方法栈为Native方法服务。
4)    堆:
java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。
5)    程序计数器:
内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个java虚拟机规范没有规定任何OOM情况的区域。

13.2 Java类加载过程?
Java类加载需要经历一下几个过程:
1)    加载
加载时类加载的第一个过程,在这个阶段,将完成一下三件事情:
a.    通过一个类的全限定名获取该类的二进制流。
b.    将该二进制流中的静态存储结构转化为方法去运行时数据结构。
c.    在内存中生成该类的Class对象,作为该类的数据访问入口。
2)    验证
验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:
a.    文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
b.    元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。
c.    字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。
d.    符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。
e.    准备
准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。
3)    解析
该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。
4)    初始化
初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。

13.3 java中垃圾收集的方法有哪些?
1)引用计数法   应用于:微软的COM/ActionScrip3/Python等
a) 如果对象没有被引用,就会被回收,缺点:需要维护一个引用计算器
2)复制算法  年轻代中使用的是Minor GC,这种GC算法采用的是复制算法(Copying)
a) 效率高,缺点:需要内存容量大,比较耗内存
b) 使用在占空间比较小、刷新次数多的新生区
3)标记清除  老年代一般是由标记清除或者是标记清除与标记整理的混合实现
a) 效率比较低,会差生碎片。
4)标记压缩  老年代一般是由标记清除或者是标记清除与标记整理的混合实现
a) 效率低速度慢,需要移动对象,但不会产生碎片。
5)标记清除压缩标记清除-标记压缩的集合,多次GC后才Compact
a) 使用于占空间大刷新次数少的养老区,是3 4的集合体

13.4 如何判断一个对象是否存活?(或者GC对象的判定方法)
判断一个对象是否存活有两种方法:
1)    引用计数法
2)    可达性算法(引用链法)

13.5 什么是类加载器,类加载器有哪些?
实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。
主要有一下四种类加载器:
1)    启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。
2)    扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
3)    系统类加载器(system class loader)也叫应用类加载器:它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
4)    用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实现。

13.6 简述Java内存分配与回收策略以及Minor GC和Major GC(full GC)
内存分配:
1)    栈区:栈分为java虚拟机栈和本地方法栈
2)    堆区:堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。堆区是gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden区,主要放新创建对象,From survivor 和 To survivor 保存gc后幸存下的对象,默认情况下各自占比 8:1:1。
3)    方法区:被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(permanment generation)
4)    程序计数器:当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。线程私有的。

回收策略以及Minor GC和Major GC:
1)    对象优先在堆的Eden区分配。
2)    大对象直接进入老年代。
3)    长期存活的对象将直接进入老年代。
当Eden区没有足够的空间进行分配时,虚拟机会执行一次Minor GC.Minor GC通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度比较快;Full Gc/Major GC 发生在老年代,一般情况下,触发老年代GC的时候不会触发Minor GC,但是通过配置,可以在Full GC之前进行一次Minor GC这样可以加快老年代的回收速度。





获取更多资源:
领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480

大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235

名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732


名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732


已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条