标签:
三.集合
集合类的基本接口是Collection接口
public interface Collection<E>{
boolean add(E element); //判断是否增加元素
Iterator<E> iterator();//迭代元素,返回一个实现了Iterator接口的对象
...
}
1.迭代器
public interface Iterator< E>
{
E next();//返回元素
boolean hasNext();//判断是否有供访问的元素
remove();
}
实例 :
Collection<String> c=...;
Iterator<String> iter=c.iterator();
while (hasNext( ))
{
String element= iter.next();
}
java 5.0后使用更优雅的方式 for each 循环
for( String element :c)
{}
这个循环是带有迭代器的循环
调用iterator()接口的remove()方法时,必须先调用 next()方法 ,不能单独调用remove()方法
2.Collection 接口的一些方法
int size();
boolean isEmpty();
boolean contains( Object obj)
boolean containsAll( Collection<?> other) //如果这个集合中包含 other集合中的所有元素 返回true
boolean add( Object obj) //向集合中添加元素,如果集合元素改变,则返回true
boolean addAll( Collection other)
boolean equals ( Object other)
boolean remove( Object obj);
void clear ()
Object [] toArray() //返回这个集合的对象数组
<T> T[ ] toArray( T[] Arraytofill)
3.具体的类
Collecton 接口有一个超类AbstractCollection
ArrayList 一个可以动态增长和动态缩减的索引序列
LinkedList 一个可以在任意位置进行高效插入和删除的有序序列
ArrayDeque 一个用循环数组实现的双端队列
HashSet 一个没有重复元素的无序集合
TreeSet 一个有序集
EnumSet
HashMap 一种存储键值关联的数据结构
TreeMap 一种键值有序排列的映射表
interface ListIterator<E> extends Iterator<E>
{
void add(); //返回值没有 不同于Collection的add方法 返回true
E previous() //返回被越过的元素 next方法返回的是要越过的元素
boolean hasPrevious()
}
3.1
要在集合中间添加元素需要用到 ListIterator接口 的add方法 ,LinkedList.add方法只能在链表末尾添加元素
迭代器的set方法在next()元素之前插入新的元素
数组列表 ArrayList 封装的是一个动态数组
ArrayList Vector
ArrayList 是不同步的.Vector是同步的,Vector 会在同步操作上耗费大量资源,因此在不需要同步时使用ArrayList 类 ,不要使用Vector 类
3.2散列集
如果不在意元素的次序,可以有几种数据结构实现元素的快速查找
比如散列表 散列表为每一个对象计算出一个整数散列码,不同对象域的对象具有不同的散列码 散列表用链表数组实现, 每个列表成为桶,散列表的散列码除以桶数,然后取余数,余数是对象存储的位置.例如 76268除以128 余108 则这个对象放在108号桶中
当108号桶中没有元素,将对象直接插入即可.
Set 类型是用散列表实现的 ,Set类型是一个无序的不重复元素集合
HashSet这个类实现了基于散列表的集合,用add方法添加元素 ,查找元素时只要查找某个桶中是否有这个元素,而不需要查看所有桶
散列集迭代器依次迭代桶中的元素 ,因为元素是随机的存放,只有元素不考虑顺序时候才可以使用HashSet 这个类
int hashCode() 返回的是对象的散列码 equals 和hashCode 必须兼容 ,即如果x.equals(y)返回true,那么x.hashCode()返回的值等于y.hashCode()
3.3树集
TreeSet 类和散列表类似,但有所改进,数集是有序的,排序是用树状结构实现的.将一个元素添加到树上要比添加到散列表中慢,但还是比添加到数组和链表中快.
TreeSet 排序是通过实现Comparable接口实现的
interface Comparable <T>
{
int compareTo( T other)
}
a.compareTo(b); 如果a和b相同,则返回0,如果a排在b之前怎返回负数.如果a排在b之后,返回正数
因此如果自定义排序,实现Comparable接口,重写compareTo方法这种方式有一定的局限性
提供了另一个接口Comparator ,构造一个比较器类实现该接口,将该比较器类传给TreeSet的构造器.
interface Comparator <T>
{
int compare(T a.T b);
}
例如 : public itemComparator implements Comparator<Item>
{
public int compare ( Item a, Item b)
{
String descA=a.getDesciption();
Strng descB=b.getDescription();
return descA.compareTo(descB);
}
}
Comparator itemComparator= new ItemComparator();
Set<Item> ts=new TreeSet <Item> (itemComparator);
该代码可以用匿名内部类进行简化
代码如下
Set<Item> ts= new TreeSet<Item>(new Comparator(){
public int compare(Item a,Item b)
{
String descA=a.getDesciption();
Strng descB=b.getDescription();
return descA.compareTo(descB);
}
}
);
3.4队列 和双端队列
Deque和ArrayList 类都可以实现双端队列 .队列是在队尾添加元素,队头删除元素
Queue 的方法 :
boolean add( E element) //添加元素,如果队列满,抛异常
boolean offer( E element) // 添加元素,如果队列满,返回false
E remove() //删除队头的元素并返回这个元素 如果元素为空,抛出异常
E poll() //删除队头元素,如果为空,返回null
E element() //返回队列头部元素,但不删除 ,如果为空,异常
E peek() // 同上,但为空时,返回为Null
Deque 的方法:
void addFirst( E element )
void addLast( E element )
E offerFirst (E element)
E offerLast( E element)
E removeFirst()
E removeLast()
E pollFirst()
E pollLast()
E getFirst()
E getLast()
E peekFirst()
E peekLast()
3.5映射表
是存键值对的数据结构
HashMap 和TreeMap 都实现了Map接口
散列映射表对键进行散列 ,树映射表对键进行树形排序将其组织成搜索树,与键有关的值不进行散列或比较
Map <String,Employer> hm= new HashMap<String,Employer>();
添加键值对用put方法 , 通过键检索值 value =hm.get(key); 键必须是唯一的,两次操作put同一个键,第二次的值会覆盖第一次
remove(key) //移除key对应的键和值
size方法统计元素个数
Map有三个视图 键集 .值集 键值集
Set <K> keySet ()
Collection<K> values()
Set< Map.Entry<K,V>> entrySet()
遍历键和值
for( Map.Entry<K,V> entry : hm.entrySet())
{
key=entry.getKey();
value=entry.getValue();
}
boolean containsKey ( Object key) //如果映射表中有这个键,返回true
boolean containsValue( Object value )//如果映射表中有这个值,返回true
3.6视图
Arrays.asList( T [] t) 将数组转换成List 返回的是List视图
子范围视图
List list= new ArrayList();
List list2 = list.subList( 10,20);//返回的是list集合中的10~19的元素集合视图
headSet( E to, boolean toIncluded) //从头 是否包含边界
tailSet(E from, boolean toIncluded) //从尾
list2.clear();
不可改变视图
Collections.unmodifiableList()
视图一般只能使用接口的方法
同步视图
HashMap <String,Employer> map=
Collections.sychronizedMap( new HashMap<String,Employer>());
可以将线程不同步的map编程同步的
3.7批量操作 避免 频繁迭代操作
取两个集合 a和b的交集
Set<String> result = new HashSet<String>(a);
result.retainAll(b);
Map <String,Employer> staffMap= ...
Set<String > terminatedIDS=... //要删除的键
staffMap.keySet().removeAll(terminatedIDS);// 从员工表中移除要删除的键值对组
3.8 算法
1排序算法
Collections.sort()可以实现对List接口的集合进行排序
Collections.sort( items, new Comparator(){});
反序排序
Collection.sort(items, Collections.reverseOrder( new Comparator() {}) );
底层采用的是归并排序 ,先将元素移到数组,然后归并排序,再复制回列表
2.二分查找
只有随机访问,二分查找才有意义
i = Collections.binarySearch(c , element ,itemComparator) 会判断列表是否实现了RandomAccess接口,如果实现,采用二分查找,否则采用线性查找. i>=0表示匹配到了对象索引,小于0 则没有匹配元素
if(i<0)
{
c.add(-i-1, element)
}
3.简单的算法
Collections.min( Collection <T> elements , Comparator< ? super T>c) //返回集合中最小元素
void Collections.copy( List<? super T> to , List<T> from) //复制列表
boolean Collections.addAll( Collection<? super T> c, T ... values)
//将所有的值添加到集合中,如果集合改变了,返回true
boolean Collections.replaceAll( List< ? Super T> l, T oldValue ,T newValue)
用newValue值取代oldValue
int Collections.indexOfSubList( List<?> l, List<?> s)//返回l列表中 第一s列表的索引,没有返回-1
Collections.swap( List<?>, int i, int j);
交换给定偏移量的两个元素
Collections.reverse( List<?>); 逆置列表中的元素
3.9一些过时类
java第一版 遗留类 Vector Stack HashTable Properties
Hashtable (注意table是小写) 线程同步的 作用和HashMap一样的
枚举对元素变量
Enumeration 接口 有两个方法 nextElement 和 hasMoreElements
Hashtable< Employer> staff=new Hashtable<Employer>();
Enumeration<Employer> enum= staff.elements(); //值的枚举对象 返回
键的枚举对象用staff.keys()
if(enum.hasMoreElements())
{
Employer e= enum.nextElement();
}
Collections.enumeration( E e);
Vector 也有枚举方法
Properties 是一个特殊的属性映射表
键和值都是字符串
Properities的一些方法:
Properties () // 创建一个空的映射表
String getProperty( String key) // 返回这个键对应的字符串
void load( InputStream in ) 从 InputStream中加载属性映射表
void store( OutputStream out, String comentString) 将映射表保存到OutputStream 中
Stack 栈
E push(E element)//压栈并返回这个对象
E pop () 弹出并返回栈顶的一个对象,如果栈为空,不能调用该方法
E peek() 返回栈顶元素,但不弹出 ,栈为空不能调用该方法
标签:
原文地址:http://www.cnblogs.com/chuanqimessi/p/4746440.html