日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java核心技术 第11版 集合

發布時間:2023/12/2 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java核心技术 第11版 集合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 核心技術第11版 集合

  • java集合框架
    • 集合接口與實現分離
    • Collection接口
    • 迭代器
    • 泛型實用方法
      • API
  • 集合框架中的接口
    • 鏈表
      • API
    • 數組列表
    • 散列集
      • API
    • 樹集
      • API
    • 隊列與雙端隊列
      • API
    • 優先隊列
      • API
  • 映射
    • 基本映射操作
      • API
    • 更新映射條目
    • 映射視圖
    • 弱散列映射
    • 鏈接散列集和映射
    • 枚舉集與映射
    • 表示散列映射
  • 視圖與包裝器
    • 小集合
    • 子范圍
    • 不可修改的視圖
    • 同步視圖
    • 檢查型視圖
  • 算法
    • 泛型算法
    • 排序和混排
    • 二分查找
    • 簡單算法
    • 批操作
    • 集合和數組間的轉換
  • 遺留的集合
    • Hashtable類
    • 枚舉
    • 屬性映射
    • 位集

java集合框架

集合接口與實現分離

java集合類庫將接口與實現(implementation)分離

隊列通常有兩種實現方式, 一種是使用循環數組, 一種是使用鏈表。

可以使用接口類型存放集合引用

Queue<Customer> expressLane = new CircularArrayQueue<>(100); expressLane.add(new Customer("Harry"));

循環數組容量有限

API文檔中有一組以Abstract開頭的類, 這些類是為類庫實現者設計的, 若想要實現自己的隊列類, 擴展AbstractQueue類比實現Queue接口中所有方法輕松得多

Collection接口

集合類的基本接口是Collection接口

public interface Collection<E> {boolean add(E element);Iterator<E> iterator();... }

迭代器

Iterator接口包含四個方法

public interface Iterator<E> {E next();boolean hasNext();void remove();default void forEachRemaining(Consumer<? super E> action); }

使用next方法可以諸葛訪問集合中的元素, 若到達集合末尾, 則拋出一個NoSuchElementException。

Collection<String> c = ...; Iterator<String> iter = c.iterator(); while (iter.hasNext()) {String element = iter.next();do something with element }

for each循環更加簡練

for (String element: c) {do something with element }

也可以調用forEachRemaining方法, 其將對每一個元素調用Iambda表達式

iterator.forEachRemaining(element -> do something with the element);

可以將Iterator.next與Inputstream.read看成等效的。

remove會刪除上次調用next時返回的元素

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

若想刪除兩個相鄰的元素

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

泛型實用方法

可以編寫任何處理集合類型的實用方法

public static <E> boolean contains(Collection<E> c, Object obj) {for (E element : c){if (element.equals(obj))return true;}return false; }

Collection接口聲明了很多有用的方法, 所有實現類都必須提供這些方法

AbstractCollection類保持基礎方法size和iterator仍為抽象方法, 但是為實現者實現了其他例行方法

public abstract class AbstractCollection<E>implements Collection<E> {...public abstract Iterator<E> iterator();public boolean contains(Object obj){for (E element: this) // calls iterator()if(element.equals(obj))return true;return false;}... }

Collection接口還有一個很好用的方法

default boolean removeIf(Predicate<? super E> )

API

java.util.Collection

  • Iterator<E> iterator()

    Returns an iterator over the elements in this collection.

  • int size()

    Returns the number of elements in this collection.

  • boolean isEmpty()

    Returns true if this collection contains no elements.

  • boolean contains(Object o)

    Returns true if this collection contains the specified element.

  • boolean containsAll(Collection<?> c)

    Returns true if this collection contains all of the elements in the specified collection.

  • boolean add(E e)

    Ensures that this collection contains the specified element (optional operation).

  • boolean addAll(Collection<? extends E> c)

    Adds all of the elements in the specified collection to this collection (optional operation).

  • boolean remove(Object o)

    Removes a single instance of the specified element from this collection, if it is present (optional operation).

  • boolean removeAll(Collection<?> c)

    Removes all of this collection’s elements that are also contained in the specified collection (optional operation).

  • default boolean removeIf(Predicate<? super E> filter)

    Removes all of the elements of this collection that satisfy the given predicate.

  • void clear()

    Removes all of the elements from this collection (optional operation).

  • boolean retainAll(Collection<?> c)

    Retains only the elements in this collection that are contained in the specified collection (optional operation).

  • Object[] toArray()

    Returns an array containing all of the elements in this collection.

  • <T> T[] toArray(T[] a)

    Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array.

java.util.Iterator< E >

  • default void forEachRemaining(Consumer<? super E> action)

    Performs the given action for each remaining element until all elements have been processed or the action throws an exception.

  • boolean hasNext()

    Returns true if the iteration has more elements.

  • E next()

    Returns the next element in the iteration.

  • default void remove()

    Removes from the underlying collection the last element returned by this iterator (optional operation).

集合框架中的接口

集合有兩個基本接口: Collection和Map

映射用put方法插入

V put (K key, V value)

讀取使用get方法

V get (K key)

List是一個有序集合(ordered collection)。

List定義了多個隨機訪問的方法

void add(int index, E element) void remove (int index) E get (int index) E set (int index, E element)

ListIterator接口定義了一個方法用于在迭代器前面增加一個元素

void add(E element)

Set等同于Collection接口, 不過其方法定義更加嚴格。

SortedSet和SortedMap接口會提供用于排序的比較器對象, 這兩個接口定義了可以得到集合子集視圖的方法

接口NavigableSet和NabigableMap中包含一些用于搜索和遍歷有序集和映射的方法, TreeSet和TreeMap實現了這些接口

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BeBKOlOU-1625927053107)(E:\學習筆記\java\java核心技術 第11版\image-20210609193454664.png)]

鏈表

java中所有鏈表都是雙向鏈接的

var staff = new LinkedList<String>(); staff.add("Amy"); staff.add("Bob"); staff.add("Carl"); Iterator<String> iter = staff.iterator(); String first = iter.next(); String second = iter.next(); iter.remove(); //remove last visited element

集合類庫提供ListIterator子接口, 包含add方法

interface ListIterator<E> extends Iterator<E> {void add(E element);... }

還有兩個方法用來反向遍歷鏈表

E previous() boolean hasPrevious()

聲明迭代器如下:

ListIterator<String> iter = staff.listIterator(); var staff = new LinkedList<String>(); staff.add("Amy"); staff.add("Bob"); staff.add("Carl"); ListIterator<String> iter = staff.listIterator(); iter.next(); iter.add("Juliet");

set方法用一個新元素替換調用next或prevoius方法返回的上一個元素

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

當一個迭代器發現其集合被另一個迭代器修改, 或該集合自身某個方法修改, 會拋出ConcurrentModificationException異常

List<String> list = ...; ListIterator<String> iter1 = list.listIterator(); LIstIterator<String> iter2 = list.listIterator(); iter1.next(); iter2.remove(); iter2.next(); //throws ConcurrentModificationException

有一種簡單的方法檢測并發修改:

集合可以跟蹤更改操作的次數, 每個迭代器都會為它負責的更改操作維護一個單獨的更改操作數。每個迭代器方法的開始處檢查它自己的更改操作數是否和集合的更改操作數相等, 若不一致, 拋出一個ConcurrentModificationException

nextIndex和previousIndex方法返回元素的整數索引

package linkedList;import java.util.*;/*** This program demonstrates operations on linked lists.* @author Cay Horstmann*/public class LinkedListTest{public static void main(String[] args) {var a = new LinkedList<String>();a.add("Amy");a.add("Carl");a.add("Erica");var b = new LinkedList<String>();b.add("Bob");b.add("Doug");b.add("Frances");b.add("Gloria");//merge the words from b into aListIterator<String> aIter = a.listIterator();Iterator<String> bIter = b.iterator();while (bIter.hasNext()){if(aIter.hasNext()) aIter.next();aIter.add(bIter.next());}System.out.println(a);//remove every second word from bbIter = b.iterator();while(bIter.hasNext()){bIter.next();if(bIter.hasNext()){bIter.next();bIter.remove();}}System.out.println(b);//bulk operation: remove all words in b from aa.removeAll(b);System.out.println(a);}}

API

java.util.List< E >

  • ListIterator<E> listIterator()

    Returns a list iterator over the elements in this list (in proper sequence).

  • ListIterator<E> listIterator(int index)

    Returns a list iterator over the elements in this list (in proper sequence), starting at the specified position in the list.

  • void add(int index, E element)

    Inserts the specified element at the specified position in this list (optional operation).

  • boolean add(E e)

    Appends the specified element to the end of this list (optional operation).

  • boolean addAll(int index, Collection<? extends E> c)

    Inserts all of the elements in the specified collection into this list at the specified position (optional operation).

  • boolean addAll(Collection<? extends E> c)

    Appends all of the elements in the specified collection to the end of this list, in the order that they are returned by the specified collection’s iterator (optional operation).

  • boolean remove(Object o)

    Removes the first occurrence of the specified element from this list, if it is present (optional operation).

  • E get(int index)

    Returns the element at the specified position in this list.

  • E set(int index, E element)

    Replaces the element at the specified position in this list with the specified element (optional operation).

  • int indexOf(Object o)

    Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.

  • int lastIndexOf(Object o)

    Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain the element.

java.util.ListIterator< E >

  • void add(E e)

    Inserts the specified element into the list (optional operation).

  • boolean hasNext()

    Returns true if this list iterator has more elements when traversing the list in the forward direction.

  • boolean hasPrevious()

    Returns true if this list iterator has more elements when traversing the list in the reverse direction.

  • E next()

    Returns the next element in the list and advances the cursor position.

  • int nextIndex()

    Returns the index of the element that would be returned by a subsequent call to next().

  • E previous()

    Returns the previous element in the list and moves the cursor position backwards.

  • int previousIndex()

    Returns the index of the element that would be returned by a subsequent call to previous().

  • void remove()

    Removes from the list the last element that was returned by next() or previous() (optional operation).

  • void set(E e)

    Replaces the last element returned by next() or previous() with the specified element (optional operation).

java.util.LinkedList< E >

  • LinkedList()

    Constructs an empty list.

  • LinkedList(Collection<? extends E> c)

    Constructs a list containing the elements of the specified collection, in the order they are returned by the collection’s iterator.

  • void addFirst(E e)

    Inserts the specified element at the beginning of this list.

  • void addLast(E e)

    Appends the specified element to the end of this list.

  • E getFirst()

    Returns the first element in this list.

  • E getLast()

    Returns the last element in this list.

  • E removeFirst()

    Removes and returns the first element from this list.

  • E removeLast()

    Removes and returns the last element from this list.

數組列表

ArrayList封裝了一個動態再分配的數組

單線程時使用ArrayList, 多線程時使用Vector

散列集

散列表(hash table)用來快速查找對象, 散列表為每個對象計算一個整數稱為散列碼(hash code)

hashCode方法必須與equals方法兼容

通常將桶數設置為預計元素個數的75%-150%, 標準庫默認類值是16

若散列表太滿, 就需要再散列(rehashed), 裝填因子(load factor)默認為0.75.

HashSet類實現了基于散列表的集

package set;import java.util.*;/*** This program uses a set to print all unique words in System.in.* @author Cat Horstmann*/public class SetTest { public static void main(String[] args) {var words = new HashSet<String>();long totalTime = 0;try(var in = new Scanner(System.in)){while(in.hasNext()){String word = in.next();long callTime = System.currentTimeMillis();words.add(word);callTime = System.currentTimeMillis() - callTime;totalTime += callTime;}}Iterator<String> iter = words.iterator();for (int i = 1; i <= 20 && iter.hasNext(); i++) {System.out.println(iter.next());}System.out.println("...");System.out.println(words.size() + " distinct words. " + totalTime + "milliseconds.");}}

API

java.util.HashSet< E >

  • HashSet()

    Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75).

  • HashSet(int initialCapacity)

    Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75).

  • HashSet(int initialCapacity, float loadFactor)

    Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and the specified load factor.

  • HashSet(Collection<? extends E> c)

    Constructs a new set containing the elements in the specified collection.

java.lang.Object

  • int hashCode()

    Returns a hash code value for the object.

樹集

樹集與散列集十分類似, 不過樹集是一個有序集合(sorted collection), 當前實現使用的是紅黑樹(red-black tree)

treeSet/TreeSetTest.java

package treeSet; import java.util.*;/*** This program sorts a set of Item objects by comparing their descriptions.* @author Cay Horstmann*/public class TreeSetTest {public static void main(String[] args) {var parts = new TreeSet<Item>();parts.add(new Item("Toaster", 1234));parts.add(new Item("Widget", 4562));parts.add(new Item("Modem", 9912));System.out.println(parts);var sortByDescription = new TreeSet<Item>(Comparator.comparing(Item::getDescription));sortByDescription.addAll(parts);System.out.println(sortByDescription);} }

treeSet/Item.java

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;}@Overridepublic String toString() {return "[description=" + description + ", partNumber=" + partNumber + "]";}@Overridepublic boolean equals(Object otherObject) {if(this == otherObject) return true;if(otherObject == null) return false;if(getClass() != otherObject.getClass()) return false;var other = (Item)otherObject;return Objects.equals(description, other.description) && partNumber == other.partNumber;}@Overridepublic int hashCode() {return Objects.hash(description, partNumber);}@Overridepublic int compareTo(Item other) {int diff = Integer.compare(partNumber, other.partNumber);return diff!= 0 ? diff : description.compareTo(other.description);} }

API

java.util.TreeSet< E >

  • TreeSet()

    Constructs a new, empty tree set, sorted according to the natural ordering of its elements.

  • TreeSet(Collection<? extends E> c)

    Constructs a new tree set containing the elements in the specified collection, sorted according to the natural ordering of its elements.

  • TreeSet(Comparator<? super E> comparator)

    Constructs a new, empty tree set, sorted according to the specified comparator.

  • TreeSet(SortedSet<E> s)

    Constructs a new tree set containing the same elements and using the same ordering as the specified sorted set.

java.util.SortedSet< E >

  • Comparator<? super E> comparator()

    Returns the comparator used to order the elements in this set, or null if this set uses the natural ordering of its elements.

  • E first()

    Returns the first (lowest) element currently in this set.

  • E last()

    Returns the last (highest) element currently in this set.

java.util.NavigableSet < E >

  • E higher(E e)

    Returns the least element in this set strictly greater than the given element, or null if there is no such element.

  • E lower(E e)

    Returns the greatest element in this set strictly less than the given element, or null if there is no such element.

  • E ceiling(E e)

    Returns the least element in this set greater than or equal to the given element, or null if there is no such element.

  • E floor(E e)

    Returns the greatest element in this set less than or equal to the given element, or null if there is no such element.

  • E pollFirst()

    Retrieves and removes the first (lowest) element, or returns null if this set is empty.

  • E pollLast()

    Retrieves and removes the last (highest) element, or returns null if this set is empty.

  • Iterator<E> descendingIterator()

    Returns an iterator over the elements in this set, in descending order.

隊列與雙端隊列

雙端隊列(deque)允許在頭部和尾部都高效地添加元素, ArrayDequeue和LinkedList都實現了Deque, 使用這兩個類可以實現雙端隊列

API

java.util.Queue< E >

  • boolean add(E e)

    Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available.

  • boolean offer(E e)

    Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions.

  • E remove()

    Retrieves and removes the head of this queue.

  • E poll()

    Retrieves and removes the head of this queue, or returns null if this queue is empty.

  • E element()

    Retrieves, but does not remove, the head of this queue.

  • E peek()

    Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.

java.util.Deque< E >

  • void addFirst(E e)

    Inserts the specified element at the front of this deque if it is possible to do so immediately without violating capacity restrictions, throwing an IllegalStateException if no space is currently available.

  • void addLast(E e)

    Inserts the specified element at the end of this deque if it is possible to do so immediately without violating capacity restrictions, throwing an IllegalStateException if no space is currently available.

  • boolean offerFirst(E e)

    Inserts the specified element at the front of this deque unless it would violate capacity restrictions.

  • boolean offerLast(E e)

    Inserts the specified element at the end of this deque unless it would violate capacity restrictions.

  • E removeFirst()

    Retrieves and removes the first element of this deque.

  • E removeLast()

    Retrieves and removes the last element of this deque.

  • E pollFirst()

    Retrieves and removes the first element of this deque, or returns null if this deque is empty.

  • E pollLast()

    Retrieves and removes the last element of this deque, or returns null if this deque is empty.

  • E getFirst()

    Retrieves, but does not remove, the first element of this deque.

  • E getLast()

    Retrieves, but does not remove, the last element of this deque.

  • E peekFirst()

    Retrieves, but does not remove, the first element of this deque, or returns null if this deque is empty.

  • E peekLast()

    Retrieves, but does not remove, the last element of this deque, or returns null if this deque is empty.

java.util.ArrayDeque< E >

  • ArrayDeque()

    Constructs an empty array deque with an initial capacity sufficient to hold 16 elements.

  • ArrayDeque(int numElements)

    Constructs an empty array deque with an initial capacity sufficient to hold the specified number of elements.

優先隊列

優先隊列( priority queue)中的元素可以按照任意的順序插入, 但對按照有序的順序進行檢索。

因為優先隊列使用了堆(heap)的數據結構, 堆是一個可以自組織的二叉樹, 若母節點的值恒小于子節點, 稱為最小堆, 反之稱為最大堆

package priorityQueue;import java.util.*;import java.time.*;/*** This program demonstrates the use of a priority queue.* @author Cay Horstmann*/public class PriorityQueueTest {public static void main(String[] args) {var pq = new PriorityQueue<LocalDate>();pq.add(LocalDate.of(1906, 12, 9)); //G.Hopperpq.add(LocalDate.of(1815, 12, 10));pq.add(LocalDate.of(1903, 12, 3));pq.add(LocalDate.of(1910, 6, 22));System.out.println("Iterating over elements...");for (LocalDate date : pq) System.out.println(date);System.out.println("Removing elements...");while(!pq.isEmpty())System.out.println(pq.remove());} }

API

java.util.PriorityQueue

  • PriorityQueue()

    構造一個空的優先隊列(容量默認11)

    PriorityQueue(int initialCapacity)

    構造一個具有指定容量的優先隊列

  • PriorityQueue(int initialCapacity, Comparator<? super E> c)

構造一個使用指定比較器的優先隊列

映射

基本映射操作

如果不需要按照有序的順序訪問鍵, 散列映射相對更快

size方法返回映射中的元素數, 可以用lambda表達式對映射進行迭代處理

score.forEach(k, v) ->System.out.println("key=" + K + ", value=" + v); package map; import java.util.*;/*** This program demonstrates the use of a map with key type String and value type Employee.* @author Cay Horstmann*/public class MapTest {public static void main(String[] args){var staff = new HashMap<String, Employee>();staff.put("144-25-5464", new Employee("Amy Lee"));staff.put("567-24-2546", new Employee("Harry Hacker"));staff.put("157-62-7935", new Employee("Gary Cooper"));staff.put("456-62-5527", new Employee("Francesca Cruz"));//print all entriesSystem.out.println(staff);//remove an entrystaff.remove("567-24-2546");//replace an entrystaff.put("456-62-5527", new Employee("Francesca Miller"));//look up a valueSystem.out.println(staff.get("157-62-7935"));// iterate through all entriesstaff.forEach((k, v) ->System.out.println("key=" + k + ", value=" + v));}}

API

java.util.Map<K, V>

  • V get(Object key)

    Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.

  • default V getOrDefault(Object key, V defaultValue)

    Returns the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key.

  • V put(K key, V value)

    Associates the specified value with the specified key in this map (optional operation).

  • void putAll(Map<? extends K,? extends V> m)

    Copies all of the mappings from the specified map to this map (optional operation).

  • boolean containsKey(Object key)

    Returns true if this map contains a mapping for the specified key.

  • boolean containsValue(Object value)

    Returns true if this map maps one or more keys to the specified value.

  • default void forEach(BiConsumer<? super K,? super V> action)

    Performs the given action for each entry in this map until all entries have been processed or the action throws an exception.

java.util.HashMap< K, V >

HashMap()

Constructs an empty HashMap with the default initial capacity (16) and the default load factor (0.75).

HashMap(int initialCapacity)

Constructs an empty HashMap with the specified initial capacity and the default load factor (0.75).

HashMap(int initialCapacity, float loadFactor)

Constructs an empty HashMap with the specified initial capacity and load factor.

java.util.TreeMap< K, V >

  • TreeMap()

    Constructs a new, empty tree map, using the natural ordering of its keys.

    TreeMap(Comparator<? super K> comparator)

    Constructs a new, empty tree map, ordered according to the given comparator.

    TreeMap(Map<? extends K,? extends V> m)

    Constructs a new tree map containing the same mappings as the given map, ordered according to the natural ordering of its keys.

    TreeMap(SortedMap<K,? extends V> m)

    Constructs a new tree map containing the same mappings and using the same ordering as the specified sorted map.

java.util. SortedMap< K, V>

  • Comparator<? super K> comparator()

    Returns the comparator used to order the keys in this map, or null if this map uses the natural ordering of its keys.

  • K firstKey()

    Returns the first (lowest) key currently in this map.

  • K lastKey()

    Returns the last (highest) key currently in this map.

更新映射條目

更新映射有如下方式:

counts.put(word, counts.get(word) + 1);

但是第一次見到word時會有問題

counts.put(word, counts.getOrDefaule(word, 0) + 1);

另一種方法是使用putIfAbsent

counts.putIfAbsent(word, 0); counts.put(word, counts.get(word) + 1);

merge方法更為方便

counts.merge(word, 1, Integer::sum);

映射視圖

可以得到映射的視圖(view)

Set< K > KeySet(); Collection< V > values(); Set< Map.Entry< K, V > > entrySet();

分別返回鍵集合, 值集合, 鍵值對集合

Set接口擴展了Collection接口

Set< String > keys = map.keySet(); for (String key: keys) {do something with key }

若想同時查看鍵和值

for (Map.Entry< String, Employee> entry : staff.entrySet()) {String k = entry.getKey();Empolyee v = entry.getValue();do something with key, value } for (var entry: map.entrySet()) {do something with entry.getKey(), entry.getValue() }

現在只需要使用forEach方法

map.forEach((k, v) -> {do something with k, v });

鍵集視圖可以調用迭代器的remove方法, 但不能進行添加, 映射條目集視圖同樣

弱散列映射

當對鍵的最后一個引用都沒有時(此時對鍵的唯一引用來自于散列表映射條目時), WeakHashMap類可以與垃圾回收器一起刪除鍵值對

WeakHashMap類使用弱引用(weak references)保存鍵

如果某個對象沒有被他人再引用時, 垃圾回收器會將其回收

如果某個對象只由WeakReference引用時, 垃圾回收也會將其回收, 其將會將該對象的一個弱引用加入隊列, WeakHashMap檢查隊列, 刪除相關聯的映射條目

鏈接散列集和映射

LinkedHashMap和LinkedHashSet 由雙向鏈表實現, 會記住插入元素項的順序(TreeSet使用的是大小順序, HashSet使用隨機順序)。

連接散列映射使用訪問順序來迭代處理映射條目

每次使用get或put時會將項放到鏈表的尾部

構造散列映射使用

LinkedHashMap< K, V > (initialCapacity, loadFactor, true)

作為一般規則,默認負載因子(0.75)在時間和空間成本上提供了很好的折衷。較高的值會降低空間開銷,但提高查找成本(體現在大多數的HashMap類的操作,包括get和put)。設置初始大小時,應該考慮預計的entry數在map及其負載系數,并且盡量減少rehash操作的次數。如果初始容量大于最大條目數除以負載因子,rehash操作將不會發生。

當在表中找不到元素項且表相當滿時, 可以得到表的一個迭代器, 刪除其枚舉的前幾個項, 這些項會是近期最少使用的幾個元素。

可以通過構造子類, 覆蓋方法來實現自動化

protected boolean removeEldestEntry(Map.Entry<K, V> eldest) var cache = new LinkedHashMap<K, V>(128, 0.75F,true) {protected boolean removeEldestEntry(Map.entry<K, V> eldest){return size() > 100;} }

當方法返回true時, 添加一個新映射條目將會刪除eldest項

枚舉集與映射

EnumSet是枚舉類型元素集的高效實現, EnumSet內部使用位序列實現, 若對應的值在集中, 相應的位被設置為1

EnumSet使用靜態工廠方法構造

enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};EnumSet<Weekday> always = EnumSet.allof(Weekday.class);EnumSet<Weekday> never = EnumSet.noneOf(Weekday.class);EnumSet<Weekday> workday = EnumSet.range(Weekday.MONDAY, Weekday.FRIDAY);EnumSet<Weekday> mwf = EnumSet.of(Weekday.MONDAY, Weekday.WEDNESDAY, Weekday.FRIDAY);

可以使用set’常用接口來修改EnumSet

EnumMap是一個鍵類型位枚舉類型的映射, 直接且高效地實現為一個值數組。需要在構造器中指定鍵類型

var personInCharge = new EnumMap<Weekday, Employee>(Weekday.class);

表示散列映射

IdentityHashMap類中, 鍵的散列值使用System.identityHashCode計算, 這是Object.hashCode的計算方法

IdentityHashMap類使用==進行比較, 而不是equals

視圖與包裝器

keySet方法返回一個 實現了Set接口的類對象, 由這個類的方法操縱原映射

小集合

List<String> names = List.of("Peter", "Paul", "Mary"); Set<Integer> numbers = Set.of(2, 3, 5);

對于映射

Map<String, Integer> scores = Map.of("Peter", 2, "Paul", 3, "Mary", 5);

元素, 鍵或值不能為null

對于Map接口, 無法提供參數可變的of方法版本, 因為參數類型會在鍵和值類型之間交替

不過其ofEntries靜態方法可以實現

import static java.util.Map.*; ... Map<String, Integer> scores = ofentries(entry("Peter", 2), entry("Paul", 3),entry("Mary", 5));

of或ofEntries方法生成的集合對象無法更改

var names = new ArrayList<>(List.of("Peter", "Paul", "Mary"));

方法調用

Collections.nCopies(n, anObject)

會返回一個實現了List接口的不可變對象

List<String> settings = Collections.nCopies(100, "DEFAULT");

子范圍

若想取出第10到第19個元素

List<Employee> group2 = staff.subList(10, 20);

該方法與String類的substring方法參數情況相同。

對子范圍操作會自動反映到整個列表。

對于有序集和映射, 可以適應排序順序建立子范圍

SortedSet<E> subSet(E from, E to); SortedSet<E> headSet(E to); SortedSet<E> tailSet(E from); SortedMap<K, V> subMap(K from, K to); SortedMap<K, V> headMap(K to); SortedMap<K, v> tailMap(K from);

java6引入的NavigableSet接口允許更多地控制子范圍操作, 包括指定是否包括邊界

NavigableSet<E> subSet(E from, boolean fromInclusive,E to, boolean toInclusive); NavigableSet<E> headSet(E to, boolean toInclusive); NavigableSet<E> tailSet(E from, boolean fromInclusive);

不可修改的視圖

Collections類中由生成不可改變視圖的幾個方法(unmodifiable view)。

使用如下8個方法來獲得不可修改視圖

Collections.unmodifiableCollection; Collections.unmodifiableList; Collections.unmodifiableSet; Collections.unmodifiableSortedSet; Collections.unmodifiableNavigableSet; Collections.unmodifiableMap; Collections.unmodifiableSortedMap; Collections.unmodifiableNavigableMap; var staff = new LinkedList<String>(); ... lookAt(Collections.unmodifiableList(staff));

同步視圖

視圖機制確保了常規集合是線程安全的, 而沒有實現線程安全的集合類

Collections類的靜態synchronizedMap方法可以將任何一個映射轉換為有同步訪問方法的Map

var map = Collections.synchronizedMap(new HashMap< String, Emloyee >());

檢查型視圖

var strings = new ArrayList<String>(); ArrayList rawList = strings; //warning only, not an error,//for conpatibility with legacy code rawList.add(new Date()); //now strings contains a Date object!

只有當調用get時, 會出現報錯。

檢查型視圖可以檢測該類問題

List<String> safeStrings = Collections.checkedList(strings, String.class);

算法

泛型算法

找出數組中最大元素:

if(a.length == 0) throw new NoSuchElementException(); T largest = a[0]; for (int i = 1; i < a.length; i++)if(largest.compareTo(a[i]) < 0)largest = a[i];

數組列表最大元素:

if(v.size() == 0) throw new NoSuchElementException(); T largest = v.get(0); for(int i = 1; i < v.size(); i++)if(largest.compareTo(v.get(i)) < 0)largest = v.get(i);

鏈表:

if (l.isEmpty()) throw new NoSuchElementException(); Iterator<T> iter = l.iterator(); T.largest = iter.next(); while(iter.hasNext()) {T next = iter.next();if(largest.compareTo(next) < 0)largest = next; }

泛型算法:

public static <T extends Comparable> T max(Collection<T> c){if(c.isEmpty()) throw new NoSuchElementException();Iterator<T> iter = c.iterator();T largest = iter.next();while(iter.hasNext()){T next = iter.next();if(largest.compareTo(next) < 0)largest = next;}return largest;}

排序和混排

Collections類中sort方法可以對實現了List接口的集合進行排序

var staff = new LinkedList<String>(); ... Collections.sort(staff);

該調用默認使用默認比較器

使用List接口的sort方法并傳入一個Comparator對象,可采用其他原則排序

staff.sort(Comparator.comparingDouble(Employee::getSalary));

降序排序:

staff.sort(Comparator.reverseOrder()) staff.sort(Comparator.comparingDouble(Employee::getSalary).reversed())

Collections類中shuffle算法實現隨機混排。

package shuffle;import java.util.*;/*** This program demonstrates the random shuffle and sort algorithms.* @author Cay Horstmann*/ public class ShuffleTest {public static void main(String[] args) {var numbers = new ArrayList<Integer>();for (int i = 1; i <= 49 ; i++){numbers.add(i);}Collections.shuffle(numbers);List<Integer> winningCombination = numbers.subList(0, 6);System.out.println(numbers);Collections.sort(winningCombination);System.out.println(winningCombination);System.out.println(numbers);} }

二分查找

Collections類實現了binarySearch方法

前提: 集合必須有序

i = Collections.binarySearch(c, element); i = Collections.binarySearch(c, element, comparator);

簡單算法

Collections.replaceAll(words, "C++", "Java");

等于以下方法

for (int i = 0; i < words.size(); i++)if(words.get(i).equals("C++")) words.set(i, "java");

Collection.removeIf和List.replaceAll需要提供一個lambda表達式來測試或轉換元素

words.removeIf(w -> w.length() <= 3); words.replaceAll(String.toLowerCase);

批操作

從coll1中刪除coll2的元素

coll1.removeAll(coll2);

找出交集:

var result = new HashSet<String>(firstSet); result.retainAll(secondSet); staff.subList(0, 10),clear();

集合和數組間的轉換

String [] values = ...; var staff = new HashSet<>(List.of(values));

集合到數組有些困難

Object[] values = staff.toArray(); //toArray方法創建Object[]數組, 不能強制類型轉換 String[] values = staff.toArray(new String[0]); //返回的數組創建相同數據類型 staff.toArray(new String[staff.size()]); //在這種情況下不會創建新數組

遺留的集合

Hashtable類

Hashtable和HashMap一樣

枚舉

遺留的集合使用Enumeration接口遍歷元素序列, 實現的兩個方法為hasMoreElements 和nextElement

可以使用Collections.list將元素收集到一個ArrayList中

ArrayList<String> loggerNames = Collections.list(LogManager.getLoggerNames());

靜態方法Collections.enumeration產生枚舉對象

List<InputStream> streams = ...; var in = new SequenceInputStream(Collections.enumeration(stream));

屬性映射

屬性映射(property map)是一個特殊類型的映射結構

  • 鍵和值都是字符串
  • 映射可以很容易保存到文件以及從文件加載
  • 有一個二級表存放默認值
  • 實現類名為Properties

    對于指定程序的配置選項很有用

    var settings = new Properties(); setting.setProperty("width", "600.0"); setting.setProperty("filename", "home/cay/books/cj11/code/v1ch11/raven.html");

    使用store方法保存到文件

    var out = new FileOutputStream("program.properies"); setting.store(out, "Program Properties");

    加載使用如下調用

    var in = new FileInputStream("program.properties"); setting.load(in);

    System.getProperties方法生成Properties對象描述信息

    getProperty方法1生成描述的字符串

    String userDir = System.getProperty("user.home");

    如下調用當鍵不存在時自動設置為相應的字符串

    String filename = setting.getProperty("filename", "");

    可以將所有默認值放在一個二級屬性映射中, 并在主屬性映射構造器中提供該二級映射。

    var defaultSettings = new Properties(); defaultSettings.setProperty("width", "600"); defaultSettings.setProperty("height", "400"); dafaultSettings.setProperty("filename", ""); ... var settings = new Properties(dafaultSettings);

    Stack類有push方法和pop方法與peek方法

    位集

    BitSet類用于存儲一個位序列

    位集將位包裝在字節中, 使用位集比使用Boolean對象的ArrayList更高效

    package sieve;import java.util.BitSet;/*** This program runs the Sieve of Erathostenes benchmark. It computes all primes* up to 2,000,000* @author Cay Horstmann*/ public class Sieve {public static void main(String[] args) {int n = 2000000;long start = System.currentTimeMillis();var bitSet = new BitSet(n + 1);int count = 0;int i;for (i = 2; i <= n; i++){bitSet.set(i);}i = 2;while(i * i <= n){if(bitSet.get(i)){count++;int k = 2 * i;while(k <= n){bitSet.clear(k);k += i;}}i++;}while(i <= n){if(bitSet.get(i)) count++;i++;}long end = System.currentTimeMillis() ;System.out.println(count + "primes");System.out.println((end - start) + "milliseconds");} } /***@author Cay Horstmann*/ #include <bitset> #include <iostream> #include <ctime>using namespace std;int main() {const int N = 2000000;clock_t cstart = clock();bitset<N + 1> b;int count = 0;int i;for (i = 2; i <= N; i++)b.set(i);i = 2;while (i * i <= N){if (b.test(i)){count++;int k = 2 * i;while (k <= N){b.reset(k);k += i;}}i++;}while (i <= N){if (b.test(i))count++;i++;}clock_t cend = clock();double millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;cout << count << "primes\n" << millis << "milliseconds\n";return 0; }

    (“width”, “600”);
    defaultSettings.setProperty(“height”, “400”);
    dafaultSettings.setProperty(“filename”, “”);

    var settings = new Properties(dafaultSettings);

    ## 棧Stack類有push方法和pop方法與peek方法## 位集BitSet類用于存儲一個位序列位集將位包裝在字節中, 使用位集比使用Boolean對象的ArrayList更高效```java package sieve;import java.util.BitSet;/*** This program runs the Sieve of Erathostenes benchmark. It computes all primes* up to 2,000,000* @author Cay Horstmann*/ public class Sieve {public static void main(String[] args) {int n = 2000000;long start = System.currentTimeMillis();var bitSet = new BitSet(n + 1);int count = 0;int i;for (i = 2; i <= n; i++){bitSet.set(i);}i = 2;while(i * i <= n){if(bitSet.get(i)){count++;int k = 2 * i;while(k <= n){bitSet.clear(k);k += i;}}i++;}while(i <= n){if(bitSet.get(i)) count++;i++;}long end = System.currentTimeMillis() ;System.out.println(count + "primes");System.out.println((end - start) + "milliseconds");} } /***@author Cay Horstmann*/ #include <bitset> #include <iostream> #include <ctime>using namespace std;int main() {const int N = 2000000;clock_t cstart = clock();bitset<N + 1> b;int count = 0;int i;for (i = 2; i <= N; i++)b.set(i);i = 2;while (i * i <= N){if (b.test(i)){count++;int k = 2 * i;while (k <= N){b.reset(k);k += i;}}i++;}while (i <= N){if (b.test(i))count++;i++;}clock_t cend = clock();double millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;cout << count << "primes\n" << millis << "milliseconds\n";return 0; }

    總結

    以上是生活随笔為你收集整理的java核心技术 第11版 集合的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    在线看日韩 | 欧美日韩不卡一区 | 在线观看一区 | 久久久国产毛片 | 久久综合久久伊人 | 国产精品一区专区欧美日韩 | 色国产精品 | 亚洲国产高清视频 | 外国av网| 色噜噜狠狠狠狠色综合 | 国产精品毛片一区视频播 | 亚洲天堂视频在线 | 少妇bbbb搡bbbb搡bbbb | 亚洲九九爱 | 成人黄色大片在线免费观看 | 欧美日韩视频在线播放 | 国产精品国产亚洲精品看不卡 | 久久精品视频免费播放 | 久久99这里只有精品 | 亚洲丁香久久久 | 日本韩国精品一区二区在线观看 | 国产三级国产精品国产专区50 | 欧美俄罗斯性视频 | 婷婷色综合| 美腿丝袜一区二区三区 | 91av片| 亚洲va男人天堂 | 国产a免费 | 免费精品在线 | 免费观看www小视频的软件 | 五月天激情视频 | 五月天中文字幕 | 青青草视频精品 | 在线观看视频福利 | 成人小视频在线观看免费 | 亚洲激情在线观看 | 日韩有码专区 | av夜夜操 | 日韩理论片 | 一区二区三区在线视频111 | 国产精品正在播放 | 久久免费在线观看视频 | 久久精品视频国产 | 又色又爽又黄 | 日韩精品中文字幕久久臀 | 国产破处在线视频 | 日韩久久精品一区二区三区下载 | 中国一级片在线播放 | 在线中文字母电影观看 | 91热这里只有精品 | 开心激情综合网 | 日韩av视屏 | 一区二区三区日韩在线观看 | 日韩在线观看一区二区 | 亚洲成人精品 | 99 色| 激情小说网站亚洲综合网 | 日韩 在线a| 91私密视频 | 国内外成人免费在线视频 | 色成人亚洲 | av福利免费 | 成年人在线观看免费视频 | 国产精品中文 | 成人av在线网 | 成人资源在线 | 国产精品6 | 草莓视频在线观看免费观看 | 免费在线91 | 久久国产手机看片 | 国产中文字幕在线播放 | 91精品国产91久久久久久三级 | 久久精品影片 | 成人av资源站 | 精品欧美日韩 | 国产视频一级 | 在线播放你懂 | 开心婷婷色 | 91精品视频免费观看 | 亚洲成a人片77777kkkk1在线观看 | 中文字幕在线看视频 | 久久国产高清 | 91资源在线视频 | 九九99| 久久女教师 | 日本中文字幕在线视频 | 91久久黄色 | 深爱开心激情网 | 婷婷深爱| 亚州国产精品 | 色婷婷狠 | 深夜福利视频在线观看 | 看片网站黄 | 2019中文字幕网站 | 中文字幕.av.在线 | 日韩理论 | 中文字幕黄色网 | 日韩精品网址 | 亚洲春色综合另类校园电影 | 国产精品免费久久久久 | 激情综合五月网 | 永久免费精品视频 | 国产亚洲欧美日韩高清 | 色资源中文字幕 | 久草免费在线观看视频 | 国产成人精品国内自产拍免费看 | 1000部国产精品成人观看 | 黄色片亚洲 | 亚洲国产中文在线观看 | 久久国产精品免费观看 | 久久久久这里只有精品 | 美女久久久久久久久久 | 国产精品久久久久久久久久直播 | 蜜臀久久99精品久久久无需会员 | 精品久久久久久亚洲 | 青青河边草手机免费 | 怡春院av | 狠狠色丁香久久婷婷综合_中 | 黄色网免费 | 色片网站在线观看 | 久久99在线视频 | 日韩免费电影一区二区 | 九热在线 | 麻豆一二三精选视频 | 午夜国产一区二区三区四区 | 91av在线免费看 | 精品视频一区在线 | 久久国产电影 | 中文字幕精品三区 | 超碰在线人人艹 | 国产精品午夜免费福利视频 | 久久久国产一区二区三区四区小说 | 国产精品视频在线看 | 中文字幕丝袜制服 | 国产一区二区电影在线观看 | 久久人操 | 中文字幕韩在线第一页 | 综合色爱| 国产999精品视频 | 国产精品嫩草55av | 在线视频福利 | 色噜噜噜噜 | 国产午夜三级 | 午夜精品一区二区三区视频免费看 | 91视频久久久久久 | 日韩av一区二区三区四区 | 欧美极品少妇xbxb性爽爽视频 | 激情欧美日韩一区二区 | 欧美成人tv| 久久色视频| 九九热免费在线视频 | 色婷婷国产在线 | 国产精品一区二区三区99 | 国产精品视频久久 | 超碰人人超| 国产美女黄网站免费 | 久久精品免费看 | 九月婷婷人人澡人人添人人爽 | 天天操天天摸天天干 | 日本成人中文字幕在线观看 | 国产99久久久国产精品 | 在线观看亚洲精品视频 | 天天搞天天干 | 99国产精品久久久久老师 | 97在线免费观看视频 | 色综合天| 成人在线观看资源 | 免费在线一区二区三区 | 456成人精品影院 | 久久久电影| 久久激情电影 | 国产视频1 | 在线免费看黄色 | 天天干一干 | 欧美精品国产综合久久 | 美女黄网久久 | 97av影院| 久久婷婷国产色一区二区三区 | 黄色三几片 | 久久这里只精品 | 精精国产xxxx视频在线播放 | 五月婷婷六月丁香 | 亚洲欧洲日韩在线观看 | 六月丁香六月婷婷 | 四虎影视4hu4虎成人 | 操老逼免费视频 | 国产香蕉视频在线观看 | 最新日韩在线观看视频 | 国产精品毛片一区二区 | 九九热99视频 | 97在线观看视频 | 国产精品一区二区免费在线观看 | 欧美二区在线播放 | 欧美日韩三级在线观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | www黄在线 | 九热精品| 天天狠狠操 | 亚洲国产免费看 | 亚洲伦理一区 | 日本久久电影网 | 亚洲精品国产精品国自产在线 | 亚洲精品国产自产拍在线观看 | 国产123av | 日韩精品久久久久久 | 日韩在线观看网址 | 天天天天天干 | 久久成人国产精品入口 | 韩国精品在线观看 | 久草在线观看资源 | 九色福利视频 | 午夜免费福利视频 | 国产香蕉久久精品综合网 | 婷婷综合五月 | 91精品啪在线观看国产 | 成人黄色国产 | 91综合久久一区二区 | 丁香资源影视免费观看 | 亚洲天天综合 | 免费黄色av | 国产在线精品国自产拍影院 | 国产中文字幕在线看 | 香蕉日日 | 日本激情中文字幕 | 久久经典视频 | 色福利网 | 亚洲精品视频免费 | 久久九九久久 | 99久久综合狠狠综合久久 | 国产区欧美| 精品人人人人 | 婷婷国产在线 | 91高清一区| 亚洲一区二区三区在线看 | 国产成人三级一区二区在线观看一 | 亚洲美女精品区人人人人 | 手机av在线免费观看 | 欧美一区在线观看视频 | 成人av电影免费在线播放 | 久久99国产视频 | 激情综合婷婷 | 亚洲精品一区二区网址 | 亚洲精品高清视频在线观看 | 日日躁你夜夜躁你av蜜 | 亚洲国产激情 | 精品9999| 成人免费一区二区三区在线观看 | 99久久精品久久久久久清纯 | 国产精品大片 | 五月婷婷另类国产 | 久草网站| 国产97视频 | 97色综合| 777奇米四色 | 亚洲综合网站在线观看 | www.超碰97.com | 成人av电影免费观看 | 久久久久久久精 | 精品人妖videos欧美人妖 | 91精品婷婷国产综合久久蝌蚪 | 夜夜躁天天躁很躁波 | 日韩精品极品视频 | 狠狠色丁香婷综合久久 | 人人澡视频 | 亚洲国产成人精品在线观看 | 久久中国精品 | 精品一区二区在线免费观看 | 亚洲精品视频在线 | 久久久久日本精品一区二区三区 | 人人看黄色 | 久久久免费观看视频 | aaa日本高清在线播放免费观看 | av午夜电影| 四虎影视成人精品国库在线观看 | 久草资源在线观看 | 五月天久久狠狠 | 91自拍91| 91色网址 | 天堂av免费观看 | 国产美女视频网站 | 最近中文字幕在线中文高清版 | 日韩欧美在线观看一区二区三区 | 黄色成年 | www.福利视频| 黄色在线视频网址 | 国产视频亚洲视频 | 成人精品在线 | 91精品一区二区在线观看 | 最新黄色av网址 | 亚洲小视频在线 | 天天插天天 | 日韩在线一区二区免费 | 午夜免费电影院 | 欧美日韩久久久 | 久久99国产精品久久99 | 国产偷国产偷亚洲清高 | 婷婷激情影院 | 国产又粗又长的视频 | 天天色天天操综合网 | 黄色一级大片免费看 | 亚洲精品字幕在线观看 | 麻豆视频免费网站 | 大型av综合网站 | 毛片精品免费在线观看 | 天天搞天天干 | 免费精品在线 | 亚洲最新精品 | 视频在线观看入口黄最新永久免费国产 | 日韩免费一区二区三区 | 国产一级片直播 | 91精品啪| 国产亚洲小视频 | 手机在线日韩视频 | 天天色天天搞 | 性色视频在线 | 国产精品第2页 | 69久久夜色精品国产69 | 日韩精品欧美专区 | 深爱激情久久 | 日本中文一级片 | 国产一级性生活视频 | 亚洲国产成人久久综合 | 狠狠躁日日躁狂躁夜夜躁av | 97免费在线观看视频 | 精品欧美小视频在线观看 | 色亚洲网| 四虎国产精 | 亚洲黄色免费网站 | 日韩最新理论电影 | 婷婷久操| 久久久久久久毛片 | 日本久久电影网 | 最近免费中文视频 | 五月婷婷中文字幕 | 黄色大片免费网站 | 日韩专区在线观看 | 在线观看中文字幕亚洲 | 搡bbbb搡bbb视频 | 狠狠色丁香婷婷综合欧美 | 日本黄区免费视频观看 | 久久久国产精华液 | 国产成人精品a | 四虎成人网 | 香蕉视频4aa | 日韩精品一区二区三区第95 | 超碰97免费观看 | 欧美性色综合 | 99视频在线免费观看 | 91成人在线观看高潮 | 91亚洲精品在线观看 | 色视频国产直接看 | 国产一级二级在线观看 | 丁香六月五月婷婷 | 日韩视频www | 国产九色视频在线观看 | 毛片永久新网址首页 | av+在线播放在线播放 | 亚洲特级毛片 | 婷婷六月天在线 | 午夜91视频| 日韩av视屏在线观看 | 一级理论片在线观看 | 久草网在线观看 | 国产超碰在线观看 | 亚洲最大在线视频 | 在线а√天堂中文官网 | 精品国产一区二区三区噜噜噜 | 国产.精品.日韩.另类.中文.在线.播放 | 国产精品免费观看久久 | 日本中文字幕在线播放 | 国产小视频你懂的在线 | 免费男女羞羞的视频网站中文字幕 | 偷拍福利视频一区二区三区 | 在线观看免费一级片 | 日产乱码一二三区别免费 | 香蕉视频18| 久久色中文字幕 | 91麻豆传媒 | 97超碰在线人人 | 亚洲综合在线一区二区三区 | 国产视频久久 | 国产中文字幕久久 | 免费视频黄 | 免费合欢视频成人app | 狠狠色综合欧美激情 | 97超碰人人 | 一本色道久久综合亚洲二区三区 | 九九热免费在线观看 | 特黄特色特刺激视频免费播放 | 在线免费中文字幕 | 91人人视频在线观看 | 精品夜夜嗨av一区二区三区 | 国产视频一区二区在线 | 99精品黄色片免费大全 | 亚洲综合成人婷婷小说 | 99精品毛片 | 亚洲黄色影院 | 99热这里| 99久久精品国产一区 | 国产高清区 | 天天射天天做 | 亚洲1区在线 | 久久丁香 | 在线观看成人一级片 | 欧美一级特黄高清视频 | 免费观看一区二区三区视频 | 成人在线播放av | 精品国产伦一区二区三区观看体验 | 在线视频一二区 | 欧美日本不卡视频 | av中文字幕免费在线观看 | 91精品一区二区三区蜜桃 | 在线观看国产一区二区 | 欧洲视频一区 | 成人免费ⅴa | 久久中文字幕导航 | 亚洲jizzjizz日本少妇 | 日韩在线三级 | 亚洲午夜精品久久久久久久久久久久 | 在线观看免费观看在线91 | 中文字幕在线观看第三页 | 在线观看视频免费播放 | 国产精品va在线播放 | 五月激情五月激情 | 久久精品看 | 天堂av免费| 精品国产人成亚洲区 | 在线中文字幕视频 | 久久视频一区二区 | 午夜在线免费观看视频 | 66av99精品福利视频在线 | 欧美激情第八页 | 日韩中文字幕免费看 | 九九热视频在线免费观看 | 亚洲区视频在线观看 | 久久好看免费视频 | 在线视频精品播放 | 日日爽视频 | 久久人人爽人人爽 | 美女黄视频免费 | 射久久| 日韩网站一区 | 狠狠色狠狠色综合日日小说 | 久久免费视频在线观看30 | 日韩在线一区二区免费 | 成年人视频在线免费 | 久久涩视频| 在线观看福利网站 | 国产在线a不卡 | 亚洲午夜精 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲一级黄色av | 玖玖视频 | 国内精品在线观看视频 | 最新国产精品亚洲 | 亚洲男男gaygay无套同网址 | 国产香蕉视频在线观看 | 国产精品影音先锋 | 亚洲视频 在线观看 | 中文字幕在线视频网站 | 国产原创av在线 | 久久亚洲影视 | 天天射一射| 亚洲午夜精品久久久久久久久 | 91人人爽人人爽人人精88v | 五月网婷婷 | 涩av在线 | 啪嗒啪嗒免费观看完整版 | 欧美人交a欧美精品 | 91观看视频| 五月天综合激情网 | 日日夜夜精品视频 | 中文字幕乱视频 | 99一级片 | 日韩av中文在线 | 成人小视频在线播放 | 男女拍拍免费视频 | 97精品国产97久久久久久免费 | 色婷婷五| 国产在线a| 国产精品福利在线播放 | 中文字幕 二区 | 日韩免费在线视频 | 日韩电影在线观看一区二区 | 在线精品在线 | 婷婷丁香久久五月婷婷 | 三级黄免费看 | 日韩综合一区二区三区 | 天天干天天摸 | 又黄又色又爽 | 成人a视频在线观看 | 黄色小说在线观看视频 | 福利片视频区 | 久久五月天综合 | 日韩精品一区二区三区免费视频观看 | 人人爽人人看 | 免费久久片 | 欧美精品中文字幕亚洲专区 | 欧美一级片免费在线观看 | 国产成a人亚洲精v品在线观看 | 精品国产伦一区二区三区观看体验 | 日韩综合视频在线观看 | 亚洲精品五月 | 国产69精品久久久久久久久久 | 丁香色婷| 99久热在线精品视频成人一区 | 日本在线观看黄色 | 欧美日韩在线视频一区 | 亚洲国产精品女人久久久 | 免费观看www视频 | 国产精品剧情在线亚洲 | 久久久999 | 欧美激情综合色综合啪啪五月 | 国产精品久久毛片 | 99精品久久久久久久 | 国产成人精品久久久 | 国产剧情在线一区 | 美女网站在线看 | 97在线观看视频免费 | 九九九国产| 国产国语在线 | 国产成人一区二区三区在线观看 | 久久新视频 | 96超碰在线 | av在线电影播放 | 日韩在线小视频 | 在线黄av| 久久综合久色欧美综合狠狠 | 欧美精品久久久久久久久老牛影院 | 91在线中文 | 国产在线一线 | 在线a视频免费观看 | 波多野结衣在线观看一区 | 国产成人精品一区一区一区 | 五月婷婷中文网 | 伊甸园av在线 | 免费合欢视频成人app | 亚洲另类在线视频 | 亚洲国内精品在线 | 免费福利视频网站 | 亚洲女人天堂成人av在线 | 日韩视频在线播放 | 国产一线二线三线性视频 | 欧美日韩亚洲一 | 福利一区视频 | 91麻豆福利 | 91爱在线 | 色网站中文字幕 | 天天人人| 中文字幕免费在线 | 午夜骚影| 一区二区视频免费在线观看 | 国内视频在线观看 | 国产探花视频在线播放 | 探花视频在线观看免费版 | 成人午夜网址 | 国产爽视频 | 精品美女国产在线 | 四虎影视8848dvd | 黄色性av | 欧美一进一出抽搐大尺度视频 | 久久综合婷婷综合 | 最近的中文字幕大全免费版 | 亚洲视频每日更新 | 婷婷伊人五月天 | 国产综合激情 | 黄色国产在线观看 | 国产色道 | 精品国产乱码一区二 | 国产成人一区二区三区 | 日韩免费视频观看 | 久久99久久99精品免观看粉嫩 | 欧美成人在线网站 | 久久综合五月天婷婷伊人 | 人人爽人人爽人人片 | 91亚洲欧美激情 | 狠狠色伊人亚洲综合成人 | 国产一区自拍视频 | 超碰激情在线 | 天天干天天做天天爱 | 91麻豆国产| 亚州精品在线视频 | 欧美综合在线视频 | 亚洲欧美观看 | 久章草在线观看 | www.com黄色 | 人人狠| 97超碰中文字幕 | 91毛片在线 | 亚洲经典中文字幕 | 91人人在线| 99在线视频播放 | 色婷婷国产 | 香蕉网在线观看 | av一区在线播放 | 亚洲97在线| 五月婷婷激情综合 | 天天干天天想 | 久久综合免费视频影院 | 亚洲理论在线观看电影 | 亚洲影视九九影院在线观看 | 人人爽人人爽av | 欧美精品久久久久性色 | 亚洲精品乱码久久久久久按摩 | 99高清视频有精品视频 | 波多野结衣电影久久 | 亚洲国产mv | 久久不射电影院 | 国产在线精品一区 | 在线播放一区 | 欧美日韩调教 | 久久影院精品 | 狠狠色丁香久久婷婷综合_中 | 中文字幕在线观看第一区 | 日韩在观看线 | 日韩精品一区二区在线观看 | 中文字幕 国产 一区 | 99色免费视频 | 日韩精品免费一区二区在线观看 | 日韩簧片在线观看 | 超碰在线人人97 | 超碰在线网 | 最新动作电影 | 中文字幕一区三区 | 97天堂网| 亚洲国产三级 | 国产精品毛片一区二区三区 | 在线日本看片免费人成视久网 | 久久精品国产一区二区三 | 亚洲国产人午在线一二区 | 夜夜躁日日躁狠狠躁 | 久久精品中文字幕少妇 | 青草视频在线 | 日韩啪视频 | 99精品系列 | 国产精品一区在线播放 | 免费视频在线观看网站 | 国产精品久久人 | 中文字幕之中文字幕 | 99视频在线观看免费 | 五月婷婷国产 | 综合在线观看色 | 国产99久久精品一区二区永久免费 | 一级免费av | 激情欧美日韩一区二区 | 五月天久久精品 | 精品在线观看一区二区 | 久久久精品国产一区二区三区 | 麻豆视频免费在线播放 | 亚洲精品日韩在线观看 | 亚洲国产日韩av | 久久精品中文 | 99久热精品 | 日韩一级黄色av | 亚洲精品一区二区18漫画 | 国产精品欧美久久久久天天影视 | 日韩精品aaa | 国产精品视频永久免费播放 | 亚洲电影久久久 | www.色五月.com| 日韩大片在线免费观看 | 成人午夜在线电影 | 欧美淫视频 | 91精品国产综合久久婷婷香蕉 | 欧美极品少妇xbxb性爽爽视频 | 欧美日韩国产在线精品 | 国产精品一区免费看8c0m | 色丁香婷婷 | 激情黄色一级片 | 日韩在线不卡 | 国产精品不卡一区 | 久久艹影院 | 久久久国产精品久久久 | 久久免费视频这里只有精品 | 亚洲视频456 | 色夜影院 | 精品久久久久久久久中文字幕 | 午夜视频在线观看一区二区 | 国产亚洲一区二区在线观看 | 久久 一区 | a一片一级 | 久久久伊人网 | 韩国一区二区三区在线观看 | 国产黄在线观看 | 色国产在线 | 久久久久女人精品毛片九一 | 韩日精品在线 | 天天操天天射天天添 | 九九免费在线观看视频 | 精品国产成人 | 天天狠狠干 | 久久久精品免费看 | 国产视频 久久久 | av观看免费在线 | 免费国产在线精品 | 久久久久久久网 | 日韩在线激情 | 777久久久 | 91成人午夜| 午夜av免费观看 | 国产精品综合久久久久久 | 在线亚洲精品 | 久久久久久久亚洲精品 | 午夜av不卡 | 国产精品欧美日韩 | 国产精品婷婷 | 成人av观看| 91精品亚洲影视在线观看 | 国产精品99精品 | 免费黄色a网站 | 久草精品视频在线看网站免费 | 亚洲dvd| 久久久国产一区二区三区四区小说 | 午夜av免费 | 天天拍天天干 | 久草视频99| 91九色蝌蚪国产 | 激情网在线视频 | 日韩精品一区二区三区在线视频 | 九九热免费视频在线观看 | 国产资源站 | 亚洲精品视频一二三 | 97超碰国产精品女人人人爽 | 国产精品爽爽久久久久久蜜臀 | 开心激情婷婷 | 九九亚洲视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 黄色大片国产 | 久久精彩视频 | 久久好看 | 欧美日韩精品在线观看视频 | 天堂av免费看 | 久久精品视频一 | 人人舔人人射 | 色偷偷网站视频 | 公开超碰在线 | 欧美日韩二三区 | 中文字幕二区三区 | 在线免费观看视频你懂的 | 色就色,综合激情 | 婷婷久月 | 国产又粗又硬又爽视频 | 久久99视频免费观看 | 色婷婷激情电影 | 精品成人免费 | 婷婷中文字幕在线观看 | 免费亚洲电影 | 97视频网址 | 日韩在线免费看 | 中文字幕在线观看网站 | 美女网站在线 | 日本中文字幕系列 | 免费97视频| 国产视频精品在线 | 91在线看 | 黄色免费电影网站 | 国产精品综合在线观看 | 免费精品国产va自在自线 | 九九九热精品免费视频观看 | 天天狠狠干 | 在线观看成人福利 | 亚洲精品视频网址 | 免费日韩一区二区 | 中文字幕在线观看第二页 | 91 在线视频 | 欧美日韩视频网站 | 97视频免费观看2区 亚洲视屏 | 美女视频免费一区二区 | av在线官网| www狠狠操| 亚洲色图美腿丝袜 | 久久情网 | 国产夫妻自拍av | 国产不卡一 | 欧美一二三在线 | 国产精品资源在线观看 | 99精品国产高清在线观看 | 在线看福利av | 色狠狠狠 | 精品亚洲二区 | 人人插人人草 | 婷婷日日 | 91av资源在线 | av在线小说| 成人一级黄色片 | 久久av在线| 欧美在线视频不卡 | 中文成人字幕 | 日韩欧美在线观看 | 亚洲尺码电影av久久 | 婷婷色网址| 视频国产在线观看18 | 天天草天天干天天 | 永久免费的啪啪网站免费观看浪潮 | 国产精品视频永久免费播放 | 亚洲第一中文字幕 | 日日操狠狠干 | 国产精品亚洲视频 | 日韩av成人免费看 | 国产高清久久久久 | 亚洲黄色在线 | 国产精品国产三级国产aⅴ无密码 | 国产精品午夜免费福利视频 | 国产91免费看| 色婷av| 中文字幕色播 | 特级大胆西西4444www | 国产免费成人av | 久久69精品久久久久久久电影好 | 99国产精品一区 | 色资源网在线观看 | 成人av一区二区三区 | 日韩成人不卡 | 91成人久久 | 成人一区二区三区中文字幕 | 久久字幕网 | 精品视频97| 天天插天天干 | 97人人澡人人爽人人模亚洲 | 99在线观看精品 | 欧美综合国产 | 国产成人一区二区三区电影 | 色橹橹欧美在线观看视频高清 | 久久久久国产精品视频 | 在线观看午夜av | av中文字幕不卡 | 玖玖在线视频观看 | 外国av网| 在线观看91 | 91一区在线观看 | 亚洲国产免费看 | 国产免费久久 | 日本丰满少妇免费一区 | 午夜免费视频网站 | 亚洲精选视频免费看 | 综合五月 | 精品99久久| 999久久| 久久免费99| 亚州精品在线视频 | 欧美成人在线网站 | 欧美小视频在线 | 精品久久久精品 | 欧美成人亚洲成人 | 一级精品视频在线观看宜春院 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 免费在线观看黄色网 | 91mv.cool在线观看 | 美女精品 | 91在线视频免费播放 | 久久国产精品二国产精品中国洋人 | 久久9视频| 精品久操 | 久久成人精品电影 | 日韩精品视频在线观看网址 | 奇米网8888| 在线成人一区 | 国产黄色在线网站 | 九九久久成人 | 天躁狠狠躁 | 日本精品在线视频 | 97影视| 精品一区二区三区久久久 | 免费无遮挡动漫网站 | 手机av在线网站 | 免费视频黄色 | 日韩一二区在线观看 | 91九色视频 | 黄色a级片在线观看 | 国产成人精品亚洲日本在线观看 | 黄色福利网站 | av千婊在线免费观看 | 国产精品99免视看9 国产精品毛片一区视频 | 久久99精品久久只有精品 | 国产精品麻豆91 | 欧美va天堂va视频va在线 | 久久久精品国产一区二区三区 | 亚洲视频免费 | 探花视频在线观看免费版 | 五月婷婷六月丁香 | 免费看的黄色片 | 日韩激情免费视频 | 97av免费视频| 免费a现在观看 | 最新国产中文字幕 | 亚洲天堂网站视频 | 久热av| 久久97超碰 | 超碰在线人人草 | 免费看一级特黄a大片 | av片中文字幕 | 日韩理论在线视频 | 久草久草在线 | 97在线观看视频 | 欧美日韩国产在线一区 | 亚洲a色 | 一区二区中文字幕在线 | 精品久久久久久久久久久久久久久久 | 91中文字幕永久在线 | 日韩av电影免费观看 | 一区二区中文字幕在线 | 黄a在线观看 | 国产精品久久久久久久99 | 深爱激情av | 在线观看视频国产一区 | 午夜91在线 | 久久久片 | 在线91视频 | 婷婷综合网 | 超碰在97| 在线观看视频色 | 日韩视频免费在线观看 | 999精品网| 国产中文视 | 四虎天堂 | 国产精品久久久一区二区三区网站 | 91亚洲在线| 99亚洲国产| 国产成人黄色在线 | v片在线看 | 国产成人精品网站 | 丁香六月综合网 | 超碰在线网 | 不卡的av电影在线观看 | 中文字幕一区二区三 | 天天玩天天干 | 九九视频精品在线 | 国产成人三级一区二区在线观看一 | 在线观看免费黄色 | 国产精品美女久久久久久久 | 国产综合福利在线 | 成人精品久久久 | 国产精品久久久久久电影 | 欧美日韩免费在线观看视频 | 国产精品视频大全 | av丁香 | 永久免费的av电影 | 日韩丝袜 | 丝袜美女视频网站 | 天天干天天做天天爱 | 狠狠精品 | 久热av| 免费观看一级一片 | 亚洲天天综合网 | 久久精品亚洲综合专区 | 成人国产在线 | 国产精品久久久久久吹潮天美传媒 | 一区二区三区四区影院 | 一区二区视频在线看 | 91av看片| 亚洲免费在线看 | www.五月天 | 亚洲成av人影片在线观看 | 一区二区三区在线观看免费 | 欧美日韩3p| 亚洲视频www | 成人国产网址 | 韩国av不卡 | 亚州视频在线 | 精品国自产在线观看 | www.香蕉视频在线观看 | 精品中文字幕在线 | 成人小视频在线观看免费 | 国产小视频在线观看 | 在线 视频 亚洲 | 国产伦精品一区二区三区在线 | 久久黄色美女 | www.黄色在线 | 久久99热精品 | 中文字幕免费久久 | 日韩久久精品一区二区三区下载 | 在线成人短视频 | 天天色天天射天天干 | 91精品久久久久久久久久入口 | 日韩三级免费观看 | 精品久久久久国产免费第一页 | 国内一级片在线观看 | 亚洲91精品| 亚洲精品在线资源 | av在线电影播放 | 国产色视频一区二区三区qq号 | 久久久九九 | 日本深夜福利视频 | 中文在线a√在线 | 五月天久久久久久 | 亚洲激情网站免费观看 | 国产福利网站 | 欧美大片第1页 | 成人久久久久久久久 | 91porny九色91啦中文 | 日韩草比 | 操综合| 免费日韩一区二区三区 | 黄污污网站 | 欧美一级视频免费看 | 欧美午夜精品久久久久久孕妇 | 在线日韩中文 | 一区二区三区四区五区在线视频 |