三种单例模式与Object祖先类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种单例模式与Object祖先类相关的知识,希望对你有一定的参考价值。
单例有三种模式,懒汉式,饿汉式,和优化后的懒汉式
饿汉式单例模式:
饿汉式就像饥饿的人一样先把事情都提前准备好,因为它是先在静态属性里先提前构建好对象,然后再用静态方法将对象返回出去,所以会提前占用资源,但是速度比较快。例如:
懒汉式单例模式:
懒汉式就像懒人一样要等到事情来到面前了才开始做,因为它只在静态属性里声明变量不构建对象,对象是在静态方法里经过判断后才构建对象,但是在方法上要加synchronized同步锁关键字,这个关键字是令访问排队执行,如果不加这个关键字在多人调用的时候就会出现问题,会构建出多个对象,这样就违背了单例模式的定义,懒汉式的优点在于不会提前占用资源,但是速度会慢得多。例如:
优化后的懒汉式单例模式:
优化后的懒汉式也是在静态属性里声明变量不构建对象,在方法里才开始构建对象,但是与原本的懒汉式不同的是,将同步锁关键字写在判断语句内,先经过判断条件再进行排队构建对象,也就是先进入的进行排队,后面再访问的就可以直接使用构建好的对象,不需要再进行排队等待,从而优化了速度上的问题。例如:
其实这个方式就像平常家里面一样,大家一起在外面干活,然后到饭点了,走的快的就先回到家做饭,走的慢的回到家就刚好可以吃饭了。这个代码就是跑的快的先进行访问的去排队构建对象,后面再访问的肯定就无法通过第一个判断语句自然就可以直接使用return new好的对象。
Object祖先类(超类):
因为在java类的设计采用单根结构,即一个类只能继承一个类,所以在java中所有的类都是直接或间接继承了Object类。Object类是比较特殊的类,它是所有类的父类,是java类层中最高类层。由于所有的类都是Object的子类,所以在定义类时,省略了extends关键字。例如:
既然是父类自然也可以拥有Object类的方法,在Object类中主要包括clone()、finalize()、equals()、toString()、hashCode()等方法。
finalize()方法:
finalize()方法用于垃圾回收提醒,在java中还在被引用的对象不会被回收,没有被引用或指向的是一个空指针,那么这个对象就会被回收。例如:
此时在内存里s1和s2由于指向的是空指针所以都会被垃圾回收机制回收掉。例如:
如果还在被其他对象引用指向的就不会被回收。例如:
此时s1还在被引用所以s1不会被回收。例如:
如果想要垃圾被回收的时候有个提醒就可以重写Object的finalize()方法,这个方法是专门用来提醒垃圾回收的。例如:
因为s1还在被s3引用中,所有只有s2会被回收
equals()方法:
因为在java中==是用来比较内存地址、对象的引用的,而equals方法是用于比较实际内容的。equals方法是Object类提供的比较方法,因为所有的类都默认继承Object,这个方法用于比较本类对象和字符串内容是否相等。equals在String内的方法内核:
这个方法的内核原理是先把要比较的对象作为参数传递进这个方法里,然后先比较是否为当前对象,是的话就返回true不是的话就继续判断这个对象是否为这个类的实例,是的话就将这个对象强制转换为这个类的类型,接着比较长度是否一致,长度不一致就return false,长度一致的话就把值一个个的拿出来比较,如果有一个值不一样的话就会return false。
在java中字符串其实都是char数组,所以java有字符串池来优化字符串,使其不会占用太多的资源,因为字符串池的原因声明赋值时是同一个值就指向的是同一个内存地址,例如直接用” ”赋值给一个字符串类型变量的话,如果下一个赋的也是同一个值,那么它们指向的就是同一个内存地址。但是如果使用new关键字来构建对象赋值的话,就是各自指向的自己新建的内存地址,这时候用==就无法比较它们的实际内容了,需要使用equals方法来进行比较。用==比较new出来的对象就会出现false的结果:
用equals方法则比较的是实际内容,比较new出来的对象只要是内容一致结果就是true:
本文出自 “12831981” 博客,请务必保留此出处http://12841981.blog.51cto.com/12831981/1974049
以上是关于三种单例模式与Object祖先类的主要内容,如果未能解决你的问题,请参考以下文章