Java集合
Collection:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是List和Set.
List接口的特點:元素有序,可重複。底層存放是數組的結構, 查詢快,增刪慢
Set接口的特點:元素無序,不可重複。
Map:雙列集合類的根接口,用於存儲具有鍵(Key),值(Value)映射關係的元素,每個元素都包含一對鍵值,在使用Map集合時可以通過指定的Key找到對應的Value,Map接口的主要實現類有HashMap和TreeMap
Collection接口
List接口:list接口繼承自Collection接口,List集合中允許出現重複的元素,所有元素是以一種線性方式進行存儲的,在程序中通過索引來訪問集合中的指定元素
ArrayList
方法:
a、增 list.add("aaa");
b、刪 list.clear();// 清空ArrayList集合中的所有的元素
list.remove(2);// 根據指定的索引,刪除指定的元素
list.remove("bbb");// 根據指定的元素,刪除
c、改 list.set(2, "ccc");// 根據索引去修改指定的元素
d、查 Objectobject = list.get(1);//單個查詢 ,如果想多個查詢可以用for循環,還可以用迭代
ArrayList中的其他方法
i、迭代器
|
iterator()
|
|
|
Iterator it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } |
ii、比較集合是否相同
boolean equals = list.equals(list1); |
細節:
如果在對list集合添加的時候,在用Iterator迭代器去迭代list集合中的元素的時候,不可以同時用list對象操作添加,否則出現如下異常
java.util.ConcurrentModificationException
解決辦法:
在用迭代器的時候選擇ListIterator迭代,應爲這個迭代器自帶添加的方法 add(object obj)
ListIterator是Iterator的子類,該類在父類的基礎上增加了一些特有的方法,如add(Object),hasPrevious(),previous()
LinkedList集合
該集合內部維護了一個維護了一個雙向鏈表,鏈表中的每一個元素都使用引用的方式來記住它的前一個元素和後一個元素,從而可以將所有的元素彼此連接起來,
當插入一個新元素時,只需要修改元素之間的這種引用關係即可,刪除一個節點也是如此。正因爲這樣的存儲結構,所以LinkList集合對於元素的增刪操作具有很高的效率
LinkedList集合特有的方法
add(int index,Eelement),addFirst(Object),addLast(Object),
getFirst(Object),getLast(Object),
removeFirst(),removeLast()
Iterator 接口
當迭代器獲取元素時,都會將這些元素當作Object類型來看待,如果想得到特定類型的元素,則需要進行強制類型裝換
ListIterator 接口
Foreach循環遍歷集合和數組時,只能訪問集合中的元素,不能對其中的元素進行修改。
Vector集合,該集合是List集合接口的一個實現類,用法與ArrayList完全相同,區別在於Vector集合是線程安全的,而ArrayList集合是線程不安全的。在Vector類中提供了一個elements()方法用於返回Enumeration對象,通過Enumeration對象就可以遍歷該集合中的元素。 返回此向量的組件的枚舉
Enumeration集合
set接口
set接口list接口一樣,同樣繼承自Collection接口,它與Collection接口的用法基本一致,並沒有對Collection接口進行擴充,只是比Collection接口更加嚴格了
Set接口中的元素 無序,不可重複
HashSet 是根據對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。
TreeSet 是以二叉樹的方式來存儲元素,它可以實現對集合中的元素進行排序
HashSet:當向HashSet集合中添加一個對象時,首先會調用該對象的hashCode()方法來確定元素的存儲位置,然後在調用對象的equals()方法來確保該位置沒有重複的元素。所以當向集合中存入元素時,爲了保證HashSet正常工作,要求在存入對象時,重寫該類中的hashCode()和equals()方法
Set集合與List集合存取元素的方式都一樣。。。
HashSet TreeSet 不可以用for循環的方式遍歷,因爲元素是無序的
TreeSet
TreeSet集合內部使用的是自平衡的排序二叉樹,它的特點是存儲的元素會按照大小排序,並能去除重複元素。
集合中的元素在進行比較時,都會調用compareTo()方法,該方法是Comparable接口中定義的,因此要想對集合中的元素進行排序,就必須實現Comparable接口。JDK中大部分的類都實現Comparable接口,擁有了接口中的CompareTo()方法,如Integer,String等。
所以自己的類有兩種方法來讓自己的對象可以參與比較:
一種:實現Comparable接口,重寫CompareTo()方法
另一種:實現Comparator接口,重寫comparator()方法
Map
A、HashMap
底層數據結構都是hash值,hashMap中的鍵和值是可以爲null的,線程是不同步的,hashMap的擴展性能比HashTable更好
所以今後開發中推薦使用HashMap
1、增
put() 增加一個對象 map.get(“key”)獲取指定key值對應的value值
2、刪
Remove()
3、改
先查詢,在重寫賦值
4、查
兩種方式
keySet
entrySet
5、values()方法得到所有的值的Collection集合
6、LinkedHashMap類可以讓迭代出的元素的順序和取出的順序一致,它是HashMap 的子類
B、HashTable 和HashMap十分相似
底層數據結構都是hash值
hashTable中的鍵和值不可以爲null
線程是同步的,線程安全的,基本被HashMap類取代,有一個子類Properties非常重要
C、TreeMap 存放鍵值映射關係
底層數據結構是二叉樹,通過二叉樹的原理來保證鍵的唯一性,這與TreeSet集合存儲的原理一樣,因此TreeMap中的鍵是按照某種順序排列的
可以對元素排序。默認是對key進行排序(系統自帶的對象),如String類型,這是因爲String實現了Comparable接口。按照自然書序排序
如果要添加自定義對象,用自己定義的排序方式,需要自己封裝一個排序的方法。 如
package InetAddress;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class example {
public static void main(String[] args) {
TreeMap map = new TreeMap(new MyComparator());//傳入一個比較器
map.put("1", "Jack");
map.put("2", "Rose");
map.put("3", "Locy");
Set keySet = map.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
}
}
class MyComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
String obj1 = (String) o1;
String obj2 = (String) o2;
return obj2.compareTo(obj1);
}
}
D、Properties HashTable的子類,主要用來存取字符串類型的鍵和值,在實際開發中,經常使用Properties集合來存取應用的配置項。
package InetAddress;
import java.util.Enumeration;
import java.util.Properties;
public class example2 {
public static void main(String[] args) {
Properties p = new Properties();
p.setProperty("background-color", "red");
p.setProperty("Font-size", "14px");
p.setProperty("Languge", "chinese");
Enumeration names = p.propertyNames();//獲取Enumeration對象的所有鍵的枚舉
while(names.hasMoreElements()){
String key = (String) names.nextElement();
String value = p.getProperty(key);
System.out.println(key+" = "+value);
}
}
}
泛型
Collections工具類
Arrays工具類