关于java.util.Collection接口(单个方式存储元素)
一、Collection中能存放什么元素?
—— 没有使用“泛型”之前,Collection中可以存储Object的所有子类型。
—— 使用“泛型”之后,Collection中只能存储某个具体的类型。
注:集合中不能直接存储基本数据类型,也不能直接存储Java对象,只能存储Java对象的内存地址
二、Collection接口中的常用方法
boolean
add(Object e):向集合中添加元素。int
size():获取集合中元素的个数。void
clear():清空集合中的所有元素。boolean
contains(Object o):判断集合中是否包含指定元素o,包含返回true。boolean
remove(Object o):删除集合中的某个指定元素。boolean
isEmpty():判断集合是否为空(元素个数是否为0),为空(0)返回true。Iterator
iterator():返回在此集合的迭代器对象。Object[]
toArray():把当前集合转换为数组 。
public class CollectionTest01 {
public static void main(String[] args) {
Collection c = new ArrayList();
//测试Collection接口中的常用方法
// add(Object e):向集合中添加元素.
c.add(1200);//集合不能直接存储基本数据类型,这里默认自动装箱,是Integer x = new Integer(1200);
c.add(3.14);//自动装箱
c.add(true);
c.add(new Object());
// size():获得集合中元素的个数.
System.out.println(c.size());//4
// clear():情况集合的所有元素.
c.clear();
System.out.println(c.size());//0
c.add("hallo");
c.add("world");
c.add("绿巨人");
c.add("浩克");
//contains(Object o):判断当前集合中是否包含指定元素o.
System.out.println(c.contains("绿巨人"));//true
System.out.println(c.contains("钢铁侠"));//false
//remove(Object o):删除集合中的某个元素.
c.remove("浩克");
System.out.println(c.size());//3
//isEmpty():判断当前集合是否为空.
System.out.println(c.isEmpty());//false
c.clear();
System.out.println(c.isEmpty());//true
c.add("hallo");
c.add("world");
c.add("绿巨人");
c.add("浩克");
//toArray():将当前集合转换为数组.
Object[] objects = c.toArray();
for (int i = 0; i < objects.length; i++) {
System.out.print(objects[i]+" ");
}//hallo world 绿巨人 浩克
}
}
三、Collection集合接口中的 iterator() 方法——迭代器
Iterator
iterator():获取集合对象的迭代器对象 Iterator- 迭代器对象 Iterator 中的方法:
Boolean
hasNext(): 如果仍有元素可以迭代,则返回true.Object
next(): 返回迭代的下一个元素void
remove():从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)注:以上的遍历方法/迭代方式,是所有Collection通用的一种方式,在Map集合中不能使用,在所有的Collection以及子类中使用
- 集合结构只要发生改变,迭代器必重新获取。
——获得的迭代器对象,迭代器用来遍历集合的,此时相当于对当前集合的状态拍了一个快照,而迭代器迭代的时候会参照这个快照进行迭代。如果集合结构发生了改变,没有重新获取迭代器,会发生异常:java.util.ConcurrentModificationException- Iterator中的remove方法与Collection中的remove方法的区别:
- 在迭代集合元素的过程中,要删除集合中的元素:
——不能调用Collection集合对象的remove方法删除元素(直接通过集合对象删除元素,迭代器未重新获取,即迭代器的元素未删除,会发生异常:java.util.ConcurrentModificationException)
——要调用Iterator迭代器对象的remove方法删除元素,用迭代器对象去删除时,会自动更新迭代器,并且更新集合(删除集合中的元素)。
public class CollectionTest02 {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//添加元素
c.add("abc");
c.add("def");
c.add(100);
c.add(new Object());
//对集合Collection进行遍历/迭代
//1.获取集合对象的迭代器对象Iterator
Iterator it = c.iterator();
/*
2.通过以上获取的迭代器对象开始迭代/遍历集合
1.Boolean hasNext(): 如果仍有元素可以迭代,则返回true.
2.Object next(): 返回迭代的下一个元素
3.void remove():从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)
*/
while (it.hasNext()) {
System.out.print(it.next()+" ");
}//abc def 100 java.lang.Object@1b6d3586
}
}
四、Collection集合接口中 contains 方法的深入
boolean
contains(Object o):判断集合中是否包含指定元素o.包含返回true,否则为false- contains方法是用来判断集合中是否包含某个指定元素的方法,那么它在底层是怎么判断集合中是否包含某个指定元素的呢?
——底层调用了equals方法进行对比,只要equals方法返回true,就表示包含这个元素。
——contains判断主要看底层equals方法是否相等,equals重写比较的是内容,未重写比较的是内存地址- 存放在一个集合中的类型,一定要重写equals方法
public class CollectionTest03 {
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);
System.out.println("集合中元素的个数:"+c.size());
//新建一个String对象
String x = new String("abc");
/*
判断c集合中是否包含x?
包含,原因是contains方法底层调用了equals进行了对比,
而String类重写了equals方法,所有比较的是内容,而不是
地址,所有c集合包含x
*/
System.out.println(c.contains(x));//true
}
}
五、Collection集合接口中 remove 方法的深入
boolean
remove(Object o):删除集合中的某个指定元素。- remove方法是用来判断集合中是否包含某个指定元素并删除该元素的方法。底层判断集合中是否包含某个指定元素与contains方法相同,都是调用了equals方法,如果equals方法返回true,则证明元素存在并且删除该元素。
- 存放在一个集合中的类型,一定要重写equals方法
public class CollectionTest04 {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建字符串对象s1
String s1 = new String("hello");
//往集合中添加元素
c.add(s1);
System.out.println(c.size());//1
//创建字符串对象s2,内容跟s1一样
String s2 = new String("hello");
/*
集合中没有s2这个对象内存地址,是否能删除s2?
首先,从remove方法的源代码中可以发现,底层调用了equals方法判断该集合是否
包含某个指定元素并删除该指定元素,而String类重写了equals方法,equals方法
比较的就是内容,而不是比较内存地址.
*/
System.out.println(c.remove(s2));//true
System.out.println(c.size());//0
}
}