集合類
Java集合類詳解
概述
集合類就是一個動態對象數組
與之相關的接口包括
- Collection
- List
- ArrayList
- Vector
- LinkedList
- Set
- HashSet
- LinkedHashSet (按照插入順序存放的,不重復的)
- SortedSet
- TreeSet
- HashSet
- Queue
- LinkedList
- List
- Map
- hashMap
- weakhashMap
- SortedMap
- TreeMap
- Map.Entry
- Iterator
- ListIterator
- Enumeration 最早的輸出的接口
Collection接口
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator<Integer> iterator() {
return null;
}
@Override
public Object[] toArray() {
return new Object[0];
}
@Override
public <T> T[] toArray(T[] a) {
return null;
}
@Override
public boolean containsAll(Collection<?> c) {
return false;
}
@Override
public boolean addAll(Collection<? extends Integer> c) {
return false;
}
@Override
public boolean removeAll(Collection<?> c) {
return false;
}
@Override
public boolean retainAll(Collection<?> c) {
return false;
}
@Override
public void clear() {
}
注意 al.retainAll(al1); 相當於求交集然后放在al中 Integer []array1=al.toArray(new Integer[]{});
Object []array2=al.toArray(); 兩個獲得Array的方法,第一個是通過泛型指定了數組的類型,第二個返回的是Object[]數組,使用的時候需要轉型
List接口
可以重復 ,可以認為是一個數組,可以通過索引取出數據
List對於Collection有很大的擴充 新增包括
- 指定位置增加數據
- 指定位置增加一組數據
- 取得指定位置數據
- 在指定位置刪除數據
- subList(from,to)返回子List
- al1=al.subList(0,1); 等
數據的順序與插入順序一樣
LinkedList類
同時實現了List和Queue接口,就是一個鏈表的封裝
LinkedList<String> ll=new LinkedList<String>();
ll.add("eq");
ll.add("eq1");
ll.add("eq2");
ll.add("eq3");
ll.addFirst("23");
ll.addLast("233");
System.out.println(ll);
Queue接口
element找到頭 offer在隊列尾加元素
peek找到頭
poll找到頭並刪除
remove刪除頭
Set
其中的方法與Collection的完全一樣
- 順序與插入的順序無關
- 不重復的,如果重復插入會忽略
TreeSet
- 數據是排序的!!,實際上也是SortedSet的一個子類
HashSet
- 數據散列存放
TreeSet自動排序原理
要排序必須可比較,因此TreeSet指定的類必須實現了Comparable方法
判斷重復元素的原理
使用equals和hashCode方法來判斷 首先判斷hashCoede是否一樣,不相同則為不同元素,相同則調用equals()來最終決定,因此將元素加入Set的的時候最好復寫這兩個方法
- 對象相等->hashcode一定相等
- hashCode相等->對象不一定相等
SortedSet接口
是自動排序的 方法
- 返回首尾元素
- 返回任意一段子SortedSet headSet/tailSet/subSet
Iterator接口
Collection的輸出方式
- Iterator
- ListIterator
- foreach
- Enumeration
集合的輸出最好一定是用Iterator接口
Iterator是迭代輸出接口
通過Collection.iterator()實例化
hasnext()判斷是否有內容,並且移動指針
在使用迭代輸出的時候,不要使用集合類的remove方法,而是要用iterator的remove方法,盡量不要再輸出時刪除
單向操作
ListIterator接口
繼承自Iterator
可以雙向的輸出
只有List接口才有實例化該接口的方法 只能現正向輸出,后逆向輸出,不能倒過來
List ls=new ArrayList();
ls.add("hello");
ls.add("world");
ls.add("!!!");
ListIterator ll=ls.listIterator();
while (ll.hasNext()){
System.out.print(ll.next());
}
while (ll.hasPrevious()){
System.out.print(ll.previous());
}
foreach
可以用於輸出集合或者數組中的內容,定義為:
for(type element: array){
System.out.println(element);
}
舉例如下
int s[]={0,1,2,3,4,5};
for(int w:s){
System.out.println(w);
}
List<Integer> l=new ArrayList<Integer>();
l.add(2);
l.add(3);
l.add(4);
for(int w:l){
System.out.println(w);
}
int ss[][]={{1,2,3},{4,5,6}};
//這里展示一下不規則數組
int sss[][]=new int[2][];
sss[0]=new int[3];
sss[1]=new int[5];
for(int x[]:ss){
for(int y:x){
System.out.println(y);
}
}
Map接口
Map.Entry接口
是Map的內部接口
指的是一個key->value的對象
實際上Map保存的是Map.Entry的對象,其實也相當於一組對象的集合
常見方法
- containsKey
- containsValue
- get
- KeySet 返回Key的Set集合
- Values 返回Value的Collection集合
常用的子類
- HashMap
- HashTable 比較老的類,與HashMap相比類似於ArraList與Vector的關系
- TressMap 按照Key的排序類
- WeakHashMap
WeakHashMap
當Map的某些內容長期不使用的時候,會自動刪除掉
在垃圾回收的時候,會把沒有被引用的數據刪掉
Map輸出,可以獲得KeySet然后打印Value,或者使用Map.Entry來迭代輸出
Map<String,String> m=new HashMap<String,String>();
m.put("1","11"); m.put("2","22");m.put("3","33");
Set<Map.Entry<String,String>> ms=m.entrySet();
//迭代器輸出
Iterator<Map.Entry<String,String>> msi=ms.iterator();
while (msi.hasNext()){
Map.Entry<String,String> me=msi.next();
System.out.println(me.getKey()+" "+me.getValue());
}
//foreach輸出
for(Map.Entry<String,String> me:ms){
System.out.println(me.getKey()+" "+me.getValue());
}
作為Key,實際上是一個Set了,不能重復,是通過equals和hashCode來判斷的,所以使用非系統類作為鍵值的話,應該復寫這兩個方法
IdentityHashMap
允許key是重復的,比較鍵(和值)時使用引用相等性代替對象相等性
我們說的Map的鍵值不能重復,就是說對象equals的時候不能想等。而InentityHashMap中必須使用同一個引用才能認為是相等的
Map<String,String> mm=new IdentityHashMap<String,String >();
mm.put(new String("123"),"1");
mm.put(new String("123"),"2");
Set<Map.Entry<String,String>> ms1=mm.entrySet();
for(Map.Entry<String,String> me:ms1){
System.out.println(me.getKey()+" "+me.getValue());
}
//這段代碼可以打印出結果,但是,由於“123”的引用都丟失了,實際上你通過get(i)是取不出來任何數據的
SoretdMap/TreeMap
按照key進行排序,可以獲得第一個/最后一個key,獲得部分的Map的集合
SortedMap<String,String> sm=new TreeMap<String,String>();
sm.put("A","AA");
sm.put("C","CC");
sm.put("B","BB");
System.out.println(sm.lastKey());
System.out.println(sm.firstKey());
sm.subMap("B","C");
對象引用強度說明
- 強引用
- 即使jvm內存不足,也不回收這個對象
- 軟引用
- 內存不足時,才回收
- 弱引用
- 不管內存咋樣,只要能回收了就回收了
- 虛引用
- 跟沒有引用一樣
Collections 集合操作類
主要的是對於一些常見的集合的操作,都是一些靜態的處理方法,可以用到,如下
java.util.Collections.addAll(l, "d", "qwe", "asd");
java.util.Collections.reverse(l);
java.util.Collections.replaceAll(l,"d","ddd");
java.util.Collections.binarySearch(l,"qwe");
java.util.Collections.sort(l);
java.util.Collections.swap(l,2,3);
Stack類
是Vector的子類
Stack<String> stack=new Stack<String>();
stack.push("1");
stack.add(3,"10"); //棧中間加入
stack.peek();//得到棧頂不彈出
stack.search("2");//搜索
Properities 屬性類
是hashtable的子類
Properties pro=new Properties();
pro.setProperty("1","11");
pro.setProperty("2","22");
pro.setProperty("3","33");
pro.storeToXML(new FileOutputStream("D:/a.xml"),"MYXML");
Properties pro1=new Properties();
pro1.loadFromXML(new FileInputStream("D:/a.xml"));
pro1.list(System.out);
System.out.println("1"+" "+pro1.getProperty("1"));
可以保存到xml或者普通文件。實際上就是一個Map,可以使用Map的全部操作。通過list可以列出全部的屬性。
store和load方法來與文件進行交互!!!!
