集合的學習,需要知道怎么使用集合,往里面存儲數據,會遍歷集合,把數據取出來,最后需要掌握各種集合的特點。集合和數組有什么區別呢?兩者都可以存儲數據,其中數組中可以存儲基本數據類型也可以存儲對象,但集合只能存儲對象,所有的集合,都是繼承自Collection接口,其為所有集合的頂層接口。
Collection接口
Collection接口,定義所有單例集合共性的方法,下面有兩個子接口,一個是List接口,一個是Set接口。
List接口
List接口,其下面主要實現類有Vector集合,ArrayList集合,LinkedList集合,底層實現方式有數組,也有鏈表,它有如下特點:
(1)有序的集合,即存儲和取出元素的順序相同
(2)允許存儲重復的元素
(3)有索引,可以使用普通的for循環遍歷
Set接口
Set接口,其下面主要的實現類有TreeSet集合,HashSet集合,還有LinkedHashSet集合,前兩者是無序的集合,最后一個是有序的集合,它有如下特點:
(1)不允許存儲重復的元素
(2)沒有索引,不能使用普通的for循環遍歷
Collection接口中常用方法
collection集合中共性的方法,可以在java.util.Collection中查看,一共有如下7個,針對不同的實現類,都可以使用這7個方法。
1 public boolean add(E e):添加一個元素
2 public void clear():清空集合中所有的元素
3 public boolean remove(E e):移除集合中指定的元素
4 public boolean contains(E e):檢查集合中是否包含指定的對象
5 public boolean isEmpty():判斷集合是否為空
6 public void size():判斷集合中元素的個數
7 public Object[] toArray():把集合元素存儲到數組中
1 package CollectionTest; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 6 /** 7 * collection集合中共性的方法,可以在java.util.Collection中查看,一共有如下7個 8 * 1 public boolean add(E e):添加一個元素 9 * 2 public void clear():清空集合中所有的元素 10 * 3 public boolean remove(E e):移除集合中指定的元素 11 * 4 public boolean contains(E e):檢查集合中是否包含指定的對象 12 * 5 public boolean isEmpty():判斷集合是否為空 13 * 6 public void size():判斷集合中元素的個數 14 * 7 public Object[] toArray():把集合元素存儲到數組中 15 */ 16 public class CollectionMethod { 17 18 public static void main(String[] args) { 19 //定義一個集合,使用父類的接口指向子類的對象 20 Collection<String> col = new ArrayList<String>();//使用ArrayList實現類,初始化的容量為10 21 System.out.println(col);// [] 說明ArrayList重寫了toString方法 22 23 /** 24 * public boolean add(E e):添加一個元素 25 */ 26 boolean r1 = col.add("Messi"); 27 System.out.println(r1); //true 28 System.out.println(col); //[Messi] 29 30 //多添加幾個 31 col.add("Ronald"); 32 col.add("Herry"); 33 col.add("beckham"); 34 System.out.println(col);//[Messi, Ronald, Herry, beckham] 35 36 /** 37 * public boolean remove(E e):移除集合中指定的元素 38 */ 39 //移除beckham 40 boolean r2 = col.remove("beckham"); 41 System.out.println(r2); //true 42 System.out.println(col); //[Messi, Ronald, Herry] 43 44 /** 45 * public boolean contains(E e):檢查集合中是否包含指定的對象 46 */ 47 48 //檢查集合中是否包含messi 49 boolean r3 = col.contains("Messi"); 50 System.out.println(r3); //true 51 System.out.println(col); //[Messi, Ronald, Herry] 52 53 /** 54 * public boolean isEmpty():判斷集合是否為空 55 */ 56 //如果為空則為true,否則為false 57 boolean r4 = col.isEmpty(); 58 System.out.println(r4); //false 59 60 /** 61 * public void size():判斷集合中元素的個數 62 */ 63 64 int count=col.size(); 65 System.out.println(count); //3 66 67 /** 68 * public Object[] toArray():把集合元素存儲到數組 69 */ 70 Object[] arr=col.toArray(); 71 for (int i = 0; i < arr.length; i++) { 72 System.out.println(arr[i]); 73 } 74 75 /** 76 * public void clear():清空集合中所有的元素 77 */ 78 col.clear();//使用后清空所有集合對象 79 System.out.println(col); 80 81 } 82 }
控制台輸出情況:
迭代器Iterator使用
迭代器iterator的使用,來自java.util.iterator,作用是為了各式各樣的集合,開發了一個統一的取出集合元素的接口,其主要有兩種常用使用方法
1 boolean hasNext():如果集合中還有下一個元素,就返回true,否則返回false
2 E next():取出集合中的下一個元素
使用迭代器需要使用Collection接口的iterator()方法,其返回的就是一個迭代器iterator實現類對象,有了實現類對象才能使用里面的方法
使用迭代器的基本步驟:
1 先使用Collection集合的iterator()方法獲取iterator實現類對象,並使用一個iterator接口來接收,接口指向對象,為多態的應用
2 使用迭代器的hasNext()方法判斷集合中還有沒有下一個元素
3 使用迭代器的next()方法取出集合中下一個元素
1 package CollectionTest; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Iterator; 6 7 /** 8 * 迭代器iterator的使用,來自java.util.iterator,作用是為了各式各樣的集合,開發了一個統一的取出集合元素的接口,其主要有兩種常用使用方法 9 * 1 boolean hasNext():如果集合中還有下一個元素,就返回true,否則返回false 10 * 2 E next():取出集合中的下一個元素 11 * 使用迭代器需要使用Collection接口的iterator()方法,其返回的就是一個迭代器iterator實現類對象,有了實現類對象才能使用里面的方法 12 * 使用迭代器的基本步驟: 13 * 1 先使用Collection集合的iterator()方法獲取iterator實現類對象,並使用一個iterator接口來接收,接口指向對象,多態的應用 14 * 2 使用迭代器的hasNext()方法判斷集合中還有沒有下一個元素 15 * 3 使用迭代器的next()方法取出集合中下一個元素 16 */ 17 public class IteratorTest { 18 19 public static void main(String[] args) { 20 //初始化集合,存入集合元素 21 Collection<String> col = new ArrayList<String>(); 22 col.add("Messi"); 23 col.add("Ronald"); 24 col.add("Herry"); 25 col.add("Beckham"); 26 col.add("clyang"); 27 System.out.println(col); 28 29 //獲取迭代器,迭代器泛型就是集合的泛型 30 Iterator<String> it = col.iterator();//返回集合元素順序隨機 31 32 //使用步驟,得到一個集合對象 33 boolean r = it.hasNext(); 34 String str = it.next(); 35 System.out.println(r); //true 36 System.out.println(str); //Messi 37 38 //可以使用循環遍歷獲取迭代器中每一個對象 39 while (it.hasNext()) { 40 System.out.println(it.next()); 41 } 42 43 //遍歷完后,再次從迭代器取元素 44 boolean r1 = it.hasNext(); 45 System.out.println(r1); //false 46 /*String str1 = it.next(); //拋出異常,NoSuchElementException 47 System.out.println(str1);*/ 48 49 System.out.println("---使用for循環遍歷迭代器中元素---"); 50 51 //使用for循環遍歷迭代器 52 for (Iterator<String> it1 = col.iterator(); it1.hasNext(); ) { 53 System.out.println(it1.next()); 54 } 55 56 /** 57 * 使用迭代器的原理,看自己博客記錄 58 * 1 使用集合iterator()方法獲取迭代器對象后,會將地址指向ArrayList底層數組的-1索引位置 59 * 2 hasNext方法會檢查數組索引位置是否有元素 60 * 3 如果索引位置有元素,next方法會取出元素,並將地址往后面移動一位 61 */ 62 63 } 64 }
其中上面例子使用的集合為ArrayList,其底層采用數組實現,獲取迭代器后會直接將地址指向數組前面一位索引為-1,如果是其他的數組實現,如LinkedList,其底層是通過鏈表來實現,鏈表儲存的是一個個數據+地址的集合,通過上一個地址指向下一個地址,那獲取迭代器后地址指向哪里?指向第一個數據之前的位置,參考博客。
控制台輸出情況:
增強型for循環使用
增強型for循環的使用,Collection接口繼承父接口Iterable,這個父接口的作用就是允許對象成為for-each循環的目標,增強型for循環的目的主要是遍歷集合或數組元素。
使用格式:
for(集合或數組數據類型 變量名:集合或數組名){
方法體
}
1 package CollectionTest; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 6 /** 7 * 增強型for循環的使用,Collection接口繼承父接口Iterable,這個父接口的作用就是允許對象成為for-each循環的目標 8 * 增強型for循環的目的主要是遍歷集合或數組元素 9 * 格式: 10 * for(集合或數組數據類型 變量名:集合或數組名){ 11 * 方法體 12 * } 13 */ 14 public class ForEachTest { 15 16 public static void main(String[] args) { 17 //使用增強型for循環遍歷數組 18 loopArray(); 19 //使用增強型for循環遍歷集合 20 loopCollection(); 21 } 22 23 public static void loopArray(){ 24 int[] arr=new int[]{1,3,5,7,9}; 25 for(int i:arr){ 26 System.out.println(i); 27 } 28 } 29 30 public static void loopCollection(){ 31 Collection<String> col=new ArrayList<String>(); 32 col.add("you"); 33 col.add("can"); 34 col.add("marry?"); 35 col.add("maybe 40 years old"); 36 for(String str:col){ 37 System.out.println(str); 38 } 39 } 40 }
控制台輸出情況:
以上為集合Collection相關知識點,記錄一下以備后面使用。
參考博客: