第49節:Java集合框架中底層文檔的List與Set

来源:https://www.cnblogs.com/dashucoding/archive/2018/09/25/9697643.html
-Advertisement-
Play Games

Java集合框架中的List與Set 為列表,中在列表中的對象是由順序的排序的,並且是有重覆的對象。 簡單為:有序,有重覆。 為集合,在集合中的對象是不按照順序排列的,並且是沒有重覆的對象的。 簡單為:無序,無重覆。 為無序集合,無序無重覆; 為有序集合,有序有重覆; 案例 知識點 返回迭代的下一個 ...


標題圖

Java集合框架中的List與Set

// 簡書作者:達叔小生
Collection
 -> Set 無序不重覆 -> 無序HashSet,需要排序TreeSet
 -> List 有序可重覆 -> 查,改ArrayList,增刪LinkedList

List為列表,中在列表中的對象是由順序的排序的,並且是有重覆的對象。
簡單為:有序,有重覆。

Set為集合,在集合中的對象是不按照順序排列的,並且是沒有重覆的對象的。
簡單為:無序,無重覆。

Set為無序集合,無序無重覆;
List為有序集合,有序有重覆;

// 簡書作者:達叔小生
Collection
 -> Set
  -> HashSet
  -> LinkedHashSet
  -> TreeSet

 -> List
  -> ArrayList
  -> Vector
  -> LinkedList

Collection介面

案例

// 簡書作者:達叔小生
import java.util.List;
import java.util.ArrayList;

public class Demo{
 public static void main(String args[]){
 // 創建列表的實現類對象
  ArrayList<String> arrayList = new ArrayList<String>();
 // 添加數據
 arrayList.add("a");
 arrayList.add("b");
 arrayList.add("c");
// 移除
 arrayList.remove(1);
 // 獲取數據
 String s = arrayList.get(1);
 System.out.println(s);
 // 獲取長度
 int a = arrayList.size();
 // 列印所有元素
 for(int i=0; i<arrayList.size(); i++){
  String s = arrayList.get(i);
  System.out.println(s);
 }
 }
}
// 簡書作者:達叔小生
public class ListDemo{
 public static void main(String[] args){
  // List
  List list = new ArrayList();
 // 添加元素
 list.add( new Student("a",12) );
 list.add( new Student("b",13) );
 list.add( new Student("c",14) );
 // 插入元素
 // list.add( 1, new Student("d",15) );
 // list.remove(44); 
 // 角標越界IndexOutOfBoundsException)
 // list.set( 2, new Student("dashucoding", 16) );
 // 迴圈出對象
 for(Iterator it = List.iterator(); it.hasNext(); ){
  Student stu = (Student) it.next();
  System.out.println(stu);
 }
 // 獲取對象
 Object obj = list.get(1);
 System.out.println(obj);
 // 獲取對象
 for(int i = 0; i<list.size(); i++){
  System.out.println(list.get(i));
 }
}
// 簡書作者:達叔小生
import java.util.Set;
import java.util.HashSet;
public class Demo{
 public static void main(String args[]){
  HashSet<String> hashSet = new HashSet<String>();
 Set<String> set = hashSet;
 // 實現類向上轉型為介面
 // 同理 Set<String> set = new HashSet<String>();
 // 添加元素
 set.add("a"); 
 set.add("b");
 set.add("c");
 set.add("d");
 // 獲取集合中的元素長度
 int a = set.size();
 }
}
// 簡書作者:達叔小生
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class Demo{
 public static void main(String args[]){
  HashSet<String> hashSet = new HashSet<String>();
 Set<String> set = hashSet;
 // 實現類向上轉型為介面
 // 同理 Set<String> set = new HashSet<String>();
 // 添加元素
 set.add("a"); 
 set.add("b");
 set.add("c");
 set.add("d");
 // 迭代器 iterator() 遍歷整個set
// 通過迭代器取出集合中的對象
 Iterator<String> it = set.iterator<String>();
 while(it.hasNext){
  String s = it.next();
  System.out.println(s);
 }
 }
}
// 簡書作者:達叔小生
public class ListIteratorDemo{
 // 創建List對象
 List list = new ArrayList();
 // 添加元素
 List.add("a");
 List.add("b");
 List.add("c");
 // 獲取元素,iterator()方法進行迭代
 Iterator it = list.iterator();
// 獲取元素
 while(it.hasNext()){
  System.out.println(it.next());
 }
}

知識點

next()返回迭代的下一個元素,如果拋出異常為:NoSuchElementException,為沒有元素可以迭代。

迭代器

在迭代過程中,使用了集合的方法對元素進行操作,導致迭代器不知道集合中的變化,容易產生數據的不確定性,所以不要使用集合的方法進行操作元素,可以使用迭代器的方法進行操作。

迭代器的方法:

// 簡書作者:達叔小生
hasNext()
next()
remove()

迭代器 java.util 介面 Iterator<E>
知道的介面:ListIterator<E>,XMLEventReader
知道的實現類:BeanContextSupport.BCSIterator,EventReaderDelegate,Scanner。

// 簡書作者:達叔小生
public interface Iterator<E>

迭代器的三個方法:

方法 說明
hasNext() 返回的是boolean類型,如果集合中還有元素存在,就可以進行迭代,然後返回true,代表為還有元素存在,反之,返回的是false
next() 返回的是E,返回的是迭代出來的下一個元素
remove() 返回的類型為void,從迭代器中移除迭代器中的最後一個元素

列表迭代器

介面 Iterator<E>下的子介面有個:
ListIterator<E> 為列表迭代器

// 簡書作者:達叔小生
java.util
介面ListIterator<E>
超級介面:Iterator<E>
// 簡書作者:達叔小生
public interface ListIterator<E> extends Iterator<E>
// 簡書作者:達叔小生
while(it.hasNext()){
 Object obj = it.next();
 if("a".equals(obj)){
  list.add("aaaaa");
 }
}

列表迭代器的特性可以在迭代期間進行修改列表,然後獲取迭代器在列表中的當前位置。

方法 說明
add(E e) 方法返回的是void類型,可以將指定的元素進行插入到列表中
hasNext() 方法返回的是boolean類型,該方法表示如果next返回一個元素後,不是拋出異常,則代表有下一個元素,則返回ture,否則返回false
hasPrevious() 返回的是boolean類型,該方法的作用是如果逆向遍歷列表,列表迭代器中有多個元素,則返回為true,即簡單說就是有沒有前一個
next() 返回的是E,該方法表示返回列表中的下一個元素
nextIndex() 返回的是Int類型,該方法對next的後續調用所返回元素的索引
previous() 返回的是列表中的前一個元素,取出前一個
previousIndex() 返回的類型為int類型,返回對previous的後續調用所返回元素的索引
remove() 返回的類型為void,從列表中移除一個元素
set(E e) 返回的類型為Void,用指定的元素取替代nextprevious 返回的最後一個元素

使用ListIterator

// 簡書作者:達叔小生
 // 創建List對象
 List list = new ArrayList();
 // 添加元素
 List.add("a");
 List.add("b");
 List.add("c");
// 列表迭代器
ListIterator it = list.listIterator();
while(it.hasNext()){
 Object obj = it.next();
 if("a".equals(obj)){
  // 添加 it.add("dashucoding");
  // 刪除 it.set("dashucoding");
 }
}

迭代器的List介面的子介面ListIterator,可以實現增刪改查

List

介面List<E>,知道的實現類:

List是有序的,帶索引的,元素可以重覆
List可以增刪改查,增加add(),刪除remove(),修改set(),查詢get()

// 簡書作者:達叔小生
實現類:
AbstractList , ArrayList , LinkedList , Vector
AbstractSequentialList , AttributeList , CopyOnWriteArrayList , RoleList , RoleUnresolvedList , Stack

ArrayList (數組結構,不同步的,為了提高效率), LinkedList(鏈接列表結構,就像鏈子一樣,不同步的) , Vector(可以實現可增長的對象數組,可變化,同步的)

ArrayList

// 簡書作者:達叔小生
ArrayList為數組結構,長度可以改變
java.util
類 ArrayList<E>
java.lang.Object
 -> java.util.AbstractCollection<E>
  -> java.util.AbstractList<E>
   -> java.util.ArrayList<E>

知道的實現介面:
Serializable,Cloneable,Iterable<E>,Collection<E>,List<E>,RandomAccess
知道的子類:
AttributeList, RoleList, RoleUnresolvedList

// 簡書作者:達叔小生
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

LinkedList 可以用於實現堆棧,隊列(棧記憶體先進後出,隊列先進先出)

// 簡書作者:達叔小生
java.util
類 LinkedList<E>
java.lang.Object
 -> java.util.AbstractCollection<E>
  -> java.util.AbstractList<E>
   -> java.util.AbstractSequentialList<E>
    -> java.util.LinkedList<E>

public class LinkedList<E>
extends AbstractSequentiaList<E>
implements List<E>, Deque<E>, Cloneable, Serializable

知道的介面:Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>

LinkedList 隊列

// 簡書作者:達叔小生
public class LinkedListDemo{
 public static void main(String[] args){
  // 創建一個隊列對象
  Queue queue = new Queue();
  // 隊列添加元素
  queue.add("a");
  queue.add("b");
  queue.add("c");
  while(!queue.isNull){
   System.out.println(queue.myGet());
  }
 }
}

隊列

class Queue{
 // 封裝了一個鏈表的數據結構
 private LinkedList link;
 Queue(){
  link = new LinkedList();
 }
 // 功能
 public void add(Object obj){
  // 內部,使用鏈表方法
  link.addFirst(obj);
 }
  // 先進先出
 public Object myGet(){
  return link.removeList();
 }
 // 判斷隊列中的元素是否為空
 public boolean isNull(){
  return link.isEmpty();
 }
}

堆棧,手槍彈夾,隊列,排隊買票

// 去除重覆元素
public static void getSingleElement(List list){
 // 臨時容器
 List temp = new ArrayList();
 // 原容器
 for(Iterator it = list.iterator(); it.hasNext(); ){
  // 遍歷原對象元素
  Object obj = it.next();
   if(temp.contains(obj)){
    // 判斷是否存在
    temp.add(obj);
   }
 }
 list.clear();
 list.addAll(temp);
}
// 簡書作者:達叔小生
public class ArrayListDemo{
 public static void main(String[] args){
  List list = new ArrayList();
  list.add("a");
  list.add("b");
  list.add("c");
  System.out.println(list);
 }
}
// 簡書作者:達叔小生
public boolean equals(Object obj){
 if(this == obj){
 return true;
 }
 if(!(obj instanceof Student)){
  throw new ClassCastException();
 }
 Student stu = (Student) obj;
 return this.name.equals(stu.name) && this.age == stu.age;
}
// 簡書作者:達叔小生
public boolean contains(Object o){
 return indexOf(o) >= 0;
}
// 簡書作者:達叔小生
public int indexOf(Object o){
 if(o == null){
  for(int i = 0; i<size; i++){
   if(elementData[i] == null){
    return i;
   }
  }
 }else{
  for( int i = 0; i<size; i++){
   if(o.equals(elementData[i])){
    return i;
   }
  }
 }
 return -1;
}
// 簡書作者:達叔小生
List 
 -> Vector
 -> ArrayList
 -> LinkedList

介面集合框架-Set介面

API-set

java.util
介面 Set<E>
參數E:此set所維護元素的類型
超級介面
Collection<E>,Iterable<E>
知道的子介面
NavigableSet<E>,SortedSet<E>
知道實現類
AbstractSet,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,
JobStateReasons,LinkedHashSet,TreeSet

HashSet查詢效率很高,它的子類(兒子)LinkedHashSet,可以迭代順序的set介面的哈希表和鏈接列表的實現。

public class LinkedHashSetDemo{
 public static void main(String[] args){
  Set  set = new LinkedHashSet();
  set.add("a");
  set.add("b");
  set.add("c");
  for(Iterator it = set.iterator(); it.hesNext();){
   System.out.println(it.next());
  }
 }
}
public interface Set<E>
extends Collection<E>

Set為一個不包含重覆的集合,

Set的一些方法:

方法 說明
add(E e) 返回類型為boolean,該方法用來添加元素
addAll(Collection<? extends g> c) 返回的是boolean類型,該方法是用來添加所有元素到set中的
clear() 返回void類型,是用來移除set中的所有元素
contains(Object o) 返回boolean類型,該方法是指定set中是否包含該元素,如果有則返回true,否則就為false
containsAll(Collection<?> c) 返回boolean類型,如果在set中有包含所有指定的collection元素,就返回true,否則返回false
equals(Object o) 返回類型為boolean,用來比較指定對象與此set的相等性
hashCode() 返回的類型為Int,返回set的哈希碼值
isEmpty() 返回的是int類型,返回set不包含元素,則返回true
iterator() 返回的是Iterator<E>類型,返回在此set中的元素上進行迭代的迭代器。
remove(Object o) 返回boolean類型,如果set中存在指定的元素,就將其移除
removeAll(Collection<?> c) 返回boolean類型,移除set中那些包含在指定collection中的元素
retainAll(Collection<?> c) 返回boolean類型,僅保留set中那些包含在指定collection中的元素
size() 返回Int類型,返回set中的元素數
toArray() 返回一個包含set中所有元素的數組
toArray([] a) 返回一個包含set中所有元素的數組,返回數組的運行時類型是指定數組的類型。
public class SetDemo{
 public static void main(String[] args){
  Set set = new HashSet();
  set.add("a");
  set.add("b");
  set.add("c");
  // set.add(new Student("a",12));
  // set.add(new Student("b",13));
  // set.add(new Student("c",14));

  for(Iterator it = set.iterator(); it.hasNext(); ){
   Object object = (Object) it.next();
   System.out.println(it.next();
  }
 }
}
Set 
 -> HashSet
 -> TreeSet

HashSet<E>

java.lang.Object
 -> java.util.AbstractCollection<E>
  -> java.util.AbstractSet<E>
   -> java.util.HashSet<E>
類HashSet<E>
知道已實現的介面:
Serializable,Cloneable,Iterable<E>,Collection<E>,Set<E>
知道的子類:
JobStateReasons,LinkedHashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>,Cloneable,Serializable

HashSet該類實現了Set的介面,數組中存儲的是元素,哈希值對應關係,所以叫哈希表或叫散列,查詢速度快。有重覆元素,用不了哈希表,即不可以包含重覆的元素,不保證順序,方法有hasCode()equals()方法。

方法 說明
hashCode() 返回的是Ine類型,返回該對象的哈希值
// 簡書作者:達叔小生
public int hashCode(){
 return 1;
}

public boolean equals(Object obj){
 if(this == obj)
  return true;
 if(obj == null)
  return false;
 if(getClass() != obj.getClass())
  return false;
 if(age != other.age)
  return false;
 if(name == null){
  if(other.name != null)
   return false;
 }else if(!name.equals(other.name))
  return false;
 return true;
 }
}

TreeSet<E>,可以進行排序set集合中的元素,比較結果為0,視為相同元素不存。

案例

// 簡書作者:達叔小生
public class TreeSetDemo{
 public static void main(String[] args){
  Set set = new TreeSet(new ComparatorLength() );
  set.add("a");
  set.add("b");
  set.add("c");
  for(Iterator it = set.iterator();it.hasNext(); ){
   System.out.println(it.next());
  }
 }
}
// 簡書作者:達叔小生
public class ComparatorLength implements Comparator{
 public int compare(Object o1,Object o2){
  // 比較字元串,強轉
  String s1=(String)o1;
  String s2=(String)o2;
  int temp = s1.length() - s2.length();
  return temp == 0? s1.compareTo(s2) : temp;
 }
}
// 簡書作者:達叔小生
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>,Cloneable,Serialirable
// 簡書作者:達叔小生
java.lang
介面 Comparable<T>
參數為可以與對象進行比較
// 定義一個類實現Comparator
public class ComparatorName implements Comparator{
 public int compare(Object o1,Object o2){
  Student s1 = (Student)o1;
  Student s2 = (Student)o2;
  int temp = s1.getName().compareTo(s2.getName());
  return temp==0? s1.getAge()-s2.getAge() : temp;
 }
}

已知的那些子介面:
Delayed,Name,RunnableScheduledFuture<V>,ScheduleFuture<V>

方法:實現comparable介面,可以排序的功能

方法 說明
compreTo(T o) 返回類型為Int,是用來比較對象與指定對象的順序
// 簡書作者:達叔小生
public int compareTo(Object o){
 if(!(o instanceof Student)){
  throw new ClassCastException();
 }
 Student stu = (Student) o;
 if(this.age>stu.age)
  return 1;
 if(this.age<stu.age)
  return -1;
return 0;
}
// 簡書作者:達叔小生
public class TreeSetDemo{
 public static void main(String[] args){
  // Set set = new TreeSet();
  TreeSet set = new TreeSet();
  set.add("a");
  set.add("b");
  set.add("c");
  for(Iterator it = set.iterator(); it.hasNext(); ){
   System.out.println(it.next());
  }
 }
}
// 源碼
public boolean add(E e){
 return m.put(e, PRESENT)==null;
}

構造方法:

方法 說明
TreeSet() 無參構造方法,該set根據其元素的自然順序進行排序
TreeSet(Collection<? extend E> e) 構造一個包含指定collection元素的新TreeSet,它按照其元素的自然順序進行排序
TreeSet(Comparator<? super E> comparator) 構造一個新的空TreeSet,它根據指定比較器進行順序
TreeSet(SortedSet s) 構造一個與指定有序set具有相同映射關係和相同排序的新TreeSet

二叉樹結構

二叉樹結構把小的放在左邊,大的放在右邊。

二叉樹結構

for each 迴圈

// 簡書作者:達叔小生
public class ForeachDemo{
 public static void main(String[] args){
  List list = new ArrayList();
  list.add("1");
  list.add("2");
  list.add("3");
  for(Object str : list){
   System.out.println(obj);
  }
 }
}

枚舉,一枚一枚的舉出了來

方法 說明
hasMoreElements() 返回的是booleam類型,測試枚舉是否包含更多的元素
nextElement() 如果該枚舉對象至少還有一個可提供的元素,就返回此枚舉,取出下一個元素
// 簡書作者:達叔小生
public class EnumerationDemo{
 public static void main(String[] args)}
  Vector v = new Vector(); 
  v.addElement("a"); 
  v.addElement("b");
  v.addElement("c");
  for(Enumeration e = v.elements(); e.hasMoreElements();){
   System.out.println(e.nextElement());
  }
  // 不考慮,先考慮Iterator
  for(Object obj : v){
   System.out.println(obj);
  }
 }
}

集合:
List -> ArrayList(數組,查詢快),LinkedList(鏈表,增刪快)
Set -> HashSet(哈希表,查詢快,表對應唯一)
TreeSet(二叉樹,就知道排序的,有規則)

往後餘生,唯獨有你
簡書作者:達叔小生
90後帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: https://www.jianshu.com/u/c785ece603d1

結語

  • 下麵我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
  • 小禮物走一走 or 點贊

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • java當中throws子句在繼承當中overrride時有什麼規則? ...
  • 以下兩個例子說明synchronized塊的用法: (視頻下載) (全部書籍)例1.9.4_a-本章源碼class A { public void disp() { System.out.println("新線程馬克-to-win啟動:"); for (int i = 0; i < 10; i++) ...
  • 標準庫 map set 刪除 刪除操作 有map如下: 刪除方法: | 刪除操作種類 | 功能描述 | | | | | cnt.erase(3); | 刪除key為3的元素,並返回刪除的元素的個數 | | cnt.erase(p); | p為迭代器,刪除p指向的元素,並返回p之後元素的迭代器 | | ...
  • Java的基礎性數據類型並不算多,基本類型的包裝類以及String BigInteger BigDecimal等,這是平時經常用到的,雖然天天使用,就是因為太基礎所以很少有人系統認真的對這些數據類型進行分析,本文著重從整體的邏輯思路對這些基礎性的類型進行了介紹. ...
  • 下載:https://pan.baidu.com/s/1IakOOvmfltodm6w_taDcQg ...
  • 一.概述 Java不同於C/C++這類傳統的編譯型語言,也不同於php這一類動態的腳本語言。可以說Java是一種半編譯語言,我們所寫的類會先被編譯成.class文件,這個.class是一串二進位的位元組流。然後當要使用這個類的時候,就會將這個類對應的.class文件載入進記憶體中。而將這個.class的 ...
  • 一、contextMap中的數據操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value name test session Map request Map attr Map 1、存數據: ...
  • 在上一篇《你真的懂ReentrantReadWriteLock嗎?》中我給大家留了一個引子,一個更高效同時可以避免寫饑餓的讀寫鎖 StampedLock。StampedLock實現了不僅多個讀不互相阻塞,同時在讀操作時不會阻塞寫操作。 為什麼StampedLock這麼神奇?能夠達到這種效果,它的核心 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...