摘要: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 下面介绍下内存中各个数据区: PC寄存器/程序计数器(线程私有): 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器 JAVA虚拟机栈(线程私有): 生命周期与线程相同,即创建线程的 阅读全文
posted @ 2018-03-20 15:10 哀&RT 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来。然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封 阅读全文
posted @ 2017-04-19 12:01 哀&RT 阅读(351) 评论(0) 推荐(0) 编辑
摘要: CompareTo方法没有在Object中声明,它是Comparable接口中的唯一的方法,不但允许进行简单的等同性比较,而且允许执行顺序比较。类实现了Comparable接口,就表明它的实例具有内在的排序关系。为实现Comparable接口的对象排序就这么简单:Arrays.sort(a); 实现 阅读全文
posted @ 2017-04-19 11:18 哀&RT 阅读(385) 评论(0) 推荐(0) 编辑
摘要: Cloneable接口表明这样的对象时允许克隆的,但这个接口并没有成功达到这个目的,主要是因为它缺少一个clone方法,Object的clone方法是受保护的。如果不借助反射,就不能仅仅因为一个对象实现了Colneable就可以钓鱼clone方法,即使是反射调用也不能保证这个对象一定具有可访问clo 阅读全文
posted @ 2017-04-18 21:12 哀&RT 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 虽然java.lang.Object提供了toString实现,如下 它包含类名称,一个"@"符号,以及散列码的无符号十六进制表示法。但这一般不是我们所希望看到的。因此建议所有子类覆盖这个toString方法。提供好的toString实现可以使类用起来更加舒适,当对象被传递给println、prin 阅读全文
posted @ 2017-04-18 20:29 哀&RT 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 在每个覆盖equals方法的类中,也必须覆盖hashCode方法。否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,HashSet,Hashtbale。 下面我们先看下hashCode约定内容: 1.只要对象equals方法 阅读全文
posted @ 2017-04-18 14:29 哀&RT 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 覆盖equals方法看似很简单,但是有许多覆盖方法或导致错误,避免这些错误最直接的方法就是不覆盖equals。至于什么时候不覆盖equals方法,主要有下面三种: 1:类的每个实例本质上是唯一的。 对于代码活动实体而不是值的类,如Thread,Object提供的equals实现就是这些类的行为 2: 阅读全文
posted @ 2017-04-18 11:27 哀&RT 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 本条的意思是,让你尽量不要在你的类中覆盖finalize方法,然后在在里面写一些释放你的类中资源的语句。 至于为什么要避免覆盖并使用finalize呢,理由如下: (1)finalize方法不能保证它能被及时的执行。 (2)finalize方法甚至都不会被执行。 (3)System.gc和Syste 阅读全文
posted @ 2017-04-11 20:57 哀&RT 阅读(434) 评论(0) 推荐(0) 编辑
摘要: 虽然当我们用完对象后,java有垃圾回收机制进行回收,但是并没有那么的智能,对于某些被引用的对象,就算我们已经不在使用它了,但是java的回收机制是不会回收他们的,人们称之为“内存泄漏”。 很多时候内存泄漏都是“人们无意识的内存引用”造成的,举个简单的例子: 看似上面的str被回收了,但是,事实上创 阅读全文
posted @ 2017-04-11 20:20 哀&RT 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 一般来说,我们最好的做法是重用对象,而不是每次使用都new出一个新的相同功能的对象,这样做很高效,特别是对于那些不可变类来说。看一个极端的反面例子,如果String s = new String("stringette");每次都被执行的话都会创建一个新的实例,然而stringette本身就是Str 阅读全文
posted @ 2017-04-11 19:47 哀&RT 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 像有些类里面可能只包含静态方法、属性和静态域的类时,而在缺少显示的构造器的时候,编译器会提供一个无参的缺省构造器,由于实例化它们并没有任何意义,所以显然没有必要,这时候我们可以提供一个私有的构造器,这样就不被实例化了,当然,我们最后在构造器中抛出异常来进行说明下,或者加条注释。 当然,有人企图通过将 阅读全文
posted @ 2017-04-11 17:09 哀&RT 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 1:采用私有构造器来强化Singleton属性 顾名思义,即我们需要定义一个private的构造器,但要注意一点,即使我们定义了私有的构造器,但是客户端还是可以借助AccessibleObject.setAccessible方法,通过反射来调用私有的构造器,因此,我们需要修改构造器来抵御这种工具,下 阅读全文
posted @ 2017-04-11 16:52 哀&RT 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 由于静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。因此我们下面要来说说构建器,所谓的构建器其实就是具有创建外部类功能的内部静态类。首先我们先理解几个模式 1.重叠构造器模式 提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依次类推,直到 阅读全文
posted @ 2017-04-11 13:54 哀&RT 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 注:本系列对Effective Java各条进行整理和简洁化,通过书籍和网上博客进行整合,主要参考http://www.jianshu.com/u/3b386b0ef996博主的系列。 首先我们先看下一个类RandomIntBuilder,用来创建随机的Int整数 接下来我们来加入几个构造器来看看 阅读全文
posted @ 2017-04-11 11:10 哀&RT 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 首先这里先讲下复合模式的定义,复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。具体场景和例子这里就不介绍了。 好了,现在让我们看下什么是模式。 模式:是在某情境下,针对某问题的某种解决方案。 情境就是应用某个模式的情况下,这应该是会不断出现的情况。 问题就是你想在某情境下达 阅读全文
posted @ 2017-03-14 18:59 哀&RT 阅读(143) 评论(0) 推荐(0) 编辑