Java集合归纳复习
1、集合类概述
java.util包中就包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式。
Java2的集合框架,抽其核心,主要有三种:List、Set和Map。如下图所示: Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
2.集合类特性
(1)几个常用类的区别
ArrayList: 元素单个,效率高,多用于查询
Vector: 元素单个,线程安全,多用于查询
LinkedList:元素单个,多用于插入和删除
HashMap: 元素成对,元素可为空
HashTable: 元素成对,线程安全,元素不可为空
3.接口
(1)List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(?));
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 (2)Set接口
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
(3)Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
Hashtable是同步的。
HashMap类
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 WeakHashMap类
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
4.collections 和collection
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
第二篇:java集合
一:集合:升级版的数组。
1:数组的缺点:在操作添加和删除元素以及排序的时候,需要移动大量元素。
2:定义:一种数据结构,在软件开发过程中应用广泛。(购物车的商品列表,播放列表等)
3:Java中使用接口Collection定义集合的概念。
添加元素,删除元素,集合的交并差。
4:Collection的子接口:list有序可重复的;set无序不可重复的; 5:list接口的子类:ArrayList:可变长数组的方式实现线性表集合;(元素是有序,可以重复的)
list接口的子类: LinkedList:双向循环链表的方式实现线性集合(元素是有序,可以重复的)
set接口的子类:HashSet(元素是无序,不可以重复的)
6:list方法:add()增加元素;Remove()删除元素;get(i)取出第i个元素;indexOf()得到某对象在集合中的位置;Contents()//判断某个对象是否在集合中;
7:泛型:集合中通常存放相同对象,功能是可以约束集合中元素的类型,减少编程错误,在泛型中强制或自动转化都是隐形的。(1.5版本以后)
用<>来表示
8:散列表的概念(Hash 哈希算法 / 散列算法)
数据结构:成对存储键值对(key-value).key不能重复,value可以重复
1) 容量:散列数组的大小
2) 散列运算:key->对应散列下标的算法 "Mac".hashCode()%10 -> 3
3) 散列桶:散列值相同的元素的“线性集合”
4) 加载因子(load factor)小于75%
6(元素数量) / 10(散列表容量) = 60%
5) 散列查找:根据key计算散列值,根据散列值找到散列桶,
在散列桶中顺序比较key,如果相同,返回此元素。
6) 散列表中key不同,value可以重复。
散列算法:不可逆的单向函数。key -> f(key)
9:Map:
HashMap 常用方法:
put(key, value)
constainsKey(key) //返回boolean,判断集合中是否包含key值 get(key) //通过key找到value
remove(key) //从集合中去除元素
keySet() //返回key的集合,Set
values() //返回值的结合,Collection
8.集合的迭代(遍历)Iterator
Java API中的接口Iterator描述的逐一遍历的方法。遍历购物车,遍历播放列表
1) Iterator描述了一个线性结构(顺序结构)。有指针(游标)的概念。 指针的初始位置在第一个元素之前。
hasNext():当前指针的下一个位置有没有元素
next():指针下移一位,取出当前位置的元素
2)集合的方法remove /add / set 在迭代过程中不要使用
如果需要在迭代的时候删除集合内容,使用迭代器自己的删除方法:remove 移除当前指针指向的元素。
9.集合元素的排序
1)API : 字符串(已经实现了Comparable接口并重定义了compareTo()方法,按字典排序) / 整型数据
自定义对象类(自定义排序原则)
2)比较器Comparator
数据和比较原则分开。CallBack(回调)方式
Sort();
简单类型-->包装类(封装类)
byte --> Byte
short --> Short int --> Integer
long --> Long
double --> Double fload --> Float
boolean --> Boolean char --> Charater
区别: Comparator,Comparable
Comparable (接口)里面的 compareTo()方法: 自定义排序原则,需要排序的类实现此接口
Comparator compare (): 自定义排序原则,需要和排序的类分开
Collections.sort(list):list中的元素实现了Comparable 接口
Collections.sort(list,比较器实例): list中的元素按照比较器中的规则比较
10:map:一对一对的出现(key-value对,key不能重复,value可
以重复);
collection:一个一个的出现
11:set 接口的子类hashSet
12:HashMap:
Put(key,value)
constainsKey(key):返回boolean,判断集合中是否包含key值 get(key):通过key找到value值
remove(key):从集合中去除
13:集合的迭代(遍历)iterator
14:集合的排序:sort
练习:发牌的过程
对象:牌:card;玩家:player
发牌的过程:
全部的54张牌:Card对象的集合,54个元素
玩家:Player对象集合,N个元素
动作:发牌;
洗牌(打乱)
遍历全部牌的集合(每张牌)顺序发给玩家集合中的每个人; 最后剩下m张牌不发。
看一下每个玩家手里面的每一张牌
Day10/src/card/