码迷,mamicode.com
首页 > 其他好文 > 详细

集合框架

时间:2015-08-20 23:46:30      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

三.集合

集合类的基本接口是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();   //返回值没有 不同于Collectionadd方法 返回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); 如果ab相同,则返回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队列 和双端队列

 

DequeArrayList 类都可以实现双端队列 .队列是在队尾添加元素,队头删除元素

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批量操作   避免 频繁迭代操作

 

取两个集合 ab的交集

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表示匹配到了对象索引,小于则没有匹配元素 

 

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!