
COLLECTION.png
| 容器類型 | 容器中數(shù)據(jù) |
|---|---|
| Set | 數(shù)據(jù)對象沒有順序且不可重復 |
| List | 數(shù)據(jù)對象有順序且可以重復 |
| Map | key-value映射對的方法 |
package mashibing.java;
import java.util.Collection;
import java.util.HashSet;
public class BasicContainer {
public static void main(String[] args){
Collection<Object> c = new HashSet<>();
//父類引用指向子類對象
c.add("Hello");
c.add(new Name("f1","l1"));
c.add(new Integer(100));
c.remove("Hello");//String重寫了equals方法
c.remove(new Integer(100));//integer重寫了equals方法,所以兩者對象相等
//remove和add方法返回的都是布爾類型
System.out.println(c.remove(new Name("f1","l1")));//name沒有重寫equals方法所以這是兩個對象
System.out.println(c);
}
}
class Name{
private String firstName,lastName;
public Name(String firstName,String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public String toString(){
return firstName + "" + lastName;
}
public boolean equals(Object obj){
if(obj instanceof Name){
//如果obj是Name的一個子類,那么把obj強制轉(zhuǎn)化成Name類
Name name = (Name)obj;
return (firstName.equals(name.firstName))
&&(lastName.equals(name.lastName));
}
return super.equals(obj);
//如果它都不是Name類,那么交給object的equals來處理,也就是==
}
/*
* 容器類對象在調(diào)用remove,contains等方法的時候,需要比較對象是否相等,這會涉及到
* 對象類型的equals方法和hashCode方法,對于自定義的類型,需要重寫equals方法和
hashCode方法以實現(xiàn)自定義的對象相等規(guī)則,因為原本的Object的對象的equals方法是==,
也就是需要兩個引用的是同一個對象才能equals
注意:相等的對象應該具有相等的hash codes,在map調(diào)用的時候,會使用hashcode方法
*/
public int hashCode(){
return firstName.hashCode();
}
}
介紹下Iterator接口:
package mashibing.java;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args){
Collection<Object> c = new HashSet<>();
//set是沒有順序的,且不可以重復的
c.add(new Name("f1","l1"));
c.add(new Name("f2","l2"));
c.add(new Name("f3","l3"));
Iterator<Object> i = c.iterator();
/*
* Collection接口有一個方法叫做iterator,這個方法返回的是一個實現(xiàn)了了
* Iterator接口的對象,Iterator有三個方法,hasNext,查看是否有下一個對象
* next方法,返回下一個對象還有一個remove方法,該remove方法是在迭代中刪除元素唯一
* 安全的方法
*/
while(i.hasNext()){
Name n = (Name)i.next();
//這里知道返回的是一個Name對象,那么就就返回的強制轉(zhuǎn)換成Name
System.out.print(n.getFirstName()+" ");
}
}
}
Interator循環(huán),三個方法的使用
package mashibing.java;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class Remove {
public static void main(String[] args){
Collection<Object> c = new HashSet<Object>();
c.add(new Name("fff1","llll"));
c.add(new Name("f2","l2"));
c.add(new Name("ffff3","lll3"));
for(Iterator<Object> i = c.iterator();i.hasNext();){
//這里for循環(huán)只有兩個條件,一個是產(chǎn)生這么一個Iterator對象,
// 另外一個是還有下一個值
Name name = (Name)i.next();
if(name.getFirstName().length()<3){
i.remove();
/*
* 這里使用了Iterator接口的remove方法,因為Iterator循環(huán)內(nèi)部中
* 在操作數(shù)據(jù)的時候講數(shù)據(jù)鎖定了
* 如果我們換成c.remove(name)就會產(chǎn)生例外
*/
}
}
System.out.println(c);
}
}
Set
增強的for循環(huán)
package mashibing.java;
import java.util.ArrayList;
import java.util.Collection;
//增強的for循環(huán)
public class EnhanceFor {
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
for (int i : arr) {
System.out.println(i);
}
//缺點是只能看不能按照下標來修改,好處就是語法比較簡單
Collection<String> c = new ArrayList<String>();
c.add(new String("aaa"));
c.add(new String("bbb"));
c.add(new String("ccc"));
for(Object o:c){
System.out.println(o);
}
}
}
Set是不能重復的但是沒有順序的集合
package mashibing.java;
import java.util.HashSet;
import java.util.Set;
public class Testset {
public static void main(String[] args){
Set<Object> s = new HashSet<Object>();
s.add("hello");
s.add("world");
s.add(new Name("f1","f2"));
s.add(new Integer(100));
s.add(new Name("f1","f2"));
s.add("hello");
System.out.println(s);
/*
* 如果兩個元素equals,那么add是添加不進去的。所以這里Set的結(jié)果是
* [hello, 100, f1f2, world]順序無所謂,因為Set本身就沒有順序
*/
}
}
Set接口是Collection的子接口,Set接口沒有提供額外的方法,但是Set容器中得元素是沒有順序的,而且是不可以重復,Set容器類有HashSet、TreeSet等。
package mashibing.java;
import java.util.HashSet;
import java.util.Set;
public class Testset2 {
public static void main(String[] args){
Set<Object> s1 = new HashSet<Object>();
Set<Object> s2 = new HashSet<Object>();
s1.add("a");
s1.add("b");
s1.add("c");
s2.add("d");
s2.add("a");
s2.add("b");
Set<Object> sn = new HashSet<Object>(s1);
sn.retainAll(s2);//求交集
Set<Object> su = new HashSet<Object>(s1);
su.addAll(s2);
/*
* 把s2添加到啊su中,但是重復的是添加不進來的因為Set中只能有不重復的
* 所以su打印出來的結(jié)果是[d, b, c, a]
*/
System.out.println(sn);
System.out.println(su);
}
}