Collection
所有集合的顶层接口,不能被实例化。
-------| Collection 单例集合的跟接口。
----------| List 如果是实现了List接口的集合类,具备的特点: 有序,可重复。
----------| Set 如果是实现了Set接口的集合类,具备特点: 无序,不可重复。
集合与数组相比存在的优势?
- 相对数组而言集合并没有长度限制
- 相对数组而言集合并没有类型限制
Collection中常用的函数
增加
add(E e) 添加成功返回true,添加 失败返回false.
addAll(Collection c) 把一个集合的元素添加到另外一个集合中去。
class Person{
private String name;
private String cardId;
public Person() {
}
public Person(String cardId,String name) {
this.name = name;
this.cardId = cardId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
@Override
public String toString() {
return "id:"+this.cardId+",name:"+this.name;
}
}
public class Test {
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add(new Person("1","张三"));
c1.add(new Person("2","李四"));
c1.add(new Person("3","王二"));
boolean res = c1.add(new Person("4","麻子"));
System.out.println(res);
Iterator iterator = c1.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("======================================");
Collection c2 = new ArrayList();
c2.addAll(c1);
c2.add(new Person("5","大刀王五"));
Iterator iterator2 = c2.iterator();
while (iterator2.hasNext()){
System.out.println(iterator2.next());
}
}
}
结果如下:
true
id:1,name:张三
id:2,name:李四
id:3,name:王二
id:4,name:麻子
======================================
id:1,name:张三
id:2,name:李四
id:3,name:王二
id:4,name:麻子
id:5,name:大刀王五
删除
clear() 从此集合中删除所有元素
remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)
removeAll(Collection c) 删除两个集合的交集元素
retainAll(Collection c) 保留两个集合的交集元素,其他的元素一并删除。
class Person{
private String name;
private String cardId;
public Person() {
}
public Person(String cardId,String name) {
this.name = name;
this.cardId = cardId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
@Override
public String toString() {
return "id:"+this.cardId+",name:"+this.name;
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("1","张三");
Person p2 = new Person("2","李四");
Person p3 = new Person("3","王二");
Person p4 = new Person("4","二狗");
Collection c1 = new ArrayList();
c1.add(p1);
c1.add(p2);
c1.add(p3);
//clear
// c1.clear();
// System.out.println(c1.size());
Collection c2 = new ArrayList();
c2.add(p1);
c2.add(p2);
c2.add(p3);
//执行remove
// c2.remove(p3);
// c2.removeAll(c1);
//执行retainAll
c2.add(p4);
c2.retainAll(c1);
Iterator i2 = c2.iterator();
while (i2.hasNext()){
System.out.println(i2.next());
}
}
}
查看
size() 返回此集合中的元素数
判断
isEmpty() 如果此集合不包含元素,则返回 true
contains(Object o) 如果此集合包含指定的元素,则返回 true 。
containsAll(Collection<?> c) 如果此集合包含指定 集合中的所有元素,则返回true。
class Person{
private String name;
private String cardId;
public Person() {
}
public Person(String cardId,String name) {
this.name = name;
this.cardId = cardId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
@Override
public String toString() {
return "id:"+this.cardId+",name:"+this.name;
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("1","张三");
Person p2 = new Person("2","李四");
Person p3 = new Person("3","王二");
Person p4 = new Person("4","二狗");
Collection c1 = new ArrayList();
c1.add(p1);
c1.add(p2);
c1.add(p3);
Collection c2 = new ArrayList();
c2.add(p1);
c2.add(p2);
c2.add(p3);
c2.add(p4);
System.out.println(c2.contains(p4));//true
System.out.println(c2.containsAll(c1));//true
}
}
调用contains时我们发现,重写了equals后下面代码访问true,不重写返回false,代码如下:
class Person{
private String name;
private String cardId;
public Person() {
}
public Person(String cardId,String name) {
this.name = name;
this.cardId = cardId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
@Override
public String toString() {
return "id:"+this.cardId+",name:"+this.name;
}
@Override
public boolean equals(Object obj) {
Person p = (Person)obj;
return p.cardId == this.cardId;
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("1","张三");
Person p2 = new Person("2","李四");
Person p3 = new Person("3","王二");
Person p4 = new Person("4","二狗");
Collection c1 = new ArrayList();
c1.add(p1);
c1.add(p2);
c1.add(p3);
System.out.println(c1.contains(new Person("4","二狗")));
}
按住ctrl键点击contains进入List.class是一个接口,其中有的一个抽象方法 boolean contains(Object o);他实际上调用的contains方法是ArrayList类中重新的contains方法
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
点击indexOf进入ArrayList类中indexOf方法
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
我们看到Object o会调用equals方法,但是Person中并没有重新equals方法,所以最后调用的是Object中的equals方法,我们知道Object的equals比较的是内存地址,所以当你重写了Person的equals与不重写该函数返回值在这中情况下肯定不是一样的
迭代
toArray() 返回一个包含此集合中所有元素的数组。
iterator() 返回此集合中的元素的迭代器。
迭代器
迭代器的作用:就是用于抓取集合中的元素。
迭代器的方法:
- hasNext() 问是否有元素可遍历。如果有元素可以遍历,返回true,否则返回false 。
- next() 获取元素
- remove() 移除迭代器最后一次返回 的元素。
使用时常见报错
NoSuchElementException 没有元素的异常,出现的原因: 没有元素可以被迭代了。
class Demo2 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("狗娃");
c.add("狗剩");
c.add("铁蛋");
c.add("美美");
//遍历集合的元素------>方式一: 可以使用toArray方法。
Object[] arr = c.toArray(); // toArray() 把集合 的元素存储到一个 Object的数组中 返回。
for(int i = 0 ; i<arr.length ; i++){
System.out.println(arr[i]);
}
System.out.println("================================");
//要求使用iterator迭代器遍历。
Iterator it = c.iterator(); //返回一个迭代器 疑问:iterator()方法返回的是一个接口类型,为什么接口又可以调用方法可以使用呢? iterator 实际 上返回的是iterator接口的实现类对象。
//清空集合 的元素
while(it.hasNext()){
System.out.println(it.next());
//it.remove();
}
}
}
迭代器的原理