什么是单例模式?
我们前面学习的创建的类可以创建无数个对象,但是有时候需要 创建一个独一无二的对象,也就是一个类只能创建出一个对象。
如何才能只创建一个对象?
只需要将构造函数设置为private修饰即可
单例模式分类:
- 懒汉式
需要用到的时候再去创建对象 - 饿汉式
先创建再使用 - 登记式
饿汉式和懒汉式的区别:
- 饿汉式是类一加载进内存就创建好了对象,懒汉式则是类加载进内存的时候,对象还没有存在,只有调用了
getxxx()
方法时,对象才开始创建。 - 懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。
- 开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题
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方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。