武汉光迅科技Java笔试题
1.Java中的override和overload的区别?
override(重写):指子类继承父类,重写父类中的方法。
overload(重载):指用一个类中,方法名相同,传参个数不同、参数类型不同、传参顺序不同的方法,与方法返回类型无关。
2.什么是值传递什么是引用传递?
值传递:传递的是存储单元中的内容,而非地址或者引用!
引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java中只有按值传递,没有按引用传递!
3.创建线程有几种方式?你喜欢哪一种,为什么?
创建线程有三种方法:
1.继承Thread类,重写run方法;
2.实现Runnable的方法;
3.使用ExecutorService、Callable、Future实现有返回结果的多线程;
但多数时间我们实现Runnable,因为java支持多实现,但不支持多继承。
4.ES是什么?简述他的优点。
ES(Elasticsearch)是一个基于Lucene的搜索服务器。
ES是分布式的不需要其他组件,分发是实时的;
ES实时搜索非常快;
ES处理多租户不需要特殊配置,学习成本较低;
5.简述你所知道的mysql的分库分表方案?
垂直拆分
垂直分表
也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。一般是针对那种几百列的大表,也避免查询时,数据量太大造成的“跨页”问题。
垂直分库
垂直分库针对的是一个系统中的不同业务进行拆分,比如用户User一个库,商品Producet一个库,订单Order一个库。 切分后,要放在多个服务器上,而不是一个服务器上。为什么? 我们想象一下,一个购物网站对外提供服务,会有用户,商品,订单等的CRUD。没拆分之前, 全部都是落到单一的库上的,这会让数据库的单库处理能力成为瓶颈。按垂直分库后,如果还是放在一个数据库服务器上, 随着用户量增大,这会让单个数据库的处理能力成为瓶颈,还有单个服务器的磁盘空间,内存,tps等非常吃紧。 所以我们要拆分到多个服务器上,这样上面的问题都解决了,以后也不会面对单机资源问题。
水平拆分
水平分表
针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。不建议采用。
水平分库分表
将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。
水平分库分表切分规则
RANGE
从0到10000一个表,10001到20000一个表;
HASH取模
一个商场系统,一般都是将用户,订单作为主表,然后将和它们相关的作为附表,这样不会造成跨库事务之类的问题。 取用户id,然后hash取模,分配到不同的数据库上。
地理区域
比如按照华东,华南,华北这样来区分业务,七牛云应该就是如此。
时间
按照时间切分,就是将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据 被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。
6.简述shrio实现权限控制的原理。
- 应用代码调用Subject(当前登录用户)控制期限
- Subject在shiro框架内部调用Shiro在shiro框架里调用Shiro SecurityManager 安全管理器
- 安全管理器调用 Realm (程序和安全数据连接器 )。
- Subject如果要进行任何操作都西亚哟调用安全管理(底层自动实现),而安全管理器会调用指定的Realms对象,来连接安全数据。
- Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。
7.IOC和AOP分别是什么,原理呢?
IOC:控制反转,一种思想,将创建Bean的工作交给框架去完成;
实例化一个 java 对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用 spring 时我们就不需要关心通过何种方式实例化一个对象,spring 通过控制反转机制自动为我们实例化一个 对象。
AOP:面向切面编程,一种思想,将服务,模块,方法,想象成一个个的切面,在前面的前后进行一些操作,,权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
8.三根不均匀的绳子,每根绳子烧完是一个小时,如何实现计时一个小时十五分钟。
第一根和第二根同时点,第一根点一头,第二根点两头
在第二根燃完后(30分钟),点燃第一根的另一头
前两根燃完后(15分钟),点燃第三根的两头
全部燃完后(30分钟)
一共就是1小时15分钟.
9.数据库:
Student(S#,Sname,Sage,Ssex)学生表,
Course(C#,Cname,T#)课程表,
SC(S#,C#,score)成绩表,
Teacher(T#,Tname)教师表。
问题
1.查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S# from (select s#,score from SC where C#='001')a, (select s#,score,from SC where C#='002') b where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
select S#,avg(score) from sc group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩;
select Student.S#,Student.Sname,count(SC.C#),sum(score) from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname
4、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分 FROM SC L ,SC AS R WHERE L.C# = R.C# and L.score = (SELECT MAX(IL.score) FROM SC AS IL,Student AS IM WHERE L.C# = IL.C# and IM.S#=IL.S# GROUP BY IL.C#) AND R.Score = (SELECT MIN(IR.score) FROM SC AS IR WHERE R.C# = IR.C# GROUP BY IR.C# );