内部类、集合
内部类
内部类的定义:可以将一个类的定义放在另一个类的内部,这就是内部类。定义在类内部的类,持有外部类的引用,但对其他外部类不可见。
创建内部类
示例如下
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
Iterable 接口
实现此接口允许对象成为 for-each 循环的目标,也就是增强for 循环,他是Java中的一种语法糖。
List<Object> list = new ArrayList();
for (Object obj: 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是一个抽象类而不是接口。
ArrayList
ArrayList是实现了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方法。
HashSet
HashSet 是Set接口的实现类,由哈希表支持,实际上HashSet是HashMap的一个实例。不能保证集合的迭代顺序,允许null元素。
-
不是线程安全的。必须进行外部加锁或者使用Collections.synchronizedSet()方法重写。
-
支持fail-fast机制
TreeSet
TreeSet是一个基于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
暂时不重要
HashMap
HashMap 是一个利用哈希表原理来存储元素的集合,并且允许空的 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 <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
public static SortedSet synchronizedSortedSet(SortedSet s);
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> 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 |