Collection有一个父接口叫Iterable,这个父接口中有一个方法叫iterator,Collection调用这个父接口返回了一个迭代器对象iterator。这个iterator对象有三个方法,hasNext().Next(),remove()方法。
package com.bjpowernode.day24.Collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest {
public static void main(String[] args) {
//创建集合对象
//Collection c = new Collection();//接口是抽象的,无法实例化(即无法new对象)
//多态,父类型的对象指向子类型的引用。
Collection c = new ArrayList();
//测试Collection的常用方法
c.add(1200);//自动装箱,int自动转为Integer类型,Integer x = new Integer(1200)集合中存放的是引用,即内存地址。
c.add(3.14);
c.add(new Object());
System.out.println(c);
}
}
package com.bjpowernode.day24.Collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest {
public static void main(String[] args) {
//创建集合对象
//Collection c = new Collection();//接口是抽象的,无法实例化(即无法new对象)
//多态,父类型的对象指向子类型的引用。
Collection c = new ArrayList();
//测试Collection的常用方法
c.add(1200);//自动装箱,int自动转为Integer类型,Integer x = new Integer(1200)集合中存放的是引用,即内存地址。
c.add(3.14);
c.add(new Object());
System.out.println("集合中的元素个数是"+c.size());
//清空集合
c.clear();
System.out.println("集合中的元素个数是"+c.size());
//
c.add("hello");
c.add("world");
c.add("浩克");
c.add("绿巨人");
c.add(1);
System.out.println("集合中的元素个数是"+c.size());
boolean flag = c.contains("绿巨人");
System.out.println(flag);//true
boolean flag2 = c.contains("绿巨人2");
System.out.println(flag2);//false
System.out.println(c.contains(1));//true
System.out.println("集合中的元素个数是"+c.size());
//删除某元素
c.remove(1);
System.out.println(c);
System.out.println("集合中的元素个数是"+c.size());
}
}
迭代器是个对象,迭代器对象有两个方法:hasNext()和next()
package com.bjpowernode.day24.Collection;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class CollectionTest02 {
public static void main(String[] args) {
//创建集合对象
Collection c = new HashSet();
//添加元素
c.add("abc");
c.add("def");
c.add(100);
c.add(new Object());
//创建迭代器迭代对象,以前都是用for循环迭代遍历,现在就是把for循环包装成一个对象。
Iterator it = c.iterator();
//使用方法判断是否有下一个元素
while (it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
}
}
迭代器是一个对象,上面的it就是迭代器对象,通过集合c调用iterator方法拿到一个迭代器对象。实际上it是一个引用,你保存的内存地址指向了后面的iterator对象。这个对象有相关的方法hasNext和next
package com.bjpowernode.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/*
关于集合的迭代/遍历
*/
public class CollectionTest03 {
public static void main(String[] args) {
// 创建集合对象
Collection c1 = new ArrayList(); // ArrayList集合:有序可重复
// 添加元素
c1.add(1);
c1.add(2);
c1.add(3);
c1.add(4);
c1.add(1);
// 迭代集合
Iterator it = c1.iterator();
while(it.hasNext()){
// 存进去是什么类型,取出来还是什么类型。
Object obj = it.next();
/*if(obj instanceof Integer){
System.out.println("Integer类型");
}*/
// 只不过在输出的时候会转换成字符串。因为这里println会调用toString()方法。
System.out.println(obj);
}
// HashSet集合:无序不可重复
Collection c2 = new HashSet();
// 无序:存进去和取出的顺序不一定相同。
// 不可重复:存储100,不能再存储100.
c2.add(100);
c2.add(200);
c2.add(300);
c2.add(90);
c2.add(400);
c2.add(50);
c2.add(60);
c2.add(100);
Iterator it2 = c2.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
}
}
虽然x没有加进去,但是contains方法底层调用了equals方法,所以比较的是内容,而不是内存地址,所以返回true。和字符串常量池没有关系。
错误理解:s1的内存地址是0x99,指向堆中的第一个String对象;x的内存地址是0x94,指向堆中的第3个String对象;s1和x中保存的内存地址不一样,所以不相等。
纠正:实际上虽然s1和x中保存的内存地址不一样,但是contains方法调用了equals方法,比较了内容,所以内容都是“abc”,所以相等。
package com.bjpowernode.day24.Collection;
import java.util.ArrayList;
import java.util.Collection;
//深入Collection集合的contains方法
public class CollectionTest04 {
public static void main(String[] args) {
Collection c = new ArrayList();
String s1 = "abc";
c.add(s1);
String s2 = "def";
c.add(s2);
System.out.println(c.size());//2
String x = new String("abc");
System.out.println(c.contains(x));//true
System.out.println(x.equals(s1));//true
}
}
package com.bjpowernode.day24.Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Objects;
public class CollectionTest05 {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建用户对象
User u1 = new User("jack");
User u2 = new User("jack");
//加入集合
c.add(u1);
//判断集合中是否包含u2
boolean flag = c.contains(u2);
System.out.println(flag);
Integer x = new Integer(10000);
c.add(x);
Integer y = new Integer(10000);
System.out.println(c.contains(y));
}
}
class User{
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
/**
* 是否重写equals方法
* @param o
* @return
*/
// @Override
// public boolean equals(Object o) {
// if (o == null || !(o instanceof User)) return false;
// if (o == this) return true;
// User u = (User)o;
// return u.name.equals(this.name);
// }
}
remove()方法底层也是会调用equals方法。看上面图中的代码。创建数组对象,创建s1字符串对象,将s1加入到数组中,然后创建s2字符串对象,现在数组中其实是只有s1一个对象,但是执行cc.remove()之后,remove会调用equals方法,取出s2其中的内容,即“hello”进行删除,实际上就是把“hello”字符串从数组中删去了。所以执行结束后数组为空。
package com.bjpowernode.day24.Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* 测试Collection常用方法
*/
public class CollectionTest00 {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//添加元素
c.add(1);
c.add(1);
c.add(12);
c.add(11);
c.add("Student");
c.add("Teacher");
String s = new String("Teacher");
boolean flag = c.contains("Teacher");
System.out.println(flag);
System.out.println(c.contains(s));//底层调用了equals方法,判断数组中有“teacher”字符串,返回true
Collection c2 = new ArrayList();
c2.add(1);
c2.add(1);
c2.add(12);
c2.add(11);
c2.add("Student");
c2.add("Teacher");
System.out.println(c.equals(c2));
System.out.println(c2.size());
c2.remove(s);
System.out.println(c2.size());
c2.clear();
System.out.println(c2.size());
Iterator it = c.iterator();//迭代器对象不能new,而是直接用“.”调用
while(it.hasNext()){
System.out.println(it.next());
}
}
}