摘要: 什么叫做协变(covariance)和逆变(contravariance)? 在变成语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数,泛型,返回值)替换或交换的特性,简单的说,协变是用一个窄类型替换宽类型,而逆变则是用宽类型覆盖窄类型. 协变:宽类型 >窄类型 逆变:窄类型 >宽类 阅读全文
posted @ 2016-06-28 17:24 SummerChill 阅读(733) 评论(0) 推荐(0) 编辑
摘要: Java泛型支持通配符(Wildcard),可以单独使用一个"?"表示任意类,也可以使用extends关键字标识某一类(接口)的子类型,还可以使用super关键字标识某一类(接口)的父类型,但问题是什么时候该用extends,什么时候该用super? (1)泛型结构只参与"读"操作则限定上界(ext 阅读全文
posted @ 2016-06-28 17:23 SummerChill 阅读(589) 评论(0) 推荐(0) 编辑
摘要: Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. 如果你期望生成的列表长度是可变的,那就需要自己来写一个数组的工具类了.代码如下: 与Arrays.asList的调用方式相同,我们传入一个 阅读全文
posted @ 2016-06-28 17:13 SummerChill 阅读(960) 评论(0) 推荐(0) 编辑
摘要: 泛型类型在编译期被擦除,我们在类初始化时将无法获得泛型的具体参数,比如这样的代码: 这段代码有什么问题? t,tArray,list都是类变量,都是通过new声明了一个类型,看起来非常的相似. 但是这段代码是通不过的,因为编译期在编译时需要获得T类型,但是泛型在编译期类型已经被擦除了,所以new T 阅读全文
posted @ 2016-06-28 17:12 SummerChill 阅读(2912) 评论(0) 推荐(0) 编辑
摘要: 泛型可以减少强制类型的转换,可规范集合的元素类型,还可以提高代码的安全性和可读性,正是因为有了这些优点,自从Java引入泛型之后,项目的编码规则上便多了一条,优先使用泛型. Java泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,它与C++中的模板templates比较类似.但 阅读全文
posted @ 2016-06-28 17:04 SummerChill 阅读(2342) 评论(0) 推荐(0) 编辑
摘要: 思考这样一个案例: 阅读全文
posted @ 2016-06-28 16:59 SummerChill 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 思考这样一个案例: 阅读全文
posted @ 2016-06-28 16:57 SummerChill 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 阻塞队列BlockingQueue扩展了Queue,Collection接口,对元素的插入和提取使用了"阻塞"处理,我们知道Collection下的实现类一般都采用了长度自行管理方式(也就是变长). 阅读全文
posted @ 2016-06-28 16:54 SummerChill 阅读(858) 评论(0) 推荐(0) 编辑
摘要: 线程死锁DeadLock是多线程编码中最头疼的问题,也是最难重现的问题,因为Java是单进程多线程语言. 阅读全文
posted @ 2016-06-28 16:42 SummerChill 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 很多编码者都会还说,Lock类和synchronized关键字用在代码块的并发性和内存上时语义是一样的. 阅读全文
posted @ 2016-06-28 16:40 SummerChill 阅读(179) 评论(0) 推荐(0) 编辑
摘要: Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供了一个Executors的静态类,它可以直接生成多种不同的线程池执行器,比如单线程执行器,带缓冲功能 阅读全文
posted @ 2016-06-28 16:39 SummerChill 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 在Java1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止线程死锁等问题,在1.5版本之后引入了并行计算框架,大大简化了多线程开发. 我们知道线程有5个状态:新建状态(New),可运行状态(Runnable,也叫做运行状态),阻塞状态(Blocked),等待状态(Waiti 阅读全文
posted @ 2016-06-28 16:35 SummerChill 阅读(415) 评论(0) 推荐(0) 编辑
摘要: 多线程有两种实现方式: 一种是实现Runnable接口,另一种是继承Thread类,这两种方式都有缺点,run方法没有返回值,不能抛出异常(这两个缺点归根到底是Runable接口的缺陷,Thread也是实现了Runnable接口),如果需要知道一个线程的运行结果就需要用户自行设计,线程类自身也不能提 阅读全文
posted @ 2016-06-28 16:34 SummerChill 阅读(557) 评论(0) 推荐(0) 编辑
摘要: 线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程序不能设置该级别) 那是不是级别为10的线程肯定比级别为9的线程优先运行呢? 看代码: 该多线程类实 阅读全文
posted @ 2016-06-28 16:03 SummerChill 阅读(971) 评论(0) 推荐(0) 编辑
摘要: 线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. (2)stop方法会导致代码逻辑不完整 stop方法是一种"恶意" 的中断,一旦执行stop方法, 阅读全文
posted @ 2016-06-28 16:00 SummerChill 阅读(15996) 评论(2) 推荐(2) 编辑
摘要: 多线程比较简单的方式是继承Thread类,然后覆写run()方法,在客户端程序中通过调用对象的start方法即可启动一个线程,这个是多线程程序的标准写法. 错误代码: 这是一个错误的多线程应用,main方法根本没有启动一个子线程,整个应用程序中,只有一个主线程在运行,并不会创建任何其他的线程. 只要 阅读全文
posted @ 2016-06-28 14:59 SummerChill 阅读(614) 评论(0) 推荐(0) 编辑
摘要: 异常原本是正常逻辑的补充,但是有时候会被当做主逻辑使用.看如下代码: 判断一个枚举是否包含指定的枚举项,这里会根据valueOf方法是否抛出异常来进行判断,如果抛出异常(一般是IllegalArgumentException异常),则认为是不包含,若不抛出异常则可以认为包含该枚举项,看上去这段代码很 阅读全文
posted @ 2016-06-28 13:30 SummerChill 阅读(438) 评论(0) 推荐(0) 编辑
摘要: AOP(Aspect Oriented Programming面向切面编程)可以很轻松的控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程(比如AspectJ)只能控制到方法级别,不能实现代码级别的植入(Weave),比如一个方法被类A的m1方法调用时返回1,在类B的m2方法调用 阅读全文
posted @ 2016-06-28 12:10 SummerChill 阅读(1522) 评论(0) 推荐(0) 编辑