COLLECTION.png
容器类型 | 容器中数据 |
---|---|
Set | 数据对象没有顺序且不可重复 |
List | 数据对象有顺序且可以重复 |
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强制转化成Name类
Name name = (Name)obj;
return (firstName.equals(name.firstName))
&&(lastName.equals(name.lastName));
}
return super.equals(obj);
//如果它都不是Name类,那么交给object的equals来处理,也就是==
}
/*
* 容器类对象在调用remove,contains等方法的时候,需要比较对象是否相等,这会涉及到
* 对象类型的equals方法和hashCode方法,对于自定义的类型,需要重写equals方法和
hashCode方法以实现自定义的对象相等规则,因为原本的Object的对象的equals方法是==,
也就是需要两个引用的是同一个对象才能equals
注意:相等的对象应该具有相等的hash codes,在map调用的时候,会使用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,这个方法返回的是一个实现了了
* Iterator接口的对象,Iterator有三个方法,hasNext,查看是否有下一个对象
* next方法,返回下一个对象还有一个remove方法,该remove方法是在迭代中删除元素唯一
* 安全的方法
*/
while(i.hasNext()){
Name n = (Name)i.next();
//这里知道返回的是一个Name对象,那么就就返回的强制转换成Name
System.out.print(n.getFirstName()+" ");
}
}
}
Interator循环,三个方法的使用
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循环只有两个条件,一个是产生这么一个Iterator对象,
// 另外一个是还有下一个值
Name name = (Name)i.next();
if(name.getFirstName().length()<3){
i.remove();
/*
* 这里使用了Iterator接口的remove方法,因为Iterator循环内部中
* 在操作数据的时候讲数据锁定了
* 如果我们换成c.remove(name)就会产生例外
*/
}
}
System.out.println(c);
}
}
Set
增强的for循环
package mashibing.java;
import java.util.ArrayList;
import java.util.Collection;
//增强的for循环
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的结果是
* [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打印出来的结果是[d, b, c, a]
*/
System.out.println(sn);
System.out.println(su);
}
}