隐藏

JAVA(单例模式)
2022年 01月 12 日

Calvin

什么是单例模式?

我们前面学习的创建的类可以创建无数个对象,但是有时候需要 创建一个独一无二的对象,也就是一个类只能创建出一个对象。

如何才能只创建一个对象?

只需要将构造函数设置为private修饰即可

单例模式分类:

  1. 懒汉式
    需要用到的时候再去创建对象
  2. 饿汉式
    先创建再使用
  3. 登记式

饿汉式和懒汉式的区别:

  1. 饿汉式是类一加载进内存就创建好了对象,懒汉式则是类加载进内存的时候,对象还没有存在,只有调用了getxxx()方法时,对象才开始创建。
  2. 懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。
  3. 开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题

equals在java中作用

如果一个类没有继承任何类的时候默认继承Object类(超类,官方定义的)
public boolean equals(Object obj);
指示其他某个对象是否与此对象“相等”。
默认继承Object类没有重写Object类中的equals(),那么比较的其实还是地址值,不能比较
对象是否相等。我们需要重写equals方法来让其对象比较是否相等。
我们重写equals方法,如何认为对象就相等,我们比较的是所有的属性值都相等的时候认为对象相等。

== 判断是否绝对相等,而equals判断是否客观相等
如何重写equals?

在类内右键➡️选择Generate➡️equals() and hash Code

面试题:为什么重写equals的时候要重写hashCode?

答:在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。这时候如果只重写了equals()的方法,而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的一个哈希值。这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。

JAVA(单例模式)

什么是单例模式?

我们前面学习的创建的类可以创建无数个对象,但是有时候需要 创建一个独一无二的对象,也就是一个类只能创建出一个对象。

如何才能只创建一个对象?

只需要将构造函数设置为private修饰即可

单例模式分类:

  1. 懒汉式
    需要用到的时候再去创建对象
  2. 饿汉式
    先创建再使用
  3. 登记式

饿汉式和懒汉式的区别:

  1. 饿汉式是类一加载进内存就创建好了对象,懒汉式则是类加载进内存的时候,对象还没有存在,只有调用了getxxx()方法时,对象才开始创建。
  2. 懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。
  3. 开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题

equals在java中作用

如果一个类没有继承任何类的时候默认继承Object类(超类,官方定义的)
public boolean equals(Object obj);
指示其他某个对象是否与此对象“相等”。
默认继承Object类没有重写Object类中的equals(),那么比较的其实还是地址值,不能比较
对象是否相等。我们需要重写equals方法来让其对象比较是否相等。
我们重写equals方法,如何认为对象就相等,我们比较的是所有的属性值都相等的时候认为对象相等。

== 判断是否绝对相等,而equals判断是否客观相等
如何重写equals?

在类内右键➡️选择Generate➡️equals() and hash Code

面试题:为什么重写equals的时候要重写hashCode?

答:在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。这时候如果只重写了equals()的方法,而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的一个哈希值。这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。

上一篇
JAVA(封装)
下一篇
JAVA(多态)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论