------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、静态导入
import static语句导入一个类中的某个静态方法或所有静态方法;
eg:import static java.lang.Math.sin;
二、可变参数
前提:一个方法接受的参数个数不固定
特点:1、只能出现在参数列表的最后; 2、...位于变量类型和变量名之间,前后有无空格都可以; 3、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
三、for循环增强
语法:for ( type 变量名:集合变量名 ) { … } ;
注意事项:1、迭代变量必须在( )中定义! ;2、集合变量可以是数组或实现了Iterable接口的集合类。
四、基本数据类型的自动拆箱与装箱
1、自动装箱:Integer num1 = 12; //int->Integer2、自动拆箱:System.out.println(num1 + 12); //Integer->int
五、枚举
1、为什么要有枚举?
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
2、普通类模拟枚举
1)私有的构造方法 ;2)每个元素分别用一个公有的静态成员变量表示;3)可以有若干公有方法或抽象方法。
3、枚举特点
1)枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法;2)枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误;3)带构造方法的枚举(构造方法必须定义成私有的);4)带方法的枚举;5)枚举只有一个成员时,就可以作为一种单例的实现方式。
六、泛型
1、ArrayList<E>类定义和ArrayList<Integer>类引用中涉及如下术语:
整个称为ArrayList<E>泛型类型,ArrayList<E>中的E称为类型变量或类型参数,整个ArrayList<Integer>称为参数化的类型,ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数,ArrayList<Integer>中的<>念着typeof,ArrayList称为原始类型。
2、泛型的应用
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。
3、泛型的好处
把运行时的异常转到了编译时期,避免了程序员强制类型的转换。
4、泛型的特点
参数化类型与原始类型的兼容性(参数化类型可以引用一个原始类型的对象,编译报告警告,原始类型可以引用一个参数化类型的对象,编译报告警告,),参数化类型不考虑类型参数的继承关系,编译器不允许创建泛型变量的数组。即在创建数组实例时,数组的元素不能使用参数化的类型。
5、定义泛型的前提
1、当定义方法时,不确定参数的传入类型;2、只有引用类型才能作为泛型方法的实际参数;3、只有引用类型才能作为泛型方法的实际参数
6、泛型中的?通配符(占位符,任意类型)
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
泛型的限定:1)限定通配符的上边界(只能是?或其父类):Vector<? extends Number> x = new Vector<Integer>();
2)限定通配符的下边界(只能是?或其父类):Vector<? super Integer> x = new Vector<Number>();
/*注意:限定通配符总是包括自己,?只能用作引用,不能用它去给其他变量赋值*/
7、通过反射获得泛型类型
七、线程并发库
1、ReadWriteLock
获得读锁: Lock readLock() ;获得写锁: Lock writeLock()
2、Lock锁
在等待 Condition 时,允许发生“虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为 Condition 应该总是在一个循环中被等待,并测试正被等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。
3、传统线程
1)线程的同步互斥 ;
2)Timer(定时器);
3)ThreadLocal(绑定线程相关变量)
4、线程池(就是创建一个存储线程的池子)
1)Executors(线程池工具类):
创建一个固定数量的线程池:static ExecutorService newFixedThreadPool(int nThreads)
创建单个的线程池:static ExecutorService newSingleThreadExecutor()
创建一个根据需要创建的线程池:static ExecutorService newCachedThreadPool()
2)ExecutorService(线程池工具类)
提交任务:void execute(Runnable command)
完成当前任务后结束线程:void shutdown()
直接结束任务,并获得未完成任务列表: List<Runnable> shutdownNow()
提交一个返回值的任务用于执行 :<T> Future<T> submit(Callable<T> task)
Callable:必须重写call方法,且必须返回一个结果,返回值类型看泛型
Future:获得返回值中的结果 V get()
5、Semaphore信号灯
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。