集合框架

来源:互联网 发布:qq空间访客提取软件 编辑:程序博客网 时间:2024/06/01 23:47

添加一组元素

import java.util.*;public class AddingGroups {  public static void main(String[] args) {    Collection<Integer> collection =      new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)); //Arrays.asList返回视图    Integer[] moreInts = { 6, 7, 8, 9, 10 };    collection.addAll(Arrays.asList(moreInts)); //Collection里有addAll    // Runs significantly faster, but you can't    // construct a Collection this way:    Collections.addAll(collection, 11, 12, 13, 14, 15);    Collections.addAll(collection, moreInts);    // Produces a list "backed by" an array:    List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);    list.set(1, 99); // OK -- modify an element //List里面的set方法,根据索引    // list.add(21); // Runtime error because the 因为Arrays.asList返回的是视图,无法add添加元素,但是可以修改                     // underlying array cannot be resized.  }}

容器的打印

// Containers print themselves automatically.import java.util.*;import static net.mindview.util.Print.*;public class PrintingContainers {  static Collection fill(Collection<String> collection) {    collection.add("rat");    collection.add("cat");    collection.add("dog");    collection.add("dog");    return collection;  }  static Map fill(Map<String,String> map) {    map.put("rat", "Fuzzy");    map.put("cat", "Rags");    map.put("dog", "Bosco");    map.put("dog", "Spot");    return map;  }       public static void main(String[] args) {    print(fill(new ArrayList<String>()));    print(fill(new LinkedList<String>()));    print(fill(new HashSet<String>()));    print(fill(new TreeSet<String>()));    print(fill(new LinkedHashSet<String>()));    print(fill(new HashMap<String,String>()));    print(fill(new TreeMap<String,String>()));    print(fill(new LinkedHashMap<String,String>()));  }} /* Output:[rat, cat, dog, dog][rat, cat, dog, dog][dog, cat, rat][cat, dog, rat][rat, cat, dog]{dog=Spot, cat=Rags, rat=Fuzzy}{cat=Rags, dog=Spot, rat=Fuzzy}{rat=Fuzzy, cat=Rags, dog=Spot}*///:~

这里写图片描述
这里写图片描述

List接口

这里需要注意的是,List 接口的实现类

  • 插入的值允许为空,也允许重复。

ArrayList
1. ArrayList 可以插入空值,也可以插入重复值
2. ArrayList 是基于数组的时候,所以很多数组的特性也直接应用到了 ArrayList。
3. ArrayList 的性能消耗主要来源于扩容和固定位置的增删。
4. ArrayList 创建的时候 需要考虑是否要初始化最小容量,以此避免扩容带来的消耗。

上述的 ArrayList 不是线程安全的。那么 Vector 就可以看作是 ArrayList 的一个线程安全版本,实现同步的方式 是通过 synchronized。由于也是实现了 List 接口,所以也是 可以插入空值,可以插入重复的值。 它和 HashTable 一样,是属于一种同步容器,而不是一种并发容器。(参考《Java并发编程实战》,类似CopyOnWriteArrayList,ConcurrentHashMap这种就属于并发容器)


Iterator接口

public interface Iterator<E> {    /**     * Returns {@code true} if the iteration has more elements.     * (In other words, returns {@code true} if {@link #next} would     * return an element rather than throwing an exception.)     *     * @return {@code true} if the iteration has more elements     */    boolean hasNext();    /**     * Returns the next element in the iteration.     *     * @return the next element in the iteration     * @throws NoSuchElementException if the iteration has no more elements     */    E next();    default void remove() {        throw new UnsupportedOperationException("remove");    }}

Iterator接口中的remove会删除上一次调用next返回的值。
删除第一个元素:

Iterator< String> it = c.iterator();it.next();it.remove();

删除两个相邻的元素:

it.remove();it.next();it.remove();

ListIterator

Iterator接口中没有add方法(只有对自然有序的集合list使用迭代器添加元素才有意义),而子接口ListIterator中包含add方法(在迭代器位置添加元素),为迭代器之前的元素set新值。

package java.util;/** * An iterator for lists that allows the programmer * to traverse the list in either direction, modify * the list during iteration, and obtain the iterator's * current position in the list. A {@code ListIterator} * has no current element; its <I>cursor position</I> always * lies between the element that would be returned by a call * to {@code previous()} and the element that would be * returned by a call to {@code next()}. * An iterator for a list of length {@code n} has {@code n+1} possible * cursor positions, as illustrated by the carets ({@code ^}) below: * <PRE> *                      Element(0)   Element(1)   Element(2)   ... Element(n-1) * cursor positions:  ^            ^            ^            ^                  ^ * </PRE> * Note that the {@link #remove} and {@link #set(Object)} methods are * <i>not</i> defined in terms of the cursor position;  they are defined to * operate on the last element returned by a call to {@link #next} or * {@link #previous()}. * * <p>This interface is a member of the * <a href="{@docRoot}/../technotes/guides/collections/index.html"> * Java Collections Framework</a>. * * @author  Josh Bloch * @see Collection * @see List * @see Iterator * @see Enumeration * @see List#listIterator() * @since   1.2 */public interface ListIterator<E> extends Iterator<E> {    // Query Operations    boolean hasNext();    /**     * Returns the next element in the list and advances the cursor position.     * This method may be called repeatedly to iterate through the list,     * or intermixed with calls to {@link #previous} to go back and forth.     * (Note that alternating calls to {@code next} and {@code previous}     * will return the same element repeatedly.)     *     * @return the next element in the list     * @throws NoSuchElementException if the iteration has no next element     */    E next();    /**     * Returns {@code true} if this list iterator has more elements when     * traversing the list in the reverse direction.  (In other words,     * returns {@code true} if {@link #previous} would return an element     * rather than throwing an exception.)     *     * @return {@code true} if the list iterator has more elements when     *         traversing the list in the reverse direction     */    boolean hasPrevious();    /**     * Returns the previous element in the list and moves the cursor     * position backwards.  This method may be called repeatedly to     * iterate through the list backwards, or intermixed with calls to     * {@link #next} to go back and forth.  (Note that alternating calls     * to {@code next} and {@code previous} will return the same     * element repeatedly.)     *     * @return the previous element in the list     * @throws NoSuchElementException if the iteration has no previous     *         element     */    E previous();    /**     * Returns the index of the element that would be returned by a     * subsequent call to {@link #next}. (Returns list size if the list     * iterator is at the end of the list.)     *     * @return the index of the element that would be returned by a     *         subsequent call to {@code next}, or list size if the list     *         iterator is at the end of the list     */    int nextIndex();    /**     * Returns the index of the element that would be returned by a     * subsequent call to {@link #previous}. (Returns -1 if the list     * iterator is at the beginning of the list.)     *     * @return the index of the element that would be returned by a     *         subsequent call to {@code previous}, or -1 if the list     *         iterator is at the beginning of the list     */    int previousIndex();    // Modification Operations    /**     * Removes from the list the last element that was returned by {@link     * #next} or {@link #previous} (optional operation).  This call can     * only be made once per call to {@code next} or {@code previous}.     * It can be made only if {@link #add} has not been     * called after the last call to {@code next} or {@code previous}.     *     * @throws UnsupportedOperationException if the {@code remove}     *         operation is not supported by this list iterator     * @throws IllegalStateException if neither {@code next} nor     *         {@code previous} have been called, or {@code remove} or     *         {@code add} have been called after the last call to     *         {@code next} or {@code previous}     */    void remove();    /**     * Replaces the last element returned by {@link #next} or     * {@link #previous} with the specified element (optional operation).     * This call can be made only if neither {@link #remove} nor {@link     * #add} have been called after the last call to {@code next} or     * {@code previous}.     *     * @param e the element with which to replace the last element returned by     *          {@code next} or {@code previous}     * @throws UnsupportedOperationException if the {@code set} operation     *         is not supported by this list iterator     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this list     * @throws IllegalArgumentException if some aspect of the specified     *         element prevents it from being added to this list     * @throws IllegalStateException if neither {@code next} nor     *         {@code previous} have been called, or {@code remove} or     *         {@code add} have been called after the last call to     *         {@code next} or {@code previous}     */    void set(E e);    /**     * Inserts the specified element into the list (optional operation).     * The element is inserted immediately before the element that     * would be returned by {@link #next}, if any, and after the element     * that would be returned by {@link #previous}, if any.  (If the     * list contains no elements, the new element becomes the sole element     * on the list.)  The new element is inserted before the implicit     * cursor: a subsequent call to {@code next} would be unaffected, and a     * subsequent call to {@code previous} would return the new element.     * (This call increases by one the value that would be returned by a     * call to {@code nextIndex} or {@code previousIndex}.)     *     * @param e the element to insert     * @throws UnsupportedOperationException if the {@code add} method is     *         not supported by this list iterator     * @throws ClassCastException if the class of the specified element     *         prevents it from being added to this list     * @throws IllegalArgumentException if some aspect of this element     *         prevents it from being added to this list     */    void add(E e);}

set方法用一个新元素取代上一次调用next或previous返回的值
用新值取代第一个元素:

ListIterator<String> iter = list.listIterator();String oldValue = iter.next();iter.set(newValue);

TreeSet:无重复的有序集合

这里写图片描述
对象的比较:
1. 对象实现Comparable接口,重写public int compareTo(T other)方法。
2. 将Compatator对象传入TreeSet构造器

package treeSet;import java.util.*;/** * An item with a description and a part number. */public class Item implements Comparable<Item>{   private String description;   private int partNumber;   /**    * Constructs an item.    *     * @param aDescription    *           the item's description    * @param aPartNumber    *           the item's part number    */   public Item(String aDescription, int aPartNumber)   {      description = aDescription;      partNumber = aPartNumber;   }   /**    * Gets the description of this item.    *     * @return the description    */   public String getDescription()   {      return description;   }   public String toString()   {      return "[descripion=" + description + ", partNumber=" + partNumber + "]";   }   public boolean equals(Object otherObject)   {      if (this == otherObject) return true;      if (otherObject == null) return false;      if (getClass() != otherObject.getClass()) return false;      Item other = (Item) otherObject;      return Objects.equals(description, other.description) && partNumber == other.partNumber;   }   public int hashCode()   {      return Objects.hash(description, partNumber);   }   public int compareTo(Item other)   {      return Integer.compare(partNumber, other.partNumber);   }}package treeSet;/**   @version 1.12 2012-01-26   @author Cay Horstmann*/import java.util.*;/**   This program sorts a set of item by comparing   their descriptions.*/public class TreeSetTest{     public static void main(String[] args)   {        SortedSet<Item> parts = new TreeSet<>();  //默认比较器,实现Comparable接口      parts.add(new Item("Toaster", 1234));      parts.add(new Item("Widget", 4562));      parts.add(new Item("Modem", 9912));      System.out.println(parts);      SortedSet<Item> sortByDescription = new TreeSet<>(new  //匿名内部类,定制的比较器         Comparator<Item>()         {              public int compare(Item a, Item b)            {                 String descrA = a.getDescription();               String descrB = b.getDescription();               return descrA.compareTo(descrB);            }         });      sortByDescription.addAll(parts);      System.out.println(sortByDescription);   }}

队列与双端队列

public interface Queue< E> extends Collection< E>

这里写图片描述

public interface Deque<E> extends Queue<E>public class ArrayDeque<E> extends AbstractCollection<E>                           implements Deque<E>, Cloneable, Serializable

这里写图片描述


优先级队列

PriorityQueue: 堆(heap)
这里写图片描述
这里写图片描述

package priorityQueue;import java.util.*;/** * This program demonstrates the use of a priority queue. * @version 1.01 2012-01-26 * @author Cay Horstmann */public class PriorityQueueTest{   public static void main(String[] args)   {      PriorityQueue<GregorianCalendar> pq = new PriorityQueue<>();      pq.add(new GregorianCalendar(1906, Calendar.DECEMBER, 9)); // G. Hopper      pq.add(new GregorianCalendar(1815, Calendar.DECEMBER, 10)); // A. Lovelace      pq.add(new GregorianCalendar(1903, Calendar.DECEMBER, 3)); // J. von Neumann      pq.add(new GregorianCalendar(1910, Calendar.JUNE, 22)); // K. Zuse      System.out.println("Iterating over elements...");      for (GregorianCalendar date : pq)         System.out.println(date.get(Calendar.YEAR));      System.out.println("Removing elements...");      while (!pq.isEmpty())         System.out.println(pq.remove().get(Calendar.YEAR));   }}

TreeMap基于红黑树实现

Collection的功能方法:
这里写图片描述

原创粉丝点击