miliankeji面试准备

面试要求:

1.Java基础扎实、熟悉常见的开源框架
2.熟悉java集合框架、IO操作、具有多线程开发经验
3.精通javaEE技术架构、熟悉常用设计模式
4.精通MySQL,熟悉Mysql数据库优化设计
5.熟悉Linux开发环境,熟悉常用命令,熟悉Tomcat服务器
6.熟悉敏捷开发流程

面试准备(这次以java基础为准)

1.简单介绍一下面向对象编程
把每个步骤抽象成对象,依次调用这些对象,虽然这样占用资源高,但是代码耦合降低方便后期维护。
面向对象三大特证:封装、继承、多态
封装是指将客观事物抽象成类,类是封装数据和操作的逻辑实体,对象中的数据可以私有,以形成对对象数据的保护。
继承:extends可以直接使用父类已有的方法,也可以写自己的方法;implements子类为抽象类可以不实现父类的抽象方法,子类为实体类,必须实现父类甚至父类的父类的抽象方法,抽象类中可以有抽象方法也可以有非抽象的方法,接口中只有抽象的方法。java类单继承多实现,但是可以多重继承。
多态:不同的对象可以有同一个外部接口,从而实现调用同一个方法实现不同的功能。主要是重写和重载。

2.简单介绍一下多态

多态是指不同的对象有着同一个外部接口,也就是说调用同一个外部接口却可以实现不同的功能,具体体现在重写和重载。
重写是子类对父类方法的实现功能重新编写,重写的方法名和形参必须相同,返回值子类可使用父类返回值的派生类,访问权限不能比父类地,抛出异常不能比父类高,不能重写父类的构造方法和被private和final修饰的方法。子类重写父类的方法想要调用原本父类的方法用super关键字
重载:发生在同一个方法中,方法名必须相同,形参必须不同

3.说一下重载了解多少,举一个重载使用的例子

重载是指同一个方法中有多个方法名相同,形参的类型或个数不同的方法。重载主要是同一个功能不同的实现时方便记忆,比如我写一个日期转换的工具类,其中把不同格式的日期转换成String型,就可以写三个叫toString的方法,形参分别是年月日时分秒型的Date,年月日型的Date,年月型的Date。

4.ArrayList和LinkList的区别

list都是有序可重复的,
ArrayList实际就是可改变大小的数组,线程不安全,可以get(index)获取某个值,插入和删除的时间复杂度受位置的影响
LinkList插入和删除性能更好,但get和set性能不好(因为要移动指针)不能随机访问元素,此外还继承了Queue接口比ArrayList多了些功能,也是线程不安全的
Vector:同步处理线程安全

5.介绍一下HashMap,和使用

HashMap是存储键值对实现快速存取,允许一个为Null的key,线程不安全,无序
HashMap的底层是通过数组+连表+红黑树(java8之后才引入红黑树)实现的,
Put键值对时,先对键进行hashcode计算(与key.hashcode的高16位进行异或运算)得到它在bucket数组中的位置,(注意发生hashcode碰撞时的处理和resize的扩容)然后初始化散列表resize(),再存入Entry对象
Get时先根据键的值计算出hashcode来找到bucket的位置,在用equals去匹配值对象

6.redis用过吗,能简单介绍一下吗

key-value快速存取(为什么存取速度快?1.数据存在内存磁盘中不通过硬盘I/O限制,2.单线程,3.使用多路复用I/O,非阻塞I/O,可处理并发连接),支持数据类型多list、set、hash、zset,支持事务、支持持久化(存到内存磁盘中),支持数据备份(master-slave),原子性(要么成功,要么都失败)

7.mysql的join用法,A left join B的时候,假如A有一条B没有时什么结果,A有一条B有3条是什么结果

内联是取两表的交集,左联是取两表的交集加左表剩余部分,右联是取两表交集加右表剩余,外联是取两表交集加左右表剩余的部分,mysql不支持外联,可以左联和右联的结果进行Union

ex1:A表有三条数据,id分别为1,2,3,B表有4条数据id分别为2,3,4,5

此时 select * from A inner join B on A.id = B.id  此时共有2条数据
select * from A left join B on A.id = B.id  此时共有3条数据
select * from A rignt join B on A.id = B.id  此时共有4条数据

ex2:A表有三条数据,A_id分别为1,2,3,B表有4条数据B_id分别为1,2,3,4且A_id两条为1两条为4

此时 select * from A inner join B on A.A_id = B.A_id  此时共有2条数据
select * from A left join B on A.A_id = B.A_id  此时共有4条数据
select * from A rignt join B on A.A_id = B.A_id  此时共有4条数据

8.mysql的索引,A表id和age都有索引,select * from A where id = 1 and age = 15,问索引在哪个上面

索引的使用场景

1).where查询时会使用索引

2).若where条件有多个索引,则选择候选结果少的索引

3).若有联合索引,则索引的左前字段也会被作为索引,比如(A1,B2,C3)作为联合索引,则(A1)(A1,B2)也会作为索引

4).join检索,在join条件两边的字段都加了索引时索引会生效 

5).求索引字段的max()min()时索引会生效

6).对索引字段做sort和group时索引会生效

9.说一下sql优化
where条件范围小的条件放在前面,不要用!=、OR会破坏索引,可以用Union,不要用select*把具体字段名写出来防止查询不需要的字段

10.说一个多线程使用的例子

比如一条单子的状态,付款时承运商的余额等数据在变动时都需要加锁,防止不同人员同时操作造成数据出错。

由于项目部署在不同的服务上,简单的synchronzised和lock已经不够能够解决数据的一致性问题,所以使用分布式锁。
实现分布式锁有三种方式:通过数据库、通过缓存redis、通过zookeeper,
我们使用的是通过缓存实现分布式锁中的分布式锁的开源Redisson框架,redisson还支持设置一个时间,到时间后自动释放锁

// Locker对象封装了filedName 、加锁时间leaseTime、加锁的值value等
// buildLockValue为appName + ":locker:" + filedName + ":" + lockValue

// LockHelper 实现AutoCloseable 封装了下面的方法

public static LockHelper tryLock(Locker locker) {
        LockHelper lockHelper = new LockHelper();
        RedissonClient redissonClient = (RedissonClient)ApplicationContextHelper.getContext().getBean(RedissonClient.class);
        lockHelper.rLock = redissonClient.getLock(locker.buildLockValue());
        lockHelper.rLock.lock((long)locker.getLeaseTime(), TimeUnit.SECONDS);
        return lockHelper;
    }

// 联锁RedissonMultiLock

public static LockHelper tryMultiLock(Locker... lockers) {
        LockHelper lockHelper = new LockHelper();
        RedissonClient redissonClient = (RedissonClient)ApplicationContextHelper.getContext().getBean(RedissonClient.class);
        RLock[] rLocks = new RLock[lockers.length];

        for(int i = 0; i < lockers.length; ++i) {
            rLocks[i] = redissonClient.getLock(lockers[i].buildLockValue());
        }

        lockHelper.redissonMultiLock = new RedissonMultiLock(rLocks);
        lockHelper.redissonMultiLock.lock(180L, TimeUnit.SECONDS);
        return lockHelper;
    }

11.说一下你们的项目里SpringCloud用到的组件

服务注册发现Nacos
服务配置中心Nacos
网关Gateway
服务调用OpenFeign
redis缓存、持久化数据存储mysql、rabbitMQ异步解耦、搜索引擎solr、日志管理ELK、阿里云对象存储服务OSS(存放图片等)、代码管理github、服务追踪

12.@Autowired @Resourse有什么区别

@Autowired是Spring实现bean注入的注解,默认使用byType
@Resourse是JavaEE的注解,遵循JSR250规范,和spring没有关系,但也可以实现spring的bean注入,有两个属性name和type,指定name则根据byName自动注入,指定type则根据ByType自动注入,都没有则根据反射原理使用Byname注入,如果同时指定了name和type则在Spring上下文检索唯一匹配的bean来进行装配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值