面经:一面朗坤智慧
面试流程:
1.hr首先让我做了一个简单的自我介绍
我介绍了我叫什么,我的家乡,来自哪里,当前是什么状态,我的教育背景,还有我自己的学习状况,项目情况,实习经验,导师项目,我自己做过的项目,用到的语言和技术,我的兴趣爱好和特长;
2.hr介绍了自己;
3.接着hr询问了我Redis是一种怎样的数据库,用来干什么的,一般需要缓存什么数据,不缓存哪些,在项目中有没有用到?
Redis是一个开源(BSD许可的内存数据结构存储),用作数据库、缓存、消息代理和流媒体引擎。Redis提供字符串、散列、列表、集合、带有范围查询的排序集、位图、超日志、地理空间索引和流等数据结构。Redis内置复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。
1) 作为分布式系统的缓存服务器
客户端访问服务器的时候,会先检查redis是否有数据,redis有数据直接反馈给客户端,不再访问mysql.redisr如果没有再请求数据库,数据库同时会进行缓存重建到redis,下次就可以直接读redis.
2) 应对数据高速读写的业务
高速读写,在互联网的项目中都是一个读多写少的.就比如说双十一淘宝,大量的客户访问,如果直接去读取数据库的话,对mysql无疑就是一个很大的压力,redis可以减轻mysql压力.缓存到redis服务器,后期再写入到数据库.但是这样会有一个问题,我们不只需要更新mysql,也要更新redis.就是我们往往买东西的时候,会看到库存还有1,但是就是不能下单,这并不是有货不给卖,实际库存就是空的.只是redis还没把数据同步到mysql.数据没有绝对的一致性
3) 作为分布式锁使用(Zookeeper、Redis)
3) 作为分布式锁使用(Zookeeper、Redis)
分布式锁的使用的话,早期做过一个项目,当时为了确保线程安全的话,用到了synchronized关键字确保线程安全,后期就是项目需要升级迭代,服务部署到不同的服务器中,集群.那么就可以用到redis的分布式锁.统一锁在redis中.
4) 数据共享
数据共享就是之前做过一个项目,当时是用到了oauth2的jwt直接存储用户信息生成到令牌中,直接放入客户端的,每次带着令牌访问资源服务.那么还有另外一种方式就是把生成的令牌存储在redis中,每次访问资源服务器的时候就直接从redis中获取,可以实现资源的共享.
5) ID自增序列
4.反射是什么?
Java-Reflection(JAVA反射)是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够通过Java-Reflection来调用它的任意方法和属性(不管是公共的还是私有的)。
这种动态获取信息以及动态调用对象方法的行为被称为java的反射机制。
这种动态获取信息以及动态调用对象方法的行为被称为java的反射机制。
Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类。
2.在运行时构造任意一个类的对象。
3.在运行时判断任意一个类所具有的成员变量和方法。
4.在运行时调用任意一个对象的方法。
5.单例模式是什么?
什么是java单例模式?
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
单例模式的优点:
(1)首先肯定是节省内存资源,不管多频繁的通过暴露的方法创建实例,都能保证创建的对象在系统内存中是同一实例对象;
(2)灵活性,由于所有实例的创建都由该类控制,所有该类可以灵活的更改实例化过程;
(3)实例的受控访问,单例类可以轻松的控制唯一实例的受控访问;
单例模式的缺点:
(1)单例模式没有接口,不容易扩展;
(2)使用时不能用反射模式创建单例,否则会实例化一个新的对象;
(3)使用懒单例模式时注意线程安全问题;
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
单例模式的优点:
(1)首先肯定是节省内存资源,不管多频繁的通过暴露的方法创建实例,都能保证创建的对象在系统内存中是同一实例对象;
(2)灵活性,由于所有实例的创建都由该类控制,所有该类可以灵活的更改实例化过程;
(3)实例的受控访问,单例类可以轻松的控制唯一实例的受控访问;
单例模式的缺点:
(1)单例模式没有接口,不容易扩展;
(2)使用时不能用反射模式创建单例,否则会实例化一个新的对象;
(3)使用懒单例模式时注意线程安全问题;
实现单例模式的方式:
饿单例方式
饿单例在类加载的时候就被提前new了出来,一开始就实例化了一个supermanInstance对象,不管你程序需要不要调用这个对象,它都已经准备好了;没有进行延迟加载,为了减小程序负载大多数情况下需要懒加载,所以这种实现单例的方式不是最佳选择。 懒单例方式(单线程写法)
声明一个对象不去实例化它,当程序需要实例化的时候调用静态工厂方法 getSupermanInstance(),方法中对声明的对象进行判断,如果是null的话再去实例化它,这种写法可以达到延迟加载的效果,但它是非线程安全的,若在多线程中有两个线程同时调用静态工厂方法getSupermanInstance() 就有可能重复的创建该类的实例破坏了单例的唯一性。
6.Java有几种设计模式?
1)抽象工厂模式是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
2)建造模式是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
3)工厂方法模式定义一个创建对象的接口,让子类决定实例化那个类。
4)原型模式是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
5)单例模式,它的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。
6)外观模式提供了一个统一的接口,用来访问子系统中的一群接口。
7)适配器模式是将一个类的接口,转换成客户期望的另一个接口。
8)桥接模式是讲抽象部分和实现部分隔离开来,使得他们能够独立变化。
9)组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。
10)装饰模式:动态的给对象添加新的功能。
11)享元模式就是运行共享技术有效地支持大量细粒度对象的复用。
12)代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。
13)命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
14)解释器模式就是定义语言的文法,并且建立一个解释器来解释该语言中的句子。
15)访问者模式即在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
16)迭代子模式是提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
17)中介者模式就是用一个中介对象来封装一系列的对象交互。
18)备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态。
19)观察者模式定义了对象之间的一对多依赖关系。
20)状态模式就是允许对象在内部状态发生改变时改变它的行为。
21)策略模式就是定义了算法族,分别封装起来,让他们之前可以互相转换。
22)模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
23)责任链模式是将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
2)建造模式是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
3)工厂方法模式定义一个创建对象的接口,让子类决定实例化那个类。
4)原型模式是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
5)单例模式,它的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。
6)外观模式提供了一个统一的接口,用来访问子系统中的一群接口。
7)适配器模式是将一个类的接口,转换成客户期望的另一个接口。
8)桥接模式是讲抽象部分和实现部分隔离开来,使得他们能够独立变化。
9)组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。
10)装饰模式:动态的给对象添加新的功能。
11)享元模式就是运行共享技术有效地支持大量细粒度对象的复用。
12)代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。
13)命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
14)解释器模式就是定义语言的文法,并且建立一个解释器来解释该语言中的句子。
15)访问者模式即在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
16)迭代子模式是提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
17)中介者模式就是用一个中介对象来封装一系列的对象交互。
18)备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态。
19)观察者模式定义了对象之间的一对多依赖关系。
20)状态模式就是允许对象在内部状态发生改变时改变它的行为。
21)策略模式就是定义了算法族,分别封装起来,让他们之前可以互相转换。
22)模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
23)责任链模式是将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。