1. 集合
从上图可以看出,集合框架包含两种类型的容器:一是Collection,用来存储元素,二是Map,用来键值对关系映射,Collection接口又分为List、Set、Queue三个子接口,下面又分为一个抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap
-
接口
Collection:Collection存储一组不唯一、无序的对象
List:List存储一组不唯一、有序的对象
Set:Set存储一组唯一、无序的对象
SortSet:继承自Set,存储有序的对象
Map:Map存储一组键值对象
Map.Entry:描述Map中的一个对象
SortMap:j继承自Map,使Key保持升序
-
List和Set的区别
List支持有序且不唯一的对象,Set只能存放无序对象,并且可以重复
List可以通过索引取值,查找速度快,删除和插入速度慢,插入数据时,会影响当前数据的位置
Set不可以通过索引取值,查找速度慢,删除和插入速度快,插入数据时,不会影响当前数据的位置
-
实现类
LinkList:允许为null,用于创建链表数据结构,线程非安全
ArrayList:动态增长数组,线程非安全,增长偏移量为当前长度的50%
HashSet:不允许出现重复对象,只允许存储一个null
LinkedHashSet:具有可预知迭代顺序的Set接口的哈希表和链接列表实现
HashMap 是一个散列表,它存储的内容是键值对映射,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,线程非安全
LinkedHashMap:继承于HashMap,使用元素的自然顺序对元素进行排序
-
如何使用迭代器
iterationiterator():通过容器获得该容器的迭代器对象
hasNext():判断迭代器中是否存在下一个元素
next():返回迭代器中的下一个元素
2. 泛型
泛型允许提供编译类型的安全检测机制,该机制能够确保在编译时就能够检测到非法数据。泛型的本质是参数化l类型,就是操作的数据被指定为一个数据类型
-
泛型方法
范围方法在调用时可以接收不同类型的参数
定义规则:
所有泛型方法声明都有一个参数类型声明部分<>,该参数声明在方法返回值之前
每个参数声明部分可以包含一个或多个数据类型,用逗号隔开
类型参数能被声明返回值类型,也能被声明为形参类型
类型参数只能表示引用类型
-
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分
因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型
public class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; }
-
类型通配符
?:可以接收任意泛型对象
泛型的上限:extends
泛型的下限:super
3. 流
-
抽象基类
Reader:字符输出流
Writer:字符输入流
InputStream:字节输出流
OutputStream:字节输入流
-
实现类
FileReader:字符输入流,从文件中读取某个字符
BufferedReader:缓冲字符输入流,作用是为其他字符输入流提供缓冲功能,创建时需要向它传递一个字符输入流,BufferedReader会将Reader中的字符分批读取,每次读取一部分
InputStreamReader:输入转换流,将一个字节流中的字节解码成字符,创建时需要一个字节输入流
FileWriter:字符输出流,向文件中写入某个字符
BufferedWriter:缓冲字符输出流,作用是为其他字符输出流提供缓冲功能,创建时需要向它传递一个字符输出流,BufferedWriter会将Writer中的字符分批写入,每次写入一部分
OutputStreamReader:用于将写入的字符编码成字节后写入一个字节流,创建时需要一个字节输出流
FileInputStream:字节输入流,从文件中读取某个字节,通常用来读取图片
FileOutputStream:字节输出流,向文件中写入某个字节,通常用来写入图片
4. 序列化
-
序列化对象
ObjectOutputStream类用来序列化一个对象,创建时需要传递一个字节输出流,通过调用writeObject()方法将对象写入到文件中
-
反序列化对象
ObjectInputStream类用来反序列化一个对象,创建时需要传递一个字节输入流,通过调用readObject()方法将对象从文件中取出
5. 程序、进程和线程
程序:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念
进程:进程就是程序的执行过程
线程:通常一个进程中包含若干个线程,线程是一个比进程更小的执行单位,多个线程贡献一块内存空间
6. 线程的基本状态
新建:新建一个线程对象
可运行:线程创建后,调用该线程start()方法后,该线程就位于可运行线程池中等待线程调度,获得时间片
运行:可运行的线程获得了时间片,执行程序代码
阻塞:线程因为某种原因放弃了cpu使用权,让出时间片,程序暂停。直到线程进入可运行状态,才有可能再次获得时间片。发生阻塞无外乎三种情况,一是调用了wait()方法,JVM会将其放入等待队列中。只有其他线程调用notify()或notifyAll(),等待队列中的线程才会被加入到锁池。二是运行线程在获取对象的同步锁时,发现同步锁已被其他线程占用,JVM会将其放入锁池,只有拿到锁才能进入可运行状态。三是运行线程调用了sleep()、join()、或者I/O请求,JVM会将该线程置为到阻塞状态,当sleep超时、join等待线程结束或超时、I/0处理完毕,线程可重新进入可运行状态。
死亡:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期,线程死不可复生
7. 反射
Java反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取属性以及调用方法的机制称为反射
-
Class 表示正在运行的Java应用程序中的类和接口
如何获取某个class文件对象的class对象?
已知类和对象,通过类名.class或对象.getClass()
未知类和对象通过Class.forName("包名.类名")
-
Constructor 关于类的单个构造方法的信息以及对它的访问权限
Constructor类的实例对象代表类的一个构造方法
如何获取某个类的所有构造方法?
通过class对象的getConstructors()方法
-
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限
Field代表某个类中的一个成员变量,并提供动态访问的权限
如何获取所有的成员变量?
通过getFields()方法获取所有public属性,通过getDeclaredFields()方法获取所有声明属性
如何获取指定的成员变量
通过getField("")获取public属性,通过getDeclaredField("name")获取声明属性
设置Field变量是否可以访问
field.setAccessible(boolean);
Field变量值的读取、设置
-
field.get(obj);
- field.set(obj, vlaue);
-
-
Method 提供关于类或接口上单独某个方法的信息
Method类代表某个类中的一个成员方法
如何获取所有方法?
通过getMethods()方法获取所有public方法,通过getDeclaredMethods()方法获取所有声明方法
如何获取指定方法?
通过getMethod(String name, Class<?>...parameterTypes)获取指定public方法,通过getDeclaredMethod(String name, Class<?>...parameterTypes)方法获取指定声明方法
-
通过反射执行方法
invoke(Object obj, Object...args)
转载于:https://blog.51cto.com/13559120/2329045