集合
集合,集合是java中提供的一種容器,可以用來存儲多個數據。
數組的長度是固定的。集合的長度是可變的。集合中存儲的元素必須是引用類型數據
1.1 ArrayList集合存儲元素
package com.oracle.List;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class Demo01 {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add(1,"e");
//遍歷
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//刪除指定位置上的元素
list.remove(0);
System.out.println("=========");
//遍歷
for(String i : list){
System.out.println(i);
}
System.out.println("======================");
//修改指定位置上的元素
list.set(1, "你好嗎?");
Iterator<String> it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
運行結果:
1.2 集合的繼承實現關系
查看ArrayList類發現它繼承了抽象類AbstractList同時實現接口List,而List接口又繼承了Collection接口
源代碼:
interface List extends Collection {
}
public class ArrayList extends AbstractList implements List{
}
這說明我們在使用ArrayList類時,該類已經把所有抽象方法進行了重寫。那么,實現Collection接口的所有子類都會進行方法重寫。
Collection接口常用的子接口有:List接口、Set接口
List接口常用的子類有:ArrayList類、LinkedList類
Set接口常用的子類有:HashSet類、LinkedHashSet類
ArrayList : 有序 可存儲重復元素 增刪快查找慢
LinkedArrayList : 有序 可存儲重復元素 查找快增刪慢
HashiSet:無序 不可重復
LinkedHashiSet:有序 不可重復
1.3 Collection接口的基本方法
既然Collection接口是集合中的頂層接口,那么它中定義的所有功能子類都可以使用。查閱API中描述的Collection接口。Collection 層次結構中的根接口。Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重復的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。
實體類:
package com.oracle.Collections;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package com.oracle.Collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(55);
list.add(53);
list.add(5);
list.add(52);
list.add(24);
list.add(44);
list.add(33);
//對數組進行排序
Collections.sort(list);
for(int i :list){
System.out.print(i+" ");
}
System.out.println();
//打亂集合元素的順序
Collections.shuffle(list);
for(int i :list){
System.out.print(i+" ");
}
System.out.println();
}
}
運行結果:
package com.oracle.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo02 {
private static Object classnames;
public static void main(String[] args) {
HashMap<String, HashMap<Person,String>> map=new HashMap<String, HashMap<Person,String>>();
HashMap<Person,String> m1=new HashMap<Person,String>();
HashMap<Person,String> m2=new HashMap<Person,String>();
m1.put(new Person("拉拉",22), "java1203班");
m1.put(new Person("欣欣",21), "java1203班");
m2.put(new Person("夏欣",18), "java1010班");
m2.put(new Person("小曦",24), "java1010班");
map.put("北大", m1);
map.put("清華", m2);
//key+增強for
/*Set<String> schools=map.keySet();
for(String school : schools){
//根據學校名稱獲取所喲有班級map
HashMap<Person, String> classes = map.get(school);
//遍歷該班級的所有Set得到
Set<Person> persons=classes.keySet();
for(Person person:persons){
String classname=classes.get(persons);
System.out.println("學校名稱為:"+school+",班級名稱為:"+person.getName()+"年齡為:"+person.getAge());
}
}*/
Iterator<Map.Entry<String, HashMap<Person, String>>> it=map.entrySet().iterator();
while (it.hasNext()) {
//獲取學校
Entry<String, HashMap<Person, String>> schools = it.next();
String schooler = schools.getKey();
HashMap<Person, String> classer = schools.getValue();
Iterator<Map.Entry<Person, String>> it1=classer.entrySet().iterator();
while (it1.hasNext()) {
Entry<Person, String> clas= it1.next();
Person key = clas.getKey();
String value = clas.getValue();
System.out.println(schooler+" "+key.getName()+" "+key.getAge());
}
}
}
}
運行結果:
Iterator迭代器
2.1 Iterator迭代器
Collection集合元素的通用獲取方式:在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。
hasNext()方法:用來判斷集合中是否有下一個元素可以迭代。如果返回true,說明可以迭代。
next()方法:用來返回迭代的下一個元素,並把指針向后移動一位。
迭代集合元素圖解:
在Collection接口描述了一個抽象方法iterator方法,所有Collection子類都實現了這個方法,並且有自己的迭代形式
package com.oracle.demo01;
import java.util.Iterator;
import java.util.LinkedHashMap;
public class Demo02 {
public static void main(String[] args) {
LinkedHashMap<Person, String> map = new LinkedHashMap<Person, String>();
Person p1 = new Person("趙四", 18);
Person p2 = new Person("張三", 18);
Person p3 = new Person("熊大", 19);
map.put(p1, "Java1班");
map.put(p2, "Java2班");
map.put(p3, "Java3班");
//遍歷
Iterator<Person> it=map.keySet().iterator();
while (it.hasNext()) {
Person key = it.next();
String value=map.get(key);
System.out.println(key+" "+value);
}
}
}
運行結果:
2.2 集合元素的向下轉型(強轉)
在Collection接口描述了一個抽象方法iterator方法,所有Collection子類都實現了這個方法,並且有自己的迭代形式。
增強for循環
格式:
for(元素的數據類型 變量 : Collection集合or數組){
}
注意:新for循環必須有被遍歷的目標。目標只能是Collection或者是數組。
建議:遍歷數組時,如果僅為遍歷,可以使用增強for如果要對數組的元素進行 操作,使用老式for循環可以通過角標操作。