Collection
/*
到目前位置,我們學習過哪些可以儲存元素的容器:
1、陣列
優點:不同的陣列可以儲存不同資料型別的元素
缺點:長度不可變
2、StringBuffer|StringBuilder
優點:長度可以跟隨元素的數量而改變
缺點:裡面的元素只有一種字元資料型別
我們今後會根據元素的是否重複,儲存和取出的順序等來決定我們該使用什麼樣的容器來進行儲存
根據我現實生活中經驗來說,容器應該是豐富多彩的,多種多樣的
java應該要使用若干個不同的類來描述不同的容器,表示不同容器的特點。
容器應該都有若槓共同的特點,都可以裝東西等。
那麼java中提供的這些類中成員應該也會有相同的部分,那我們將其向上提取,由繼承或實現來構建關係
這樣我們就可以得到一個繼承體系。
Collection【介面】:
我們透過幫助文件發現,Collection是一個介面,不能直接new物件
根據元素是否可以發生重複,繼續分類
- List【介面】元素可以發生重複,且有索引的概念
ArrayList
- Set【介面】元素不可以發生重複,沒有索引
藉助ArrayList子類物件來使用Collection介面中的方法
學習java中任意一個集合的步驟:
1、建立相關集合物件
2、建立元素物件
3、將元素新增到集合中
4、遍歷集合
Collection中的成員方法:
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
//藉助ArrayList建立物件來使用Collection介面中的方法
// 1、建立相關集合物件
Collection c1 = new ArrayList();
//boolean add(Object e)
c1.add(100); //這裡涉及到自動裝箱 int -> Integer
c1.add(true);
c1.add(12.34);
c1.add(1000L);
c1.add(100);
c1.add(12.34);
// 重寫toString()方法的類是ArrayList類的父類的父類中重寫的。
// 底層是使用StringBuilder實現的
//boolean remove(Object o) 從集合中刪除一個元素,只會刪除最左邊的一個匹配元素
c1.remove(100);
System.out.println("c1: " + c1);
System.out.println("-----------------------------------------");
//void clear() 清空集合元素
// c1.clear();
// System.out.println("c1: " + c1);
System.out.println("-----------------------------------------");
//boolean contains(Object o) 判斷Collection集合中是否包含某個元素
System.out.println(c1.contains(12.34));
System.out.println("-----------------------------------------");
//boolean isEmpty() 判斷Collection集合是否為空
System.out.println(c1.isEmpty());
System.out.println("-----------------------------------------");
//int size() 獲取集合的長度【元素的個數】
System.out.println(c1.size());
boolean addAll(Collection c)//兩個集合合併 去重看具體的實現子類
boolean removeAll(Collection c)//刪除集合中含有另一個集合的元素
boolean containsAll(Collection c)//集合中是否包含另一個集合的所有元素
boolean retainAll(Collection c)// 求交集 將結果儲存在呼叫方法的物件集
/*
如何遍歷一個Collection集合
1、Object[] toArray() 把集合轉成陣列,可以實現集合的遍歷
*/
public class CollectionDemo3 {
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add("hello");
c1.add("world");
c1.add("java");
c1.add("hadoop");
c1.add("world");
Object[] objects = c1.toArray();
for(int i=0;i<objects.length;i++){
Object obj = objects[i]; // "hello"
String s = (String)obj;
//向下轉型,才可使用元素自己型別的方法
System.out.println(s+"-"+s.length());
}
迭代器
//每一個迭代器,都有一個獨立指標,每呼叫一次next()方法,就會向後移動一次指標取資料
//iterator.hasNext()用來判斷下一個位置上是否有元素
while (iterator.hasNext()){
Object obj = iterator.next();
String s = (String)obj;
System.out.println(s+"-"+s.length());
}
集合遍歷
// 4、遍歷集合
//方式1:轉陣列遍歷
// Object[] objects = c1.toArray();
// for(int i=0;i<objects.length;i++){
// Object obj = objects[i];
// Student s = (Student) obj;
// System.out.println(s.getName()+"-"+s.getAge());
// }
//方式2:迭代器遍歷
Iterator iterator = c1.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
Student s = (Student) obj;
System.out.println(s.getName()+"-"+s.getAge());
}
list集合
/*
List集合:元素可以發生重複,有序(指儲存和取出的順序一致)
Collection【介面】:
- List【介面】
ArrayList
- Set【介面】
List集合中特有的成員方法:
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)
ListIterator listIterator()
*/
public class ListDemo1 {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("hello");
list1.add("apple");
list1.add("banana");
list1.add("watermelon");
list1.add("mango");
System.out.println("list1: " + list1);
System.out.println("==================================");
//因為List相關集合具備索引的特點,List集合根據索引提供一些其它集合沒有的方法
//void add(int index,E element) 指定索引位置新增元素 grape
list1.add(2,"grape");
System.out.println("list1: " + list1);
System.out.println("==================================");
// E remove(int index) 根據索引從集合中移除元素
System.out.println(list1.remove(2));
System.out.println("list1: " + list1);
System.out.println("==================================");
//E get(int index) 根據索引獲取對應元素
System.out.println(list1.get(3));
System.out.println("list1: " + list1);
System.out.println("==================================");
//E set(int index,E element) 指定索引位置修改元素
System.out.println(list1.set(3, "orange"));
System.out.println("list1: " + list1);
System.out.println("==================================");
//ListIterator listIterator()
ListIterator listIterator = list1.listIterator();
//從前向後取
while (listIterator.hasNext()){
System.out.println(listIterator.next());
}
System.out.println("==================================");
//從後向前取
//注意:一個集合迭代器只有一個遊標,要想倒著遍歷,必須先正著遍歷一遍,所以該方法用的較少
while (listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
/*
需求:遍歷集合,當遇到mango的時候,向集合中新增一個元素"java"
我們發現如果使用迭代器遍歷,集合發生修改的話,報錯了
ConcurrentModificationException
*/
public class ListDemo2 {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("hello");
list1.add("apple");
list1.add("banana");
list1.add("watermelon");
list1.add("mango");
list1.add("peach");
list1.add("pear");
System.out.println("list1: " + list1);
System.out.println("======================================");
//1、轉陣列遍歷
// Object[] objects = list1.toArray();
// for(int i=0;i<objects.length;i++){
// Object obj = objects[i];
// String s = (String) obj;
// if("mango".equals(s)){
// list1.add("java");
// }
// }
// System.out.println("list1: "+list1);
// System.out.println("======================================");
//2、使用迭代器遍歷
// Iterator iterator = list1.iterator();
// while (iterator.hasNext()){
// Object obj = iterator.next();
// String s = (String) obj;
// if("mango".equals(s)){
// list1.add("java");
// }
// }
// System.out.println("list1: "+list1);
//使用List集合中特有的迭代器進行遍歷比較,且使用它進行新增元素
ListIterator listIterator = list1.listIterator();
while (listIterator.hasNext()) {
Object obj = listIterator.next();
String s = (String) obj;
if ("mango".equals(s)) {
listIterator.add("java");
}
}
System.out.println("list1: " + list1);
}
}