职场面试题总结(56)---HashMap结构、单例模式在工作中使用场景、单例中的饿汉式和懒汉式、IOC与AOP、springcloud的组件

170 阅读10分钟

1、 HashMap结构

HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。 JDK1.8之前的HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了节解决哈希碰撞(两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同)而存在的(“拉链法”解决冲突)。 JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(或者红黑树的边界值,默认为8)并且当前数组的长度大于64时,此时此索引位置上的所有数据改为使用红黑树存储。 数组里面都是key-value的实例,在JDK1.8之前叫做Entry,在JDK1.8之后叫做Node。 原文链接:blog.csdn.net/qq_37084904…

2、 单例模式在工作中使用场景

1、Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~

2、windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

3、网站的计数器,一般也是采用单例模式实现,否则难以同步。

4、应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

5、Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 ———————————————— 原文链接:blog.csdn.net/QDNBD/artic…

3、 单例中的饿汉式和懒汉式

1、饿汉式(静态常量) 步骤: 构造器私有化(防止new) 类的内部类创建对象 向外暴露一个静态的公共方法

// 饿汉式
class Singleton {
    //构造器私有化
    private Singleton() {}
    //本类内部创建对象实例
    private final static  Singleton instance = new Singleton();
    //提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance() {
        return instance;
    }
}

优缺点: 优点:这种写法比较简单,就是在类装载的时候就完成了实例化。避免了线程同步问题。 线程安全 在类加载的同时已经创建好一个静态对象,调用时反应速度快

缺点:来类装载的时候就完成了实例化,没有达到Lazy Loading的效果。如果从始至终未使用过这个实例,则会造成实例的浪费。

2、懒汉式(线程不安全)

//懒汉式(线程不安全)
class Singleton {
    private Singleton() {}
    private static Singleton instance;
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

缺点: 起到了Lazy Loading的效果,但是只能在单线程下使用。 多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及 往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。

3、 懒汉式(线程安全,同步方法)

//懒汉式(线程安全, 同步方法)
class Singleton {
    private Singleton() {}
    private static Singleton instance;
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

优点:解决了线程不安全问题。 缺点:效率太低。

4、 懒汉式(线程安全,同步代码块)

class Singleton {
    private Singleton() {}
    private static Singleton instance;
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}

优点:解决方法3效率低的问题。 原文链接:blog.csdn.net/QDNBD/artic…

4、synchronized与Lock

1、区别: 1.synchronized是关键字,Lock是接口;

2.synchronized是隐式的加锁,lock是显式的加锁;

3.synchronized可以作用于方法上,lock只能作用于方法块;

4.synchronized底层采用的是objectMonitor,lock采用的AQS;

5.synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁;

6.synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列;

7.synchronized只支持非公平锁,lock支持非公平锁和公平锁;

8.synchronized使用了object类的wait和notify进行等待和唤醒, lock使用了condition接口进行等待和唤醒(await和signal);

9.lock支持个性化定制, 使用了模板方法模式,可以自行实现lock方法;

2、相同点:

1.Lock是一个接口,为了使用一个Lock对象,需要用到;

2.Lock lock = new ReentrantLock();

3.与 synchronized (someObject) 类似的,lock()方法,表示当前线程占用lock对象,一旦占用,其他线程就不能占用了;

4.与synchronized 不同的是,一旦synchronized 块结束,就会自动释放对someObject的占用。 lock却必须调用unlock方法进行手动释放,为了保证释放的执行,往往会把unlock() 放在finally中进行;

5.synchronized 是不占用到手不罢休的,会一直试图占用下去;

6.与 synchronized 的钻牛角尖不一样,Lock接口还提供了一个trylock方法;

7.trylock会在指定时间范围内试图占用。 如果时间到了,还占用不成功,就选择放弃;

注意: 因为使用trylock有可能成功,有可能失败,所以后面unlock释放锁的时候,需要判断是否占用成功了,如果没占用成功也unlock,就会抛出异常;

8.使用synchronized方式进行线程交互,用到的是同步对象的wait,notify和notifyAll方法;

9.Lock也提供了类似的解决办法,首先通过lock对象得到一个Condition对象,然后分别调用这个Condition对象的:await, signal,signalAll 方法; 注意: 不是Condition对象的wait,nofity,notifyAll方法,是await,signal,signalAll;

3、不同点:

1.Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现;

2.Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。 借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生;

3.synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。

5、SSM和SpringBoot区别

1、在开发中,虽然springboot简化了配置,但只不过是编写的方式变得简单了,和SSM整合的方式还是有些差异;

2、使用SSM开发时,多数会选择Jsp作为视图,但是springboot不推荐使用jsp。

6、IOC与AOP

1、IOC(控制反转)

IOC (Inversion Of Control,控制倒转),是spring的核心,贯穿始终,所谓IOC ,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么,你需要什么,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

2、AOP(面向切面编程)

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

7、springcloud的组件

1、服务发现——Netflix Eurek

该系统下还分为Eureka服务端和Eureka客户端,Eureka服务端用作服务注册中心,支持集群部署。Eureka客户端是一个java客户端,用来处理服务注册与发现。

2、客服端负载均衡——Netflix Ribbon

基于Http和Tcp的客户端负载均衡,使得面向REST请求时变换为客户端的负载服务调用,提供客户端的软件负载均衡算法。

3、断路器——Netflix Hystrix

它的作用是保护系统,控制故障范围。

4、服务网关——Netflix Zuul

提供api网关,路由,负载均衡等作用。

5、分布式配置——Spring Cloud Config

提供服务端和客户端,服务器存储后端的默认实现使用git。

8、CAP原理

CAP 定理指出了,在一个跨区域网络连接,共享数据的分布式系统中,一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance) 这三个约束属性最终只能同时满足二个。

C:Consistency 一致性:访问所有的节点,得到的数据结果都是一样的。注意:这里的一致性指的是强一致性,也就是数据更新完,访问任意节点,看到的数据完全一致,要和弱一致性、最终一致性区分开来。

A:Availability 可用性:所有节点都保持高可用性。注意:这里的高可用还包括,不能出现延迟,如节点B由于等待数据同步而阻塞了请求,那么节点B就不满足高可用性。 也就是说,任何没有发生故障的服务必须在有限的时间内返回合理的结果集。

P:Partiton tolerance 分区容错性:这里的分区指的是网络意义上的分区。由于网络是不可靠的,所有节点之间很可能出现无法通讯的情况,在节点不能通信时,要保证系统可以继续正常服务。 ———————————————— 原文链接:blog.csdn.net/weixin_4622…

9、一条SQL的执行流程

1、from:需要从哪个数据表检索数据 。

2、where:过滤表中数据的条件 。

3、group by:如何将上面过滤出的数据分组 。

5、having:对上面已经分组的数据进行过滤的条件 。

6、select:查看结果集中的哪个列,或列的计算结果 。

7、order by :按照什么样的顺序来查看返回的数据 。

10、索引失效的场景

1、当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;因为索引B+树是按照“索引值”有序排列存储的,只能根据前缀进行比较。当采用左或者左右模糊匹配的时候,比如“%明”的话,可能会查出“张明、李明、周明”这样的数据,所以不知道从哪个索引值开始比较,于是只能采用全表查询的方式。

2、当我们在查询条件中对索引列使用函数,就会导致索引失效。因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然没法走索引查询了。

3、当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。

4、MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。(对索引隐式类型转换)。

5、联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。

6、在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。 ———————————————— 原文链接:blog.csdn.net/m0_56436138…