
书籍学习-Effective Java
个人计划第一部分基础学习
不断学习,通过啃书提高自我
书籍为第三版(中译)
沙丁鱼flat
这个作者很懒,什么都没留下…
展开
-
EffectiveJava学习笔记33:序列化(上) 其它方法优先于java序列化+谨慎地实现Serializable接口+自定义的序列化形式
1.其它方法优先于java序列化原创 2020-03-14 14:36:33 · 319 阅读 · 0 评论 -
EffectiveJava学习笔记32:并发(下)-慎用延迟初始化、不要依赖于线程调度器
1.慎用延迟初始化原创 2020-03-13 15:53:58 · 197 阅读 · 0 评论 -
EffectiveJava学习笔记31:并发(中)-多种方式优先于线程、并发工具优先于wait和notify、线程安全性的文档化
1.executor、task、stream优先于线程1.1 什么是executor?Executor Framework是java平台一个包(java.util.concurrent)的内容.它是一个很灵活的基于接口的任务执行工具。而使用executor框架,能有效建立线程池,由线程池集中管理线程,以实现线程的降耗提速。...原创 2020-03-13 13:54:47 · 181 阅读 · 0 评论 -
EffectiveJava学习笔记30:并发(上)-基础概念、同步访问共享的可变数据、避免过度同步
0.基础概念(原子性、互斥、同步、锁、可见性):原子性:学过的都知道,原子具有不可分割的性质,所以原子性表示的就是不可分割互斥:当一个对象被一个线程改变时,阻止另一个线程观察到对象内部不一致的对象简单应用:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。同步:除了有互斥功能,同时还是有先后依赖关系,使进入同步的每个线程都能看到之前的修改结...原创 2019-12-27 11:24:49 · 136 阅读 · 0 评论 -
EffectiveJava学习笔记29:异常(下)-方法抛出异常建立文档、异常注意事项
1.方法抛出异常建立文档为每个受检异常,尽量都利用javadoc的@throws标签单独声明,记录抛出每个异常的条件。同时为方法可能抛出的未受检异常,通过@throws标签记录下来,不过不要放到方法的声明中。如果一个类中有多个方法因为相同原因抛出同一异常,则在该类的文档注释中可以对这个异常建立文档2.异常注意事项1.捕获信息的处理:异常的细节信息应该是有关联的域的值...原创 2019-12-26 09:24:26 · 151 阅读 · 0 评论 -
EffectiveJava学习笔记28:异常(上)-异常的适用范围、java的三种可抛出结构、抛出与抽象对应的异常
1.只针对异常情况才使用异常这里就是说不要将异常用于正常的控制流中。例: try{.....}catch(Exception e){.......}不要在抛出异常时写正常的控制代码,因为异常机制是没有jvm优化的。所以异常应该只适用于异常情况2.java的三种可抛出结构java语言有三种可抛出结构:受检异常、运行时异常、错误1.受检异常就是我们平常用于ca...原创 2019-12-25 10:57:06 · 576 阅读 · 0 评论 -
EffectiveJava学习笔记27:通用编程(下)-本地方法、谨慎优化、命名规范
1.谨慎使用本地方法什么是本地方法(native method)?所谓的本地方法就是指用本地编程语言(比如c或c++)来编写的方法。简单来说,本地方法(Native Method)就是java调用非java代码的接口。这里java有提供一个专门的JNI接口(java nativeInterface)来允许java引用程序调用本地方法。代码就不写了,就举了VS调用的例子:1...原创 2019-12-23 10:07:41 · 177 阅读 · 0 评论 -
EffectiveJava学习笔记26:通用编程(中)-货币计算推荐BigDecimal、基本类型优先于装箱类型、字符串注意事项、接口优先于反射
1.货币计算推荐BigDecimalps:其实这一内容原标题为:需要精确计算,请避免使用float和double.书中特别注明的一点:float和double类型不适合用于货币计算。为什么? 因为让float和double精确地表示0.1(或者10的任何负数次方值)是不可能的。使用float和double造成的结果就是会出现0.6000000000000001 , 0.99999...原创 2019-12-21 13:18:35 · 228 阅读 · 0 评论 -
EffectiveJava学习笔记25:通用编程(上)-局部变量的作用域最小化、for-each和for、类库和random三种随机
1.将局部变量的作用域最小化就是将局部变量影响的范围尽量最小化,已避免影响其他的方法。其将局部变量影响的作用域最小化的设计原则:1.在第一次要使用局部变量的地方进行声明2.大多的局部变量声明时都应该包含一个初始化表达式3.局部变量所在的方法应该小且集中。4.循环变量(for或for-each中的变量)作用域被自动限定在正好需要的范围内:循环体、循环体之前的初始化、测试、更新...原创 2019-12-19 14:15:05 · 356 阅读 · 0 评论 -
EffectiveJava学习笔记24:为所有导出的API元素写文档注释
为所有导出的API元素写文档注释实际上就是为API元素写javadoc注释。文档注释规范具体使用这里就不讲了,在java编程思想的笔记中已写过具体的一些使用了这里记录下文档注释的规范:1.方法的文档注释约定 1.1 方法的文档注释应该在文档中描述方法的一些约定联系 1.2 方法的文档注释应该让它的每个参数都有一个@param标签,来解释参数 1.3...原创 2019-12-18 09:20:52 · 147 阅读 · 0 评论 -
EffectiveJava学习笔记23:慎用可变参数、返回零长度数组集合不返回null
1.慎用可变参数什么是可变参数?就是可匹配不同长度(数量的参数),可以接收0个或多个指定类型的参数。(一个类型+3个省略号+自定义参数名)例:int... xx具体例子: public static int sum(int... numbs){ int sum=0; for(int numb:numbs){ ...原创 2019-12-17 10:03:45 · 150 阅读 · 0 评论 -
EffectiveJava学习笔记21:检查参数有效性、保护性拷贝
1.检查参数有效性这个主要是建议我们当参数有些特殊的限制时,需要检查参数的正确与否。可被导出(public、protected)的方法比如:限制参数不能小于0 /** * @param m the modulus,which must be positive * @return this mod m * @throwsArithmeticException if...原创 2019-12-13 10:33:36 · 171 阅读 · 0 评论 -
EffectiveJava学习笔记22:API设计建议、慎用重载
1.API设计建议1.方法名称需风格一致2.除非一系列的方法经常被一起调用,来提供快捷方式,否则不要提供快捷方式3.避免过长的参数列表,避免同样类型的参数列表(参数数据不同,数量相同):参数太多记不住顺序、相同类型容易混乱。4.对于参数类型,要优先用接口而不是类5.对于boolean参数,优先使用两个元素的枚举类2.慎用重载之所以要慎用,主要是在一个类中使用多个重...原创 2019-12-16 09:21:26 · 149 阅读 · 0 评论 -
EffectiveJava学习笔记20:注解、标记接口
1.注解Java 注解又称 Java 标注,是一种标记式高耦合的配置方式。本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类注解类型:1.1元注解元注解:用于修饰注解的注解,定义注解时用:@Target:注解的作用目标@Retention:注解的生命周期@Documented:注解是否应当被包含在 JavaDoc 文档中@Inherite...原创 2019-12-12 09:57:19 · 167 阅读 · 0 评论 -
EffectiveJava学习笔记19:EnumSet和EnumMap
1.EnumSet是一个专为枚举设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。简单来说就是为指定的枚举类生成一个外部集合,这个集合中包含枚举类中的枚举值。public class EnumSetMain { enum SardineEnum { A("沙",0), B("丁"...原创 2019-12-11 10:58:40 · 214 阅读 · 0 评论 -
EffectiveJava学习笔记18:enum用实例域代替序数
1.enum用实例域代替序数1.1 首先需要讲下这里的序数是什么?所有的枚举都一个ordinal方法,返回每个枚举常量在类型中的数字位置,例子如下:enum SardineEnum { A("沙",0), B("丁",1), C("鱼",2), D("flat",3); public int Return...原创 2019-12-10 10:16:25 · 158 阅读 · 0 评论 -
EffectiveJava学习笔记17:用enum代替int常量
1.枚举类型(Enum)定义:指由一组固定的常量组成合法值的类型相对于直接int或String类型的常量比较,枚举类型更加安全。特点:1.枚举类型没有可以访问的构造器时,则是真正的final类2.客户端无法创建枚举类型的实例,也不能对它进行扩展,因此不存在实例,只存在声明过的枚举常量(相当于单例的泛型化)3.枚常量无法通过其构造器访问另一个构造器适用范围:当需要一组...原创 2019-12-09 11:08:07 · 243 阅读 · 0 评论 -
EffectiveJava学习笔记16:利用有限制通配符提升API灵活性
利用有限制通配符提升API灵活性1.什么是有限制通配符?之前也讲过了无限制通配符,比如:E (允许所有泛型的引用调用)而有限制通配符就是对通配符进行了限制,这里分为两种:第一种:指定上限,使用extends限制 其泛型类型必须继承(实现)某个类(接口);例子: <Eextends A> ——A为类,那么这个泛型只允许是A及A子类的引用调用第二种:指定...原创 2019-12-07 13:06:11 · 151 阅读 · 0 评论 -
EffectiveJava学习笔记15:非受检警告、列表优于数组
1.非受检的警告(unchecked cast warning)还是吐槽一句:百度不到非受检的警告的具体定义,只能自己总结(不知道对错)。看了书中案例,总结一下:非受检警告=编译器没有检查通过的警告(泛型警告),具体例子:泛型使用具体类型、一个T一个object导致非受检。具体:非受检警告很容易消除,例如 List<String> sardineList...原创 2019-12-06 10:28:11 · 162 阅读 · 0 评论 -
EffectiveJava学习笔记14:泛型与原生态类型
1.什么是泛型?泛型:声明中具有一个或多个类型参数的类或者接口;比如:List<E>2.什么是原生态类型?原生态类型:既不带任何实际类型参数的泛型名称;比如:List3.为什么不要使用原生态类型?因为原生态类型不存在限制的的类型,比如List a。那么在往List a集合中可添加任意类型(这边举个xx类型对象)时不会报错:a.add(xx);但是当要...原创 2019-12-05 10:07:17 · 245 阅读 · 1 评论 -
EffectiveJava学习笔记13:静态成员类优于非静态成员类(嵌套)、限制源文件为单个顶级类
1.静态成员类优于非静态成员类其实这一条标题个人感觉改成4种嵌套类的介绍更好。1.1 什么是嵌套类?嵌套类是指定义在另一个类的内部的类嵌套类有四种:静态成员类、非静态成员类、匿名类、局部类(这里注意一点:非静态成员类、匿名类、局部类 称为内部类,静态成员类不是内部类)1.2 静态成员类public class myTest1 { private stati...原创 2019-12-04 09:59:58 · 178 阅读 · 0 评论 -
EffectiveJava学习笔记12:接口只用于定义类型、尽量以类层次代替标签类
1.接口只用于定义类型1.1 什么是接口用于定义类型?书中这个标题一开始让我费解,只用于定义类型是什么鬼?然后看了书,我决定自己总结概括一下。书中有这么一句话:当类实现接口时,接口就充当可以引用这个类的实例的类型总结意思就是:当一个类中使用接口,来重写实现接口里的方法时,相当于接口是这个类的实例化后的一部分,所以是这个类的类型。就是类实现了接口,然后就能通过实行的接口方法,对实例...原创 2019-12-03 09:42:11 · 165 阅读 · 0 评论 -
EffectiveJava学习笔记11:接口优先于抽象类、使用缺省方法
1.接口优先于抽象类java中提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类抽象类:为实现抽象类定义的类型,类必须成为抽象类的一个子类,因为java只允许单继承,所以这个受到限制。接口:类可以定义混合类型,就是可加入多个接口,混合使用(比抽象类的单继承好)良好的方式:提供一个抽象的骨架实现类(就是模板方法模式):就是建一个抽象类,抽象类实现多个接口,然后类来继承这...原创 2019-12-02 11:21:27 · 327 阅读 · 0 评论 -
EffectiveJava学习笔记10:复合优先于继承,设置继承的注意点
复合优先于继承1.复合和继承的概念继承:实现继承(当一个类扩展另一个类的时候)复合:不扩展现有的类,而是在新的类中增加一个私有域,引用现有类的一个实例。转发:新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回结果。包装类:复合实例包装起来的实例的类2.继承的缺点子类继承父类时,子类可以重写父类的任意方法,打破了封装性(final等措施除外),因此继承用...原创 2019-11-29 09:27:04 · 174 阅读 · 0 评论 -
基础概念:书中的域、final关键字
1.书中的域(Field)在一开始对书中描述的-类的域,这一个词表示迷糊,域是什么?结果查了一下发现,其实是Field,是field那么就好理解了。field:可以是一种属性,可以是一个类变量,可以是一个对象变量,可以是一个对象方法变量、可以是一个函数的参数,然后统称为域。所以,比如 int xx之类的都可以称为域2.final关键字final顾名思义最终的意思,不过...原创 2019-11-28 10:00:36 · 393 阅读 · 0 评论 -
EffectiveJava学习笔记9:类、成员的访问性+使可变性最小化
1.类、成员的访问性1.1使类与成员的可访问性最小化就是尽量使类和成员不被外界访问。以下有四种访问级别:1.private(私有):只有该成员的顶层类内部才可以访问这个成员2.package-private(包级私有):该成员的包的内部的类都可以访问,为“缺省”的访问级别(就是不写访问级别时的默认的)3.protected(受保护):该成员的类的子类都可以访问,内部类也都可...原创 2019-11-28 09:24:18 · 134 阅读 · 0 评论 -
EffectiveJava学习笔记8:考虑实现Comparable接口
1.Comparable接口、compareTo方法类实现Comparable接口,就是为了重写compareTo方法。而compareTo方法与equals方法有点像,都是类的对象的属性的比较,通过比较从而进行排序这种排序可以自定义为类中某个属性,也就是类中的内在排序关系。2.具体使用public class test2 implements Comparable<t...原创 2019-11-27 10:39:23 · 164 阅读 · 0 评论 -
EffectiveJava学习笔记7:始终要覆盖toString、谨慎覆盖clone
1.始终要覆盖toString个人理解:toString就是当把某一对象作为字符串输出时会调用这个方法。(比如:printf(xx); "a"+xx;),其实际上都可看成为printf(xx.toString()); "a"+xx.toString();Object虽然有提供toString,但其输出格式是以下形式的(类名@散列码的无符号16进制)public String to...原创 2019-11-26 10:08:56 · 172 阅读 · 0 评论 -
EffectiveJava学习笔记6:覆盖equals时总要覆盖hashCode
1.hashcode是什么?自我总结:hashcode实际上是对象的地址基础上通过哈希算法演变过来的一个值,用于表现hash表中的位置这个值返回默认为int,这是由于Object父类其默认返回为int,而其它类都是基于这个类的,所以重写hashcode也默认返回int其中hashcode的主要作用就在于通过hash表能快速取值,而这个hash表就是用于java的基于散列集合方面的,诸如...原创 2019-11-25 11:14:42 · 222 阅读 · 0 评论 -
EffectiveJava学习笔记5:==与equals的区别,重写(覆盖)equals方法
1.equals和==的区别其实实质上==和equals是一样的,都是比较两者相等就是判断是否指向同一对象的内存地址。但是equals方法多了几次判断默认的equals方法,实际上是先比较两者的引用是否指向同一对象的地址(和“==”一样)。但是equals比较地址不同之后会再判断对象的值是否相同。下面是我的idea环境下的默认得String的equals方法,可以看出先是==比较地址,然后...原创 2019-11-22 16:22:58 · 193 阅读 · 0 评论 -
EffectiveJava学习笔记4:创建销毁对象章-内存泄露、try-with-resources优先于try-final
1.内存泄漏3个常见来源: 1.1:栈中存在过期引用(永远不会被解除的引用)private object[] tests;test[x]=xx;//test[x]使用后不清空,则会一直存在引用test[x]=null; //用该语句来清空 1.2:缓存中有对象引用 1.3:监听器和其他回调没有有效地取消,而进行不断堆积。2.try-with-resources...原创 2019-11-21 09:39:34 · 227 阅读 · 0 评论 -
EffectiveJava学习笔记3:创建销毁对象章-依赖注入、重用时避免创建
1.依赖注入依赖注入是目前java主流的spring系列框架所提倡的一种编程思想。个人理解是减少了实例化,无需再代码中特地写实例化,让创建被调用的实例时,注入参数时,能自动提供实例以供操作。例如:Class A中用到了Class B的对象b,通常需要在A的代码中显式的new一个B的对象。采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通...原创 2019-11-20 09:17:58 · 170 阅读 · 0 评论 -
EffectiveJava学习笔记2:创建销毁对象-singleton(单例)、不可实例化
1.Singleton单例 定义:指仅仅被实例化一次的类 往往实现Singleton的方法需要构造器为private(私有)、并导出公有的静态成员 1.1使用final来使公有静态成员为final域 public class tests{ public static final tests instance=new tests(); pr...原创 2019-11-19 09:33:31 · 194 阅读 · 0 评论 -
EffectiveJava学习笔记1:创建销毁对象章-javaBean模式、静态工厂方法、构建器(Builder)
无论是构造器(可以使用javaBean模式)、构建器、静态工厂方法,都是为创建类的对象而存在的1.构造器(javaBean模式)构造器不用多说了public class xx{ public xx(){...} public xx(int x){...}}JavaBean模式就是现实使用无参构造器创建对象,通过get、set方法(主要通过setter方法设置...原创 2019-11-18 10:40:29 · 157 阅读 · 0 评论