文章目錄
其他JAVA學習的內容見:目錄
概念與框架
- 容器類:Java類庫中提供的用於管理對象集合的類
Collection
- 列表(
List
):按照一定次序(對象進入的順序)排列的對象集,對象之間有次序關係,對象可以重複。 - 集合(
Set
):對象唯一,不會重複;元素沒有順序。 - 隊列(
Queue
):根據排隊規則確定對象的順序。
- 列表(
Map
(映射表)- 一羣成對的對象集,這些對象各自保持着“鍵-值”(key-value)對應關係。
- 允許使用一個對象來查找另一個對象。
Collection&List
- Collection接口
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
boolean add(E o);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
List
接口Collection
接口的子接口- 特點:實現該接口的類中的元素有順序,可以重複。
- List容器中的元素都有一個對應的整數型的序號,用以記錄元素在容器中的位置,可以根據序號取元素。
- 主要實現類:
ArrayList
、LinkedList
Object get(int index);
Object set(int index, Object element);
void add(int index,Object element);
Object remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
- 實例:泛型
List<String> list = new LinkedList<String>();
for(int i=0;i<=5;i++){
list.add("a"+i);
}
System.out.println(list);
list.add(3,"b");
System.out.println(list);
list.set(6,"c");
System.out.println(list);
System.out.println(list.get(2));
Vector
(不建議使用)- List接口的實現類。
- 特點:跟ArrayList一樣,都是可變長的對象數組。
- 與ArrayList區別
- Vector是線程安全的,是可以同步的,運行效率低;
- ArrayList不同步,適合於單線程環境中。
- 常用方法(List中未定義)
public Object elementAt(int index)
public void addElement(Object obj)
public void removeElementAt(int index)
public void insertElementAt(E obj, int index)
public boolean removeElement(Object obj)
public void removeAllElements()
棧與隊列
Stack
(棧)extend Vector
- 特點:後進先出的對象堆棧
- 主要方法:
public Object push(E item)
public Object pop()
public Object peek()
public boolean empty()
public int search(Object o)
- 實例
Stack s = new Stack();
s.push("hello");
s.push(new Date());
s.push(100);
s.push(3.14);
System.out.println("彈棧前:size=" + s.size());
System.out.println(s.pop());
System.out.println("彈棧後:size=" + s.size());
System.out.println(s.peek());
System.out.println("peek操作後:size=" + s.size());
while(!s.isEmpty()){
System.out.println(s.pop());
}
//彈棧前:size=4
//3.14
//彈棧後:size=3
//100
//peek操作後:size=3
//100
//Fri Dec 05 17:09:20 CST 2008
//hello
Queue
(隊列)- 隊列:一種先進先出(FIFO)的容器,從容器的一端放入對象,從另一端取出對象,並且放入和取出的順序相同。
- 主要方法
offer()
:(入隊)如果可能,將指定的元素插入此隊列。peek()
,element()
:在不移除的情況下返回隊頭。peek方法在隊列爲空時返回null,element方法在隊列爲空時拋出異常。poll()
,remove()
:移除並返回隊頭(出隊)。poll
方法在隊列爲空時返回null
,remove
方法在隊頭爲空時拋出異常。
- 主要實現類:
LinkedList
Queue queue = new LinkedList();
queue.offer("Hello");
queue.offer("World!");
queue.offer("你好!");
System.out.println(queue.size());
String str;
while ((str = (String)queue.poll()) != null) {
System.out.println(str);
}
System.out.println(queue.size());
集合set
Collection
接口的子接口,未提供額外的方法。- 實際上
Set
就是Collection
,只是行爲不同(繼承與多態思想的典型應用:表現不同的行爲)。 - 實現
Set
接口類的特點:元素無順序,不重複。 - JDK API中Set的實現類:
HashSet
、TreeSet
、LinkedHashSet
HashSet
HashSet
HashSet
中使用hashCode
、equals
方法判斷是否相同,爲了提高效率,先調用hashCode
方法(返回hashcode
值),hashCode
相同的才調用equals
方法判斷是否相同- 如果一個類要實現
hashCode
,必須和equals
方法一塊實現。hashCode
方法和equals
方法返回值的關係滿足:equals()
爲true
的兩個對象,hashcode()
返回值一定相等;equals()
不爲true
的兩個對象,它們的hashCode()
不一定相等。即,equals()
不爲true
的兩個對象,hashCode()
有可能相等。(哈希碼在生成的時候可能產生衝突)。hashCode()
不等的兩個對象,equals()
不爲true
;hashCode()
相等,equals()
可能爲true
,也可能不爲true
hashCode
方法的重寫:返回一個result
TreeSet
- 實現了Set接口,是Set的一個變體,是一個實現了排序功能的集合(類似於“插入排序”)。
- 工作原理:將對象元素添加到TreeSet中時會自動按照某種比較規則,將其插入到有序的對象序列中,以保證TreeSet集合元素組成的對象序列時刻按照“升序”排列;如果沒指定排序規則,則會按照對象的hash編碼來排序
字典Map
- 實現Map接口的類:存儲“鍵-值”對。
- 主要實現類:
HashMap
、TreeMap
- Map中“鍵值對”通過鍵標示,鍵要唯一,不重複
- 重複:
equals
爲true
(hashCode
相等)
- 重複:
HashMap
- 基於哈希表實現了映射集合結構。
- 特點:不保證其中元素的先後順序,並且允許使用“null”鍵和“null”值
public static void main(String args[]) {
Map m1 = new HashMap();
Map m2 = new TreeMap();
m1.put("one", new Integer(1));
m1.put("two", new Integer(2));
m1.put("three", new Integer(3));
m2.put("A", new Integer(1));
m2.put("B", new Integer(2));
System.out.println(m1.size());//3
System.out.println(m1.containsKey("one"));//true
System.out.println(m2.containsValue(new Integer(1)));/true
if (m1.containsKey("two")) {
int i = ((Integer) m1.get("two")).intValue();
System.out.println(i);//2
}
Map m3 = new HashMap(m1);
m3.putAll(m2);
System.out.println(m3);//{two=2, A=1, B=2, one=1, three=3}
}
Hashtable
- 特點:實現
Map
接口,與HashMap
作用基本一樣。 Hashtable
和HashMap
的用法、格式完全相同。- 與
HashMap
的區別:Hashtable
是同步的,線程安全的,效率低一點;HashMap
不同步,效率較高,適合於單線程環境;Hashtable
的鍵值都不能爲null
。
Properties
public class Properties extends Hashtable<Object,Object>
- 作用:處理屬性文件時方便,把Map對象和屬性文件關聯起來
- 可以把Map對象中的key-value對寫入到屬性文件;
- 可以把屬性文件中的“屬性名=屬性值”加載到Map對象中。
- 說明:
key
和value
都是String
類型
Properties props = new Properties();
// 向Properties中增加屬性
props.setProperty("username" , "admin");
props.setProperty("password" , "123456");
// 將Properties中的key-value對保存到a.ini文件中
props.store(new FileOutputStream("e:/gar/a.ini"),"用戶名密碼錶");
// 新建一個Properties對象
Properties props2 = new Properties();
props2.load(new FileInputStream("e:/gar/a.ini") );
String username = props2.getProperty("username");
String pwd = props2.getProperty("password");
System.out.println("用戶名是:"+username+",密碼是:"+pwd);//用戶名是:admin,密碼是:123456
迭代器
- 容器的遍歷:必須根據容器的確切類型進行編碼。
- 迭代器:以統一的方式遍歷容器中的對象,程序員不必知道該容器的底層結構。
Iterator接口
- 作用:以統一的方式對各種集合元素進行遍歷、迭代。
- 實現
Collection
接口的容器類都有一個iterator
方法。- 返回一個實現了
Iterator
接口的對象。
- 返回一個實現了
Iterator
中的方法boolean hasnext( )
object next()
void remove( )
- 實例(只能前移)
Collection c = new HashSet();
c.add(new Student(1,"Tom",60));
c.add(new Student(2,"Peter",70));
c.add(new Student(3,"Bob",80));
Iterator i = c.iterator();
while(i.hasNext()){
Student s = (Student)i.next();//沒有使用泛型,所以要加強制類型轉換
System.out.println(s.getName());
}
- 缺點:
- 對於數組:不能方便的訪問數組下標。
- 對於Collection,不能方便的刪除元素。
- 說明:
- 所有的Collection都可以使用foreach語法遍歷。
- 對容器只是向前遍歷、不修改容器本身時使用。
- 除了簡單遍歷,不要使用增強的for循環。
ListIterator接口
Iterator
的子類型,功能更強大,只能用於各種List
的訪問。- 特點:可以雙向移動。
- 創建方法(來源於
List
)listIterator()
:產生一個指向List開始處的ListIterator
listIterator(n)
:創建一個開始指向列表索引爲n的元素處的listIterator。
- 實例
List all = new ArrayList();
all.add("hello");
all.add("_");
all.add("world");
ListIterator iter = all.listIterator();
while (iter.hasNext()) {
String str = (String)iter.next();
System.out.println(str + " ");
}
while (iter.hasPrevious()) {
String str = (String)iter.previous();
System.out.println(str + " ");
}
實用類
- Collections類
- 類
java.util.Collections
提供了List
容器操作的靜態方法 - 常用方法
void sort(List list)
;//對List容器內元素排序void reverse(List list)
;//對List容器內的對象進行逆序排列void copy(List dest,List src)
;//把src中List容器內容拷貝到dest List容器int binarySearch(List list, Object key)
;//對順序的List容器,用折半查找方法查找指定對象void shuffle(List)
;//對List容器內的對象進行隨機排序
- 類
- Arrays類
- 定義了多種數組操作方法,實現了對數組元素的排序、填充、轉換爲列表或字符串形式、增強的檢索和深度比較等功能
- 實例
Integer[ ] a = {3,25,12,79,48};
System.out.println(Arrays.toString(a));//[3, 25, 12, 79, 48]
Arrays.sort(a);
System.out.println(Arrays.toString(a));//[3, 12, 25, 48, 79]
int idx = Arrays.binarySearch(a,25);
System.out.println(idx);//2
List list = Arrays.asList(3,4,5);
System.out.println(list);//[3, 4, 5]