1. 程式人生 > >Java集合框架中底層文件的List與Set

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 點贊