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
案例
// 簡書作者:達叔小生
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 ,用指定的元素取替代next 或previous 返回的最後一個元素 |
使用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 |
構造一個與指定有序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 點贊