内部类
创建内部类 集合
Iterable 接口顶层接口
ArrayListVectorlinkedList类StackHashSetTreeSetlinkedHashSetPriorityQueueHashMapTreeMap 类linkedHashMap 类Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图
内部类
内部类的定义:可以将一个类的定义放在另一个类的内部,这就是内部类。定义在类内部的类,持有外部类的引用,但对其他外部类不可见。
创建内部类示例如下
public class OuterClass {
private String name ;
private int age;
class InnerClass{
public InnerClass(){
name = "cxuan";
age = 25;
}
}
}
以上代码中,InnerClass就是OuterClass的一个内部类,每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类拥有外部类的访问权。
内部类不仅仅可以定义在类的内部,还可以定义在方法和作用域内部,这被称为局部内部类,除此之外,还有匿名内部类、内部类可以实现Java中的多重继承。
定义内部类的方式:
一个在方法中定义的类(局部内部类)一个定义在作用域内的类,这个作用域在方法的内部(成员内部类)一个实现了接口的匿名类(匿名内部类)一个匿名类,它扩展了非默认构造器的类一个匿名类,执行字段初始化操作一个匿名类,它通过实例初始化实现构造
每一个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息,内部类信息的表示可以用 $ 来表示,比如OutClass$InnerClass.class
集合集合Collection是一个庞大的集合框架。
首先介绍Iterator
实现此接口允许对象成为 for-each 循环的目标,也就是增强for 循环,他是Java中的一种语法糖。
List
除了实现此接口的对象外,数组也可以用for-each循环遍历,如下:
Object[] list = new Object[10];
for (Object obj: list){}
也可以使用迭代器的方式进行遍历:
for(Iterator it = coll.iterator(); it.hasNext(); ){
System.out.println(it.next());
}
顶层接口
Collection 是一个顶层接口,它主要用来定义集合的约定。
List接口也是一个顶层接口,他继承了Collection接口,同时也是ArrayList、linkedList等集合元素的父类。
Set接口位于与List接口同级的层次上,他同时也继承了Collection接口。Set接口提供了额外的规定。他对add、equals、hashCode方法提供了额外的标准。
Queue是和List、Set接口并列的Collection 的三大接口之一。Queue的设计用来在处理之前保持元素的访问次序。除了Collection基础的操作之外,队列提供了额外的插入,读取,检查操作。
SortedSet接口直接继承于Set接口,使用Comparable对元素进行自然排序或者使用Comparator在创建时对元素提供定制的排序规则。set的迭代器将按升序元素顺序遍历集合。
Map是一个支持key-value存储的对象,Map不能包含重复的key,每个键最多映射一个值。这个接口替代了Dictionary类,Dictionary是一个抽象类而不是接口。
ArrayListArrayList是实现了List接口的可扩容数组(动态数组),它的内部是基于数据实现的。
ArrayList可以实现所有可选择的列表操作,允许所有的元素,包括空值。ArrayList 还提供了内部存储list的方法,能够完全替代Vector,但它不是线程安全的容器。ArrayList有一个容量的概念,这个数组的容量就是List用来存储元素的容量。ArrayList 不是线程安全容器,如果多个线程中至少两个线程修改了ArrayList的结构会导致线程安全问题,作为替代条件应使用Collections.synchronizedList。
List list = Collections.synchronizedList(new ArrayList(...))
ArrayList具有fail-fast 快速失败机制,能够对 ArrayList做出失败检测。当在迭代集合的过程中该集合在结构上发生改变时,就有可能会发生fail-fast 即抛出ConcurrentModificationException 异常 Vector
Vector 同ArrayList 一样,都是基于数组实现的,只不过Vector是一个线程安全的容器,他对内部的每个方法都简单粗暴地上锁,避免多线程引起的安全性问题,但是通常这种同步方式需要的开销比较大,因此访问元素的效率要远远低于 ArrayList。
还有一点在于扩容上,ArrayList扩容后数组长度增加50%,而 Vector的扩容后数组长度会增加一倍。
linkedList类linkedList是一个双向链表,允许存储任何元素(包括null)。他的主要特性如下:
linkedList所有的操作都可以表现为双向性的,索引到链表的操作将遍历从头到尾这个实现也不是线程安全的,这个链表必须进行外部加锁,或者使用
List list = Collections.synchronizedList(new linkedList(...))Stack
堆栈是我们常说的后入先出容器。继承了Vector类,提供push和pop操作,以及在栈顶的peek方法,测试stack是否为空的empty方法,和一个寻找与栈顶距离的search方法。
HashSetHashSet 是Set接口的实现类,由哈希表支持,实际上HashSet是HashMap的一个实例。不能保证集合的迭代顺序,允许null元素。
不是线程安全的。必须进行外部加锁或者使用Collections.synchronizedSet()方法重写。
支持fail-fast机制
TreeSetTreeSet是一个基于TreeMap的 NavigableSet 实现。这些元素使用它们的自然排序或者在创建时提供的Comparator进行排序,具体取决于使用的构造函数。
此实现为基本操作add,remove和contains提供了log(n)的时间成本。不是线程安全的,必须进行外部加锁或者使用
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...))
支持fail-fast机制 linkedHashSet
linkedHashSet继承于Set,他的继承体系:
linkedHashSet 是Set接口的Hash表和linkedList的实现。这个实现不同于HashSet的是他维护着一个贯穿所有条目的双向链表。此链表定义了元素插入集合的顺序。如果元素重新插入,则插入顺序不会受到影响。
linkedHashSet有两个影响其构成的参数:初始容量和加载因子。它们的定义与HashSet完全相同。不是线程安全的,如果多线程同时访问,必须加锁,或者使用
Collections.synchronizedSet
支持fail-fast机制 PriorityQueue
暂时不重要
HashMapHashMap 是一个利用哈希表原理来存储元素的集合,并且允许空的 key-value键值对。HashMap是非线程安全的。但Hashtable是线程安全的容器。HashMap也支持fail-fast机制。HashMap的实例有两个参数影响其性能:初始容量和加载因子。可以使用Collections.synchronizedMap(new HashMap(…)) 来构造一个线程安全的HashMap。
TreeMap 类一个基于NavigableMap实现的红黑树。这个map 根据 key 自然排序存储,或者通过Comparator进行定制排序。
TreeMap 为 containsKey,get,put 和remove方法提供了log(n)的时间开销。不是线程安全的,必须进行外部加锁。或者使用 SortedMap m = Collections.synchronizedSortedMap(new TreeMap(…))支持fail-fast机制 linkedHashMap 类
暂时不重要
Hashtable 类Hashtable 类实现了一个哈希表,能够将键映射到值。任何非空对象都可以用作键或值。
支持fail-fast机制Hashtable是线程安全的。如果不需要线程安全的容器推荐使用HashMap,如果需要多线程高并发推荐使用ConcurrentHashMap。 IdentityHashMap 类
暂时不重要
WeakHashMap 类暂时不重要
Collections 类Collections不属于Java框架继承树上的内容,它属于单独的分支,Collections 是一个包装类,它的作用就是危机和框架提供某些功能实现,只包括静态方法操作或者返回collections。
同步包装
同步包装器将自动同步(线程安全性)添加到任意集合。
public static Collection synchronizedCollection(Collection c); public static Set synchronizedSet(Set s); public static List synchronizedList(List list); public static集合实现类特征图Map synchronizedMap(Map m); public static SortedSet synchronizedSortedSet(SortedSet s); public static SortedMap synchronizedSortedMap(SortedMap m);
| 集合 | 排序 | 随机访问 | key-value存储 | 重复元素 | 空元素 | 线程安全 |
|---|---|---|---|---|---|---|
| ArrayList | Y | Y | N | Y | Y | N |
| linkedList | Y | N | N | Y | Y | N |
| HashSet | N | N | N | N | Y | N |
| TreeSet | Y | N | N | N | N | N |
| HashMap | N | Y | Y | N | Y | N |
| TreeMap | Y | Y | Y | N | N | N |
| Vector | Y | Y | N | Y | Y | Y |
| HashTable | N | Y | Y | N | N | Y |
| ConcurrentHashMap | N | Y | Y | N | N | Y |
| Stack | Y | N | N | Y | Y | Y |
| CopyOnWriteArrayList | Y | Y | N | Y | Y | Y |



