集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)沮趣。
任何集合框架都包含三大塊內(nèi)容:對(duì)外的接口务傲、接口的實(shí)現(xiàn)和對(duì)集合運(yùn)算的算法狈癞。
適合存儲(chǔ)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)履羞。
- 接口:表示集合的抽象數(shù)據(jù)類型峦萎。接口提供了讓我們對(duì)集合中所表示的內(nèi)容進(jìn)行單獨(dú)操作的可能屡久。
- 實(shí)現(xiàn):集合框架中接口的具體實(shí)現(xiàn)。實(shí)際它們就是那些可復(fù)用的數(shù)據(jù)結(jié)構(gòu)爱榔。
- 算法:在一個(gè)實(shí)現(xiàn)了某個(gè)集合框架中的接口的對(duì)象身上完成某種有用的計(jì)算的方法被环,例如查找、排序等详幽。這些算法通常是多態(tài)的筛欢,因?yàn)橄嗤姆椒梢栽谕粋€(gè)接口被多個(gè)類實(shí)現(xiàn)時(shí)有不同的表現(xiàn)
Iterator接口
-
Collection接口(存儲(chǔ)不唯一,無(wú)序?qū)ο?
- List接口(存儲(chǔ)不唯一唇聘,有序?qū)ο?<-----實(shí)現(xiàn)類:
ArrayList
,LinkedList
- Set接口(存儲(chǔ)唯一版姑,無(wú)序?qū)ο?<-----實(shí)現(xiàn)類:
HashSet
,TreeSet
- List接口(存儲(chǔ)不唯一唇聘,有序?qū)ο?<-----實(shí)現(xiàn)類:
Map接口(存儲(chǔ)一組鍵值對(duì)象) 實(shí)現(xiàn)類:
HashMap
,TreeMap
算法類:
Collections
,Arrays
Iterator接口
專門對(duì)集合進(jìn)行迭代的迭代器,主要有兩個(gè)方法
hasNext();//判斷是否存在下一個(gè)可訪問(wèn)的元素迟郎,如果有就繼續(xù)迭代剥险,返回true,否則返回false
next();//返回要訪問(wèn)的下一個(gè)元素
ArrayList
基于數(shù)組的存儲(chǔ)方式宪肖,在內(nèi)存中分配連續(xù)的空間存放數(shù)據(jù)表制,遍歷元素的隨機(jī)訪問(wèn)的效率比較高。對(duì)數(shù)組進(jìn)行了封裝控乾,實(shí)現(xiàn)了長(zhǎng)度可變的數(shù)組夫凸。也可理解為存放對(duì)象的動(dòng)態(tài)數(shù)組。
常用方法:
boolean add(E e) //將指定的元素添加到此列表的尾部阱持。
void add(int index, E element) //將指定的元素插入此列表中的指定位置夭拌。
void clear()//移除此列表中的所有元素。
boolean contains(Object o)//如果此列表中包含指定的元素衷咽,則返回 true鸽扁。
E get(int index)//返回此列表中指定位置上的元素。
int indexOf(Object o)//返回此列表中首次出現(xiàn)的指定元素的索引镶骗,或如果此列表不包含元素桶现,則返回 -1。
boolean isEmpty()//如果此列表中沒(méi)有元素鼎姊,則返回 true
E set(int index, E element)//用指定的元素替代此列表中指定位置上的元素骡和。
E remove(int index)//移除此列表中指定位置上的元素。
boolean remove(Object o)//移除此列表中首次出現(xiàn)的指定元素(如果存在)相寇。
int size()//返回此列表中的元素?cái)?shù)慰于。
示例代碼:
public class Demo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("張三豐");
list.add("郭靖");
list.add(1,"楊過(guò)");
System.out.println(list.contains("李莫愁"));
list.remove(0);
list.set(1, "黃蓉");
for(int i = 0; i < list.size(); i++){
String name = list.get(i);
System.out.println(name);
}
System.out.println(list.indexOf("小龍女"));
list.clear();
System.out.println(list.isEmpty());
}
}
LinkedList
基于鏈表的存儲(chǔ)方式,插入唤衫、刪除元素時(shí)效率比較高婆赠,查找效率低。
LinkedList除了包含ArrayList的方法外佳励,還有一些獨(dú)有的方法休里。
void addFirst(E e)//在集合首部插入元素
void addLast(E e)//在集合尾部插入元素
E getFirst()//獲得當(dāng)前集合的第一個(gè)元素
E getLast()//獲得當(dāng)前集合的最后一個(gè)元素
E removeFirst()//移除并返回當(dāng)前集合的第一個(gè)元素
E removeLast()//移除并返回當(dāng)前集合的最后一個(gè)元素
public class Demo {
public static void main(String[] args) {
NewsTitle car = new NewsTitle(1,"汽車","管理員");
NewsTitle medical = new NewsTitle(2,"醫(yī)學(xué)","管理員");
NewsTitle fun = new NewsTitle(3,"娛樂(lè)","管理員");
NewsTitle gym = new NewsTitle(4,"體育","管理員");
LinkedList<NewsTitle> newsTitleList = new LinkedList<NewsTitle>();
newsTitleList.add(car);
newsTitleList.add(medical);
newsTitleList.addFirst(fun);
newsTitleList.addLast(gym);
NewsTitle first = (NewsTitle)newsTitleList.getFirst();
NewsTitle last = (NewsTitle)newsTitleList.getLast();
System.out.println("頭條是"+first.getTitle());
System.out.println("最后一條是"+last.getTitle());
newsTitleList.removeFirst();
newsTitleList.removeLast();
System.out.println("頭條和末尾已刪除");
for(NewsTitle news : newsTitleList){
System.out.println("新聞標(biāo)題是: "+news.getTitle());
}
}
}
HashSet
基于散列的數(shù)據(jù)存儲(chǔ)方式蛆挫,存放唯一、無(wú)序的對(duì)象妙黍,存放的其實(shí)是對(duì)象的引用悴侵,采用equals()方法比較兩個(gè)對(duì)象的指針,保證對(duì)象在集合中是唯一的拭嫁。在無(wú)序的集合中查找元素的效率比較高可免。
常用方法:
boolean add(E e)//如果此 set 中尚未包含指定元素,則添加指定元素噩凹。
void clear()//從此 set 中移除所有元素巴元。
boolean contains(Object obj)//如果此 set 包含指定元素,則返回 true驮宴。
boolean isEmpty()//如果此 set 不包含任何元素逮刨,則返回 true。
Iterator<E> iterator()//返回對(duì)此 set 中元素進(jìn)行迭代的迭代器堵泽。
boolean remove(Object o)//如果指定元素存在于此 set 中修己,則將其移除。
int size()//返回此 set 中的元素的數(shù)量(set 的容量)迎罗。
示例代碼:
public class Demo {
public static void main(String[] args) {
NewsTitle car = new NewsTitle(1,"汽車","管理員");
NewsTitle test = new NewsTitle(2,"高考","管理員");
Set<NewsTitle> newsTitleList = new HashSet<NewsTitle>();
newsTitleList.add(car);
newsTitleList.add(test);
System.out.println("新聞標(biāo)題數(shù)目為:"+newsTitleList.size());
System.out.println("汽車新聞是否存在:"+newsTitleList.contains(car));
newsTitleList.remove(car);
System.out.println("集合是否為空:"+newsTitleList.isEmpty());
System.out.println("遍歷新聞所有標(biāo)題:");
for(NewsTitle news : newsTitleList){
System.out.println("新聞標(biāo)題是:"+news.getTitle());
}
}
}
HashMap
Map接口存儲(chǔ)一組成對(duì)的鍵值對(duì)象睬愤,(key,value),提供key到value的映射,通過(guò)key來(lái)檢索纹安,key必須唯一尤辱,可以無(wú)序;value可以無(wú)序厢岂,可以不唯一光督。
HashMap的查詢指定元素效率較高。
常用方法:
void clear()//清空集合中的所有元素
boolean containsKey(Object key)//集合中是否存在key
boolean containsValue(Object value)//集合中是否存在value
boolean isEmpty()//集合是否為空
V put(K key, V value)//將一對(duì)key,value放入集合塔粒,如果集合中已經(jīng)存在结借,將替換舊值
V get(Object key)//根據(jù)key,返回對(duì)應(yīng)的value
V remove(Object key)//從集合中移除與key相關(guān)的映射卒茬,并返回key關(guān)聯(lián)的value
int size()//集合中元素的數(shù)量
Set<K> keySet()//返回所有key的集合
Collection<V> values()//返回所有value的集合
示例代碼:
public class Demo {
public static void main(String[] args) {
Student stu1 = new Student("郭靖","男");
Student stu2 = new Student("黃蓉","女");
Map<String, Student> students = new HashMap<String, Student>();
students.put("tom", stu1);
students.put("rose",stu2);
System.out.println("已添加"+students.size()+"個(gè)學(xué)生信息");
System.out.println("鍵集"+students.keySet());
String key = "tom";
if(students.containsKey(key)){
Student stu = students.get(key);
System.out.println("英文名是"+key+"的學(xué)生是"+stu.getName());
}
String key1 = "rose";
if(students.containsKey(key1)){
students.remove(key1);
System.out.println(key1+"學(xué)員的信息已刪除");
}
}
}
Collections
Collections是Java提供的一個(gè)集合操作工具類船老,包含了大量的靜態(tài)方法,用于實(shí)現(xiàn)對(duì)集合元素的排序圃酵、查找和替換等柳畔。
常用方法:
sort();//對(duì)集合中的元素排序,要實(shí)現(xiàn)一個(gè)類的對(duì)象排序辜昵,這個(gè)類就要實(shí)現(xiàn)Comparable接口荸镊,重寫compareTo()方法,按指定方式比較對(duì)象堪置,再調(diào)用Collections的sort()方法
binarySearch();//查詢?cè)毓妫祷卦叵聵?biāo)
fill();//替換集合中的所有元素為相同元素
示例代碼:
public class Student implements Comparable<Object>{//實(shí)現(xiàn)Comparable接口
private int number = 0;
private String name = null;
private String gender = null;
//......省略......
@Override
public int compareTo(Object obj) {//重寫compareTo()方法
Stu stu = (Stu)obj;
if(this.number == stu.getNumber()){
return 0;
}else if(this.number > stu.getNumber()){
return 1;
}else{
return -1;
}
}
}
public class Demo {
public static void main(String[] args) {
Student s1 = new Stu();
//......省略......
ArrayList<Stu> list = new ArrayList<Stu>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);//排序
System.out.println("排序后:————————————————");
Iterator<Student> it = list.iterator();
while(it.hasNext()){
Student stu = (Student)it.next();
System.out.println(stu.getNumber());
}
int index = Collections.binarySearch(list, s1);//查詢
System.out.println("s1的索引是:"+index);
Collections.fill(list, s1);//list中的所有元素都替換成s1
}
}