集合概述(課堂筆記)
-
集合就是一個容器,這個容器可以裝很多其他的數據
-
Collection(根類)
容器:
-
數組
-
StringBuffer/StringBuilder
-
append() insert()
-
Collection
1、爲什麼會有集合?
數組:長度固定!!!!
存儲學生的成績,但是不知道學生有多少人
1.存儲對象可以考慮,①數組 ②集合
2.數組存儲對象的特點,Student[] stu =new Student[20]; stu[0] =new Student();…
> 弊端,①一旦創建,其長度不可變。②真實的數組存放的對象的個數是不可知的
2、集合體系
java集合可分爲Collection和Map兩種體系
-
Collection接口:
- Set:元素無序、不可重複的集合 (類似高中集合特性:確定性,無序性,互異性)
- List:元素有序,可重複的集合(類似“動態”數組 如班級成績,成績有一樣的)
-
Map接口:具有映射關係“key-value對”的集合 —類似於高中的“函數” y=f(x) (x1,y1)(x2,y2)
3、接口方法介紹
package Collection1;
import java.util.*;
public class TextCollection {
public static void main(String[] args) {
TextCollection textCollection = new TextCollection();
// textCollection.textCollection1();
// textCollection.textCollection2();
textCollection.textCollection3();
}
public void textCollection1(){
Collection coll = new ArrayList();
// 1. size() :返回集合中元素的個數
System.out.println(coll.size());
// 2. add(Object obj) : 向集合中添加一個元素,默認Objcet類型
coll.add(123);
coll.add("AA");
coll.add(new Date());
coll.add("BB");
System.out.println(coll.size());
// 3. addAll(Collection coll) : 將形參coll中包含的所有元素添加到當前集合中
Collection coll1 = Arrays.asList(1, 2, 3);
coll.addAll(coll1);
System.out.println(coll.size());
//查看集合元素
System.out.println(coll);
// 4. isEmpty(); 判斷集合是否爲空
System.out.println(coll.isEmpty());
// 5. clear() : 清空集合元素
coll.clear();
System.out.println(coll.isEmpty());
}
public void textCollection2(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(new String("AA"));
coll.add(new Date());
coll.add("BB");
Person p = new Person("MM", 23);
coll.add(p);
coll.add(new Person("mm",31));
System.out.println(coll);
// 6. contains(Object obj) : 判斷集合中是否包含指定的obj元素,包含返回true,不包含返回false
//判斷的依據,根據元素所在的類的equals()方法進行判斷
//明確,如果存入集合中的元素是自定義類的對象,要求,自定義要重寫equals()方法!
boolean contains = coll.contains(123);
contains = coll.contains("AA");
System.out.println(contains);
boolean contains1 = coll.contains(p);
System.out.println(contains1);
boolean mm = coll.contains(new Person("mm", 31));
System.out.println(mm);
// 7. containsAll(Collection coll) : 判斷當前集合中是否包含coll中所有的元素
Collection coll1 = new ArrayList();
coll1.add(123);
coll1.add(new String("AA"));
boolean b = coll.containsAll(coll1);
System.out.println(b);
// 8. retainAll(Collection coll) : 求當前集合與coll的共有的元素,返回給當前集合
coll.retainAll(coll1);
// 9. remove(Object obj) : 刪除集合中的obj元素,若刪除成功,返回true,否則,
coll.remove("BB");
}
public void textCollection3(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(new String("AA"));
coll.add(new Date());
coll.add("BB");
coll.add(new Person("MM",23));
Collection coll1 = new ArrayList();
coll1.add(123);
coll1.add(new String("AA"));
// 10. removeAll(Collection coll) : 從當前集合中刪除包含在coll中的元素。
coll.removeAll(coll1);
System.out.println(coll);
// 11. equals(Object obj) : 判斷集合中的所有元素是否完全相同
Collection coll2 = new ArrayList();
coll2.add(123);
coll2.add(new String("AA"));
System.out.println(coll1.equals(coll2));
// 12. hashCode():
System.out.println(coll.hashCode());
System.out.println();
// 13. toArray() : 將集合轉化爲數組
Object[] obj = coll.toArray();
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
System.out.println();
// 14. iterator()迭代器 : 返回一個Iterator接口實現類的對象,進而實現集合的遍歷!
Iterator iterator = coll.iterator();
//方式1
// System.out.println(iterator.next());
//方式2
/// for (int i = 0; i < coll.size(); i++) {
/// System.out.println(iterator.next());
/// }
//方式3
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
4、Collection接口
4.1、List接口
存儲有序的,可以重複的元素
-
ArrayList(主要的實現類)
-
package TestList; import java.util.ArrayList; import java.util.List; public class TestList { public static void main(String[] args) { TestList testList = new TestList(); // testList.textList1(); testList.textList2(); } //ArrayList, List的主要實現類 (動態數組) /* List中相對於Collection,新增加的方法 void add(int index) : 在指定的索引位置index添加元素ele boolean addAll(int index,Collection eles):在指定位置添加eles集合中的所有元素 Object get(int index):獲取指定位置的元素 Object remove(int index): 刪除指定索引位置的元素 Object set(int index,Object ele):設置指定索引位置的元素爲 ele int indexOf(Object obj): 返回obj在集合中首次出現的位置。沒有的話,返回-1 int lastIndexOf(Object obj): 返回obj在集合中最後一次出現的位置,沒有的話,返回-1 List subList(int fromIndex,int toIndex): 返回從fromTndex到toIndex List常用方法,增(add(Object obj))刪(remove) 改(set(int index,Object obj))查(get(int index)) 插(add(int index,Object ele))長度(size()) */ public void textList1(){ List list = new ArrayList(); // 1. add添加元素 list.add(123); list.add(456); list.add(new String("AA")); list.add(new String("GG")); System.out.println(list); // 2. add向指定位置添加元素 list.add(0, 555); System.out.println(list); // 3. get獲取指定位置的元素 Object o = list.get(1); System.out.println(o); // 4. remove刪除指定索引位置的元素 list.remove(0); System.out.println(list); // 5. set設置指定索引位置的元素 list.set(0, 111); System.out.println(list); } public void textList2(){ List list = new ArrayList(); // 1. add添加元素 list.add(123); list.add(456); list.add(new String("AA")); list.add(new String("GG")); list.add(456); System.out.println(list); System.out.println(list.indexOf(456)); System.out.println(list.lastIndexOf(456)); System.out.println(list.indexOf(123)==list.lastIndexOf(123)); System.out.println(list.indexOf(444)); List list1 = list.subList(0, 3); System.out.println(list1); } }
-
LinkedList(對於頻繁的插入、刪除操作)
-
Vector (古老的實現類、線程安全的)
4.2、Set接口
存儲無序的,不可重複的元素
- HashSet
- LinkedHashSet
- TreeSet
package TextSet;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class TextSet {
public static void main(String[] args) {
TextSet textSet = new TextSet();
// textSet.testHashSet();
textSet.testTreeSet1();
}
/*
Collection接口:
|----List接口存儲有序的,可以重複的元素
|----ArrayList(主要的實現類);
|----LinkedList(對於頻繁的插入、刪除操作)、
|----Vector(古老的實現類,線程安全的,但效率要低於ArrayList)
|----Set接口,存儲無序的,不可重複的元素.Set中常用的方法都是Collection下定義的。
|----HashSet(主要實現類)
|----LinkedHashSet
|----TreeSet
*/
public void testTreeSet1(){
Set set =new TreeSet();
// set.add(123);
// set.add(456);//類型不兼容
// set.add(new String("AA"));
// set.add(new String("AA"));
// set.add("JJ");
// set.add("GG");
// set.add("MM");
// 都是String類型
/*
TreeSet:
1.向TreeSet中添加的元素必須是同一個類的。
2.可以按照添加進集合中的元素的指定的順序遍歷。
像String,包裝類等默認按照從小到大的順序遍歷
*/
//當Person沒有實現Comparable接口時,當向
// TreeSet中添加Person對象時,報ClassCastException錯
set.add(new Person("CC",23));
set.add(new Person("MM",21));
set.add(new Person("GG",25));
set.add(new Person("JJ",24));
set.add(new Person("DD",20));
set.add(new Person("DD",19));
for (Object str : set){
System.out.println(str);
}
//字母順序,指定的順序,從小到大
}
public void testHashSet(){
/*Set:存儲的元素是無序的,不可重複的!
1.無序性,無序性!=隨機性
真正的無序性,指的是元素在底層存儲的位置是無序的。
2.不可重複性,當向Set中添加進相同的元素的時候,後面的這個元素不能夠添加進去
說明,要求添加進Set中的元素所在類,一定要重寫equals()和hashCode()方法
進而保證Set中元素的不可重複性
Set中的元素是如何存儲的呢? 使用了hashCode方法(哈希算法)
當Set添加對象時,首先調用此對象所在類的hashCode()方法,計算此對象的哈希值,此
哈希值決定了此對象在Set中的存儲位置,若此位置之前沒有對象存儲,則這個對象存儲到此位置
若此位置已有對象存儲,再通過equals()比較這兩個對象是否相同,後一個對象就不能再添加進來。
萬一返回false呢,都存儲,(不建議如此)
> 要求,hashCode()方法要與equals()方法一致
*/
Set set = new HashSet();
set.add(123);
set.add(465);
set.add("AA");
set.add("AA");
set.add(new String("AA"));
set.add(new String("AA"));
set.add("BB");
set.add(null);
Person p1 = new Person("GG",23);
Person p3 = new Person("GG",23);
Person p2 = new Person("MM",21);
System.out.println(p1.equals(p3));//沒有重寫equals,並且重寫hashCode,不相同
System.out.println(p3.hashCode());
System.out.println(p1.hashCode());
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set.size());
System.out.println(set);//無序的
}
}
5、Map接口
存儲“鍵-值”對的數據
- HashMap
- LinkedHashMap
- TreeMap
- Hashtable(子類:Properties)
5.1、接口說明
- Map與Collection並列存在。用於保存具有映射關係的數據:Key-Value
- Map中的Key和Value都可以是任何引用類型的數據
- Map中的Key用Set來存放,不允許重複,即同一個Map對象所對應的類,需重寫hashCode()和equals()方法
- 常用String類作爲Map的“鍵”
- Key和Value之間存在單向一對一關係,即通過指定的Key總能找到唯一的、確定的Value
Map底層結構
package TextMap;
import java.lang.reflect.AnnotatedArrayType;
import java.util.HashMap;
import java.util.Map;
public class TestMap {
/*
* Collection接口
*
*
* Map接口
* 實現類:
* - HashMap(主要實現類)
* - LinkedHashMap
* - TreeMap
* - Hashtable
* - Properties
*
* */
public static void main(String[] args) {
TestMap testMap = new TestMap();
testMap.test1();
}
//方法介紹
/*
Object put(Object key,Object value):向Map中添加一個元素
Object remove(Object key): 按照指定的key刪除此key-value
void putAll(Map t) 添加Map類的對象t中所有的key-value添加進調用對象
void clear() :清空
Object get(Object key):獲取指定的key的value值,若無指定的key,則返回null
boolean containsKey(Object key) : 判斷是否包含指定key
boolean containsValue(Object value): 判斷是否包含指定value 對應類型重寫equals方法
int size() :返回集合的長度
boolean isEmpty() 判斷是否爲空
boolean equals(Object obj)判斷是否相等
HashMap
1.Key 不能重複 用Set存放|value 是Collection存放,可重複|
一個Key-value對,是一個Entry,所有的Entry是用Set存放的,也是不可重複的
2.向HashMap中添加元素時會調用Key所在類的equals方法,
判斷兩個Key是否相同,若相同則只能添加進一個,舊的被覆蓋,添加進新的值
*/
public void test1(){
Map map =new HashMap();
////put 添加 get 獲取
map.put("AA", 123);
map.put("AA", 1234);
System.out.println(map.get("AA"));
System.out.println(map.get("AC"));
System.out.println(map.size());
map.put("BB", 123);
map.put("CC", 1234);
map.put(123, "DD");
map.put(null, null);
//person要重寫equals
map.put(new Person("DD",23),123);
map.put(new Person("DD",23),12);
////remove 清空
map.remove("AA");
System.out.println(map.size());
System.out.println(map);
Map map1 =new HashMap();
map1.put("AA", 12345);
map1.put("AAC", 12345);
map.putAll(map1);
System.out.println(map);
System.out.println(map1);
}
}
6、Person 自定義類代碼
package TextSet;
import java.util.Objects;
public class Person implements Comparable{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(age, person.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//當向TreeSet中添加Person類的對象時,依據此方法,設定按照哪個屬性排列。
@Override
public int compareTo(Object o) {
if(o instanceof Person){
Person p=(Person) o;
return this.name.compareTo(p.name);
}
return 0;
}
}