美文网首页
本人近期面试中的面试题,有了我就会更新,请关注

本人近期面试中的面试题,有了我就会更新,请关注

作者: 羞涩的二黄 | 来源:发表于2019-03-25 13:50 被阅读0次

1、学生表(student:studentsName,id),课程表(class:id,className),选课表(chose:id,classId,studentId),查询选择了数学课的学生的姓名,至少两个 sql,并说出哪个效率更好。

答案:自己写吧,这个挺简单,东东脑子就出来了。

2、任意给你五张扑克牌,如果是顺子和一对的话,就可以出牌,三带一对,例如(1、2、2、2、3)、(4、5、6、1、1)、(6、7、8、9、9)等等,请用代码写出如果可以三代一对的话,就返回true,反之比如:1,3,4,6,6 或者 1,5,5,3,4 这种返回false。不能用map、list、array等,就用简单的数组形式,赋值,循环,请写出代码。

答案:

public class Test2 {

    //判断是否为一个顺子带一对的方法

    public static boolean test(int [] a) { int index = -1;

    //用来记录对子中第一个元素的下标

    int [] sequence = new int [a.length-2];

    //用来存放顺子

    //首先对数组进行排序,这里使用的选择排序

    selectSort(a);

    //将数组从小到大排好序后,双重循环找到重复元素出现的下标

    for (int i = 0; i < a.length; i++) {

        for (int j = 0; j < a.length-1; j++) {

            if(a[j+1]==a[j]) { index = j;

    } } }

    //根据下标,去除一个对子,将剩下的元素存放到一个新的数组,这个数组仍然是有序的

    for (int i = 0,j=0; i < a.length; i++) {

        if(i!=index&&i!=(index+1)) {

            sequence[j] = a[i]; j++;

        }

    }

    //调用判断是否为顺子的方法

    return isSequence(sequence);

    }

    //选择排序的方法

    public static void selectSort(int [] a) {

        for (int i = 0; i < a.length; i++) {

            for (int j = 0; j < a.length-1; j++) {

                if(a[j+1]<a[j]) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp;

                 }

            }

        }

    }

    //判断是否为顺子的方法

    public static boolean isSequence(int [] a) {

        boolean flag = true;

        for (int i = 0; i < a.length-1; i++) {

            if(a[i+1]-a[i]!=1) { flag = false;

            break;

            }

        }

    return flag;

    }

//主方法测试,成功

    public static void main(String[] args) {

        int [] a1 = {1,2,2,2,3,4};

        int [] a2 = {5,6,7,4,4};

        int [] a3 = {2,4,3,5,5};

        int [] a4 = {7,5,9,6,9};

        int [] a5 = {1,5,5,3,4};

        int [] a6 = {2,1,3,4,6,6};

        System.out.println(test(a1));

        System.out.println(test(a2));

        System.out.println(test(a3));

        System.out.println(test(a4));

        System.out.println(test(a5));

        System.out.println(test(a6));

        }

    }  

3、请写出你使用过的redis、rabbitMq、springcloud、dubbo、springboot等的api的方法名,越多越好。

redis:常用的

Jedis jedis = new Jedis("localhost");//建立链接

Jedis jedis = sentinelpool.getSentinelpoolResource();// 从池中获取一个Jedis对象 

 jedis.del(keys); // 删除key-value对象,如果key不存在则忽略此操作     

jedis.set(keys, "snowolf"); // 存数据      

 jedis.exists(keys);// 判断key是否存在,不存在返回false存在返回true     

String value = jedis.get(keys); // 取数据      

rabbitMq:

RabbitMQ Java客户端使用 com.RabbitMQ.client 作为它的top-level package。关键类和接口是:

Channel

Connection

ConnectionFactory

Consumer 

协议操作通过 Channel 接口可用。Connection 用于打开channels,注册连接生命周期事件处理程序,以及关闭不再需要的连接。Connections 通过ConnectionFactory实例化,这是您配置各种连接设置的方式,例如vhost或用户名。

核心API类是Connection 和Channel,分别表示AMQP 0-9-1连接和通道。

连接到一个代理下面的代码使用给定的参数(主机名、端口号等)连接到AMQP代理。

ConnectionFactory factory = new ConnectionFactory();

factory.setUsername(userName);

factory.setPassword(password);

factory.setVirtualHost(virtualHost);

factory.setHost(hostName);

factory.setPort(portNumber);

Connection conn = factory.newConnection(); 

对于在本地运行的RabbitMQ服务器,所有这些参数都有合理的默认值或者,也可以使用uri:

ConnectionFactory factory = new ConnectionFactory();

factory.setUri("amqp://userName:password@hostName:portNumber/virtualHost");

Connection conn =factory.newConnection(); 

所有这些参数对于运行在本地的RabbitMQ服务器都有合理的默认值。然后可以使用 Connection 接口打开通道:

Channel channel = conn.createChannel();

该通道现在可以用于发送和接收消息,后续部分会有讲解。要断开连接,只需关闭通道和连接:

channel.close();conn.close();

^^^^^^^^^^^^^^^等等,大家可以上网站多学学,这里就不再多说了。

5、请说出redis value 类型有几种

字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)

6、mysql的隔离级别

事务隔离级别:

1、读未提交(read-uncommitted)

2、不可重复读(read-committed)

3、可重复读(repeatable-read)

4、串行化(serializable)

增加知识点:

一、事务的基本要素(ACID)

  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

   2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

   3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

   4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二、事务的并发问题

  1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

7、hashcode 相同,equals 相同吗,反过来呢

hashCode相等,equals也不一定相等, 两个类也不一定相等

equals相同, 说明是同一个对象, 那么hashCode一定相同

哈希表是结合了直接寻址和链式寻址两种方式,所需要的就是将需要加入哈希表的数据首先计算哈希值,其实就是预先分个组,然后再将数据挂到分组后的链表后面,随着添加的数据越来越多,分组链上会挂接更多的数据,同一个分组链上的数据必定具有相同的哈希值,java中的hash函数返回的是int类型的,也就是说,最多允许存在2^32个分组,也是有限的,所以出现相同的哈希码就不稀奇了

重名的人很多, 名字相同, 但不是同一个人, hashCode就是名字, 人就是对象

参考: https://blog.csdn.net/weixin_39532479/article/details/79814516

8、dubbo和springcloud的优缺点

传输:Dubbo由于是二进制的传输,占用带宽会更少;Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大。但是在国内95%的公司内,网络消耗不是什么太大问题,如果真的成了问题,通过压缩、二进制、高速缓存、分段降级等方法,很容易解。

开发难度:Dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决;Spring Cloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级

后续改进:Dubbo通过dubbofilter,很多东西没有,需要自己继承,如监控,如日志,如限流,如追踪Spring Cloud自己带了很多监控、限流措施,但是功能可能和欧美习惯相同,国内需要进行适当改造,但更简单,就是ServletFilter而已,但是总归比dubbo多一些东西是好的;

注册中心:Dubbo的注册中心可以选择zk,redis等多种;Spring Cloud:的注册中心只能用eureka或者自研;

配置中心:dubbo:如果我们使用配置中心、分布式跟踪这些内容都需要自己去集成,无形中增加了使用难度。Spring Cloud:提供了微服务的一整套解决方案:服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等

Dubbo优点:

1.支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜 ;

2.采用rpc方式,性能上比Spring Cloud的rpc更好;

3.dubbo的网络消耗小于springcloud

缺点:

1.如果我们使用配置中心、分布式跟踪这些内容都需要自己去集成;

2.开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决;

Spring Cloud:优点:

1、产出于Spring大家族,Spring在企业级开发框架中来头很大,可以保证后续的更新、完善。

2、spring cloud社区活跃,教程丰富,遇到问题很容易找到解决方案;

3、spring cloud功能比dubbo更加完善;

5、spring cloud采用rest访问方式,rest的技术无关性使用效果更棒;

6、spring cloud轻轻松松几行代码就完成了熔断、均衡负责、服务中心的各种平台功能;

7、从公司招聘工程师方面,spring cloud更有优势,因为其技术更新更炫;

8、提供了微服务的一整套解决方案:服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等;作为一个微服务治理的大家伙,考虑的很全面,几乎服务治理的方方面面都考虑到了,方便开发开箱即用;

缺点:

1.如果对于系统的响应时间有严格要求,长链接更合适。

2.接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级

9、你能说下,你在项目中遇到什么新的思路,新的解决方法,发现你自己的亮点,别说什么简单的增删改查,我们不想知道这些,如果只有这些,可以不说

这个需要你自己的思路,好好思考下。

后续我会更新,更多的亲身经历面试题,我也是个小菜,需要成长,发出来,大家共同成长吧。

10、附两张同事面试时的题

有些都是面试完了,脑袋记下来的,可能不太完整,但是差不多的意思。

11、java判断是不是同一个数组

public class CheckArrayEquality {

    public static void main(String[] args) throws Exception {

        int[] ary = { 1, 2, 3, 4, 5, 6 };

        int[] ary1 = { 1, 2, 3, 4, 5, 6 };

        int[] ary2 = { 1, 2, 3, 4 };

        System.out.println("1" + Arrays.equals(ary, ary1));

        System.out.println("2 " + Arrays.equals(ary, ary2));

    }

}

打印结果:

1 true

2 false 

12、比如表a的b,c,d字段建立了连个索引,什么查询条件情况下会走索引

1、联合索引是由多个字段组成的索引。

2、查询时使用联合索引的一个字段,如果这个字段在联合索引中所有字段的第一个,那就会用到索引,否则就无法使用到索引。

3、联合索引IDX(字段A,字段B,字段C,字段D),当仅使用字段A查询时,索引IDX就会使用到;如果仅使用字段B或字段C或字段D查询,则索引IDX都不会用到。  

这个规则在oracle和mysql数据库中均成立。

如果你经常要用到多个字段的多条件查询,可以考虑建立联合索引,一般是除第一个字段外的其它字段不经常用于条件筛选情况,比如说a,b 两个字段,如果你经常用a条件或者a+b条件去查询,而很少单独用b条件查询,那么可以建立a,b的联合索引。如果a和b都要分别经常独立的被用作查询条件,那还是建立多个单列索引。

最左前缀原则

mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,

如:如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;

1、b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。

2、比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)

关于最左前缀的使用,有下面两条说明:

最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 

13、数据库分区了怎么查询

14、注解都什么意思,比如rest controller Request mapping,都是干啥的,怎么注入的

15、java设计模式,spring特性、代理模式之类的

java设计模式附上一个链接:http://www.runoob.com/design-pattern/factory-pattern.html

spring特性:

(1)IOC(控制反转)

      实现将组件间的关系从程序内部提到外部容器(spring的xml)来管理。

首先外部容器(spring.xml)中会动态的注册业务所需的对象(接口/类)

(2)DI(依赖注入)

组件之间的依赖关系由容器在应用系统运行期来决定, 也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中

(3) AOP(面向切面编程) 

  利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来

答案不见得对,这个知识,要理解的全面并且要深。

相关文章

网友评论

      本文标题:本人近期面试中的面试题,有了我就会更新,请关注

      本文链接:https://www.haomeiwen.com/subject/lpomvqtx.html