关于java.util.Collection接口中常用的方法。
什么是集合?有什么用?
1、Collection中能存放什么元素?
没有使用“泛型”之前,Collection中可以存储Object的所有子类型
使用了“泛型”之后,Collection中只能存储某个具体的类型
集合后期学习“泛型”语法。目前先不用管。Collection中什么都能存,
只要是Object的子类型就行。(集合中不能直接存储基本数据类型,也不能存储
java对象,只能存储java对象的内存地址)
2、Collection中的常用方法
boolean add(Object e) 向元素中添加元素
int size() 获取集合中元素的个数
void clear() 清空集合
boolean contians(Object o) 判断当前集合中是否包含元素o,包含返回true,不包含返回false
boolean remove(Object o) 删除集合中的某个元素
boolean isEmpty() 判断该集合中元素的个数是否为0
Object[] toArray() 调用这个方法可以把集合转换成数组
public class CollectionTest01 {
public static void main(String[] args) {
// 创建一个集合对象
//Collection c = new Collection(); // 接口是抽象的,无法实例化。
// 多态
Collection c = new ArrayList();
c.add(100);//java5新特性,实际上是放进去了对象的内存地址,自动装箱 Integer i = new Integer(100);
c.add(new Object());
c.add(new String());
c.add(true);//自动装箱
//查看集合里有几个元素
System.out.println("集合中元素的个数是:" + c.size());
//清空集合元素
c.clear();
System.out.println("集合中元素的个数是:" + c.size());
//再次向集合中添加元素
c.add("hello");//实际上存储的是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("绿巨人1");
System.out.println(flag2);//false
//删除部分集合元素
c.remove(1);
System.out.println("集合中元素的个数是:" + c.size());
//判断集合是否为空
boolean flag3 = c.isEmpty();
System.out.println(flag3);//false
c.clear();
boolean flag4 = c.isEmpty();
System.out.println(flag4);//true
//往集合中添加元素
c.add("abc");
c.add("def");
c.add(100);
c.add("helloworld");
c.add(new Student());
//把集合中转换成数组
Object[] obj = c.toArray();
//把转换的数组进行遍历
for(int i=0;i<obj.length;i++){
Object o = obj[i];
System.out.println(o);
// System.out.println(0.toString());
}
}
}
class Student{
}
3、集合的遍历迭代:
public class CollectionTest02 {
public static void main(String[] args) {
//以下的遍历/迭代是所有Collection通用的一种方式
//在map集合中不能用。在所有的Collection以及子类中使用
//创建集合对象
Collection c = new ArrayList();
c.add("abc");
c.add("def");
c.add(100);
c.add("helloworld");
c.add(new Object());
//对集合Collection进行遍历/迭代
//第一步:获取集合对象的迭代器对象Iterator
Iterator it = c.iterator();
//第二步:通过以上获取的迭代器对象开始迭代/遍历集合
/*
* 以下两个方法是迭代器对象Iterator中的方法
* boolean hasnext()如果仍有元素可以迭代,则返回true
* Object next() 返回迭代的下一个元素
* */
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
}
}
public class CollectionTest03 {
public static void main(String[] args) {
//List存储有序可重复的元素,有序(存进去的顺序和取出来的顺序是一致的)
Collection c1 = new ArrayList();
c1.add(1);
c1.add(3);
c1.add(5);
c1.add(7);
c1.add(9);
c1.add(1);
Iterator it = c1.iterator();
while(it.hasNext()){
Object o = it.next();//存进去的是什么类型,取出的也是什么类型
/*if(obj instanceof Integer){
System.out.println("Integer类型");
}*/
// 只不过在输出的时候会转换成字符串。因为这里println会调用toString()方法。
System.out.println(o);
}
//set存储无序不可重复的元素,无序(存进去的顺序和取出的顺序不一致)
Collection c2 = new HashSet();
c2.add(100);
c2.add(50);
c2.add(400);
c2.add(300);
c2.add(200);
c2.add(600);
c2.add(100);
c2.add(300);
Iterator it1 = c2.iterator();
while(it1.hasNext()){
Object o = it1.next();
System.out.println(o);
}
}
}
4、深入Collection集合的contains方法:
contains方法是用来判断集合中是否包含某个元素的方法,
那么它在底层是怎么判断集合中是否包含某个元素的呢?
public class CollectionTest04 {
public static void main(String[] args) {
Collection c = new ArrayList();
String s1 = new String("abc");
c.add(s1);
String s2 = new String("def");
c.add(s2);
String s3 = new String("abc");
// c集合中是否包含x?结果猜测一下是true还是false?
System.out.println(c.contains(s3));//判断集合中是否存在"abc" true
}
}
5、测试contains方法 测试remove方法。
结论:存放在一个集合中的类型,一定要重写equals方法。
public class CollectionTest05 {
public static void main(String[] args) {
Collection c = new ArrayList();
User u1 =new User("jack");
c.add(u1);
// 没有重写equals之前:这个结果是false
//System.out.println(c.contains(u2)); // false
// 重写equals方法之后,比较的时候会比较name。
User u2 = new User("jack");
System.out.println(c.contains(u2));//true
Collection cc = new ArrayList();
String s1 = new String("jack");
cc.add(s1);
String s2 = new String("jack");
c.remove(s2);//remove底层调用equals方法进行比较
System.out.println(c.size());//0
}
}
class User{
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
@Override
// 重写equals方法
// 将来调用equals方法的时候,一定是调用这个重写的equals方法。
// 这个equals方法的比较原理是:只要姓名一样就表示同一个用户。
//java中默认的equals方法比较的是对象的内存地址
public boolean equals(Object o) {
if(o == null || !(o instanceof User)) return false;
if(this == o) return true;
User o1 = (User) o;
return this.name.equals(o1.name);
}
}
6、集合结构只要发生改变,迭代器必须重新获取。
public class CollectionTest06 {
public static void main(String[] args) {
Collection c = new ArrayList();
// 注意:此时获取的迭代器,指向的是那是集合中没有元素状态下的迭代器。
// 一定要注意:集合结构只要发生改变,迭代器必须重新获取。
// 当集合结构发生了改变,迭代器没有重新获取时,调用next()方法时:java.util.ConcurrentModificationException
Iterator it = c.iterator();
c.add("abc");
c.add("def");
c.add(100);
c.add("helloworld");
while(it.hasNext()){
// 编写代码时next()方法返回值类型必须是Object。
Object o = it.next();
System.out.println(o);
}
Collection cc = new ArrayList();
cc.add("abc");
cc.add("def");
cc.add("xyz");
Iterator it1 = cc.iterator();
while(it1.hasNext()){
Object o = it1.next();
//删除元素
//删除元素之后,集合的结构发生了变化,应该重新去获取迭代器
//但是,循环下一次的时候并没有重新获取迭代器,所以会出现异常:java,util,ConcurrentModificationException
//出异常的根本原因是:集合中元素删除了,但是没有更新迭代器(迭代器不知道集合变化)
//c.remove(o);//直接通过集合去删除元素,没有通知迭代器。(导致迭代器的快照和原来的集合状态不同)
//使用迭代器来删除可以吗?
//迭代器去删除时,会自动更新迭代器,并且更新集合(删除集合中的元素)
it1.remove();//删除的一定是迭代器指向的当前元素
System.out.println(o);
}
}
}