1、框架和基本集合必须要高效的
2、框架中允许有不同类型的集合,以类似的方式工作,具有高度操作性
3、对集合的扩展和适应必须是简单的。
所以,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,例如:LinkedList 、TreeSet 、HashSet等,也可以通过这些接口实现自己的集合。
Map(图):存储键/值对 映射
Collection(集合):存储元素集合{List、Set、Queue}
接口:代表集合的抽象数据类型。定义多个接口是为了以不同的方式操作集合对象
实现(类):集合接口的具体实现。
算法是实现集合接口的对象里的方法计算。
1 Collection接口
Collection代表一组Object,即Collection的元素,元素在Collection中无序,可重复,只提供继承与的子接口(如List和Set)
2 List 接口
List接口继承于Collection,是一组有序、可重复的Collection
3 Set接口
Set接口继承于Collection,存储无序,不可重复的对象
4 SortedSet
顾名思义,是Sorted(排序过的)Set,所以他存储有序,不可重复的集合
5 Map
Map接口存储键值对像,提供key到value的映射
6 Map.Entry
描述在Map中的一个元素(键/值对)。是一个Map的内部类
7 SortedMap
以升序排序key,继承与Map
Set和List的区别
1、Set接口实例存储的是无序的,不重复的数据。而List可以存储有序和可重复的元素
2、Set检索效率低,插入删除效率高,且不会影响元素位置变化**<实体类有TreeSet、Hash Set>**
3、List和数组类似,插入删除会影响元素位置变化,但是查找的效率高,可动态增长。
集合类实现类
1、AbstractCollection 实现了大部分的集合接口
2、AbstractList 实现了大部分的List接口,继承与AbstractCollection
3、AbstractSequentialList 继承于AbstractList,提供了对数据元素的链式访问而不是随机访问
4、LinkedList 该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,无同步方法,多线程许实现访问同步,需创建List时候构造一个同步的List
如:Listlist=Collections.synchronizedList(newLinkedList(…));
5、ArrayList 该类实现List接口,实现了可变大小的数组,随机访问、遍历元素有好性能。非同步,不能多线程使用。
6、AbstractSet 实现了大部分Set接口
7、LinkedHashSet 具有可预知迭代顺序的Set接口的哈希表和连接列表实现
8、HashSet 该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,只允许有一个null。
9、TreeSet 实现了Set接口,可实现排序等功能
10、AbstractMap 实现了大部分Map接口
11、HashMap 是一个散列表,存储这键值对映射,具有很快的访问速度,不支持线程同步。
12、TreeMap 继承AbstractMap,使用树
13、LinkedHashMap 继承于HashMap。使用元素的自然顺序排序
Vector
该类和ArrayList非常相似,允许多线程使用,默认增长长度,默认扩容方式为原来两倍。
Stack
栈是Vector的一个子类,实现了后进先出的栈
Dictionary
是一个抽象类,用来存储键值对,与Map类似
如何使用迭代器
通常遍历一个集合时,都是采用for循环或者增强for,这两个方法都可以用在集合框架,但是还可以使用迭代器遍历集合框架,它是一个对象,实现了Iterator接口或ListIterator接口。
遍历ArrayList
public class Test{
public static void main (String[] args){
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Ha");
//第一种遍历方法使用foreach遍历list
for (String str : list){ //也可以写为for(int i = 0 ; i< list.size(); i++)这种形式
System.out.println(str)
}
//第二种遍历,把链表变为数组相关内容遍历
String [] strArray=new String[list.size()];
list.toArray(strArray);
for(String str:list){
System.out.println(str)
}
//第三种遍历方式:使用迭代器
Iterator<String> ite=new list.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
public class Test{
public static void main(String[] args){
Map<String,String> map=new HashMap<String,String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for(String key : map.keySet()){
System.out.ptintln("key=" + key + " and value" + map.get(key));
}
//第二种:
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
while (it.hasNext()){
Map.Entry<String,String> entry=it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐,尤其是容量大的时候
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String,String> entry : map.entrySet()){
System.out.println("key=" + entry.getKey() + "and value" + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
a.如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10.
b.ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为“原始容量*3/2+1"哦。
c.ArrayList是线程不安全的,在多线程的情况下不要使用。
如果一定在多线程使用List的,您可以使用Vector,因为Vector和ArrayList基本一致,区别在于Vector中的绝大部分方法都
使用了同步关键字修饰,这样在多线程的情况下不会出现并发错误哦,还有就是它们的扩容方案不同,ArrayList是通过原始
容量*3/2+1,而Vector是允许设置默认的增长长度,Vector的默认扩容方式为原来的2倍。
切记Vector是ArrayList的多线程的一个替代品。
d.ArrayList实现遍历的几种方法