- Collection集合
- java.util.Collection是所有集合的顶级接口,集合与数组一样,可以保存一组元素,并且提供了操作元素的相关方法
- Collection下面有多种实现类
- 两个常见的子接口
- java.util.List;线性表,是可重复集合,并且有序的
- java.util.Set;不可重复的集合,大部分实现类是无序的
- 这里可重复指:集合中的元素是否可重复
- 判定重复元素的标准是依靠元素自身equals比较的结果,为true就认为是重复元素
- 注:集合不能存放基本类型,只能存放引用类型(存放的是对象),我们存放的基本类型,实际上是装箱了,存放的是包装类
- 集合的方法
- 增加元素:boolean add(E e);
- 获取元素个数:int size();
- 判断元素是否为0,注意:不是null:boolean isEmpty();
- 清空集合里的元素:void clera();
- 与equalse相关操作
- 包含:boolean contains(Object o);
- 删除:boolean remove(Object o);
public static void main(String[] args) {
Collection coll = new ArrayList();
/**
* boolean add(E e)
* 向当前集合中添加一个元素,当元素添加成功后返回true
*/
coll.add("a");
coll.add("b");
coll.add("c");
coll.add("d");
System.out.println(coll);
/*
int size();
返回当前元素的个数
*/
System.out.println(coll.size());
/*
boolean isEmpty();
是否是空集,true是,fasl否
注意:与null 不同,null是没有对象了,isEmpty是元素个数为0
*/
boolean isEmpty = coll.isEmpty();
System.out.println(isEmpty);
/*
清空集合:清空集合的所有元素
*/
coll.clear();
System.out.println(coll);
}
- 集合元素与equals相关操作
- ArrayList();允许重复
- hashSet();重写equals方法,就比较的是内容了,不重写比较的是地址
public class Point {
private int x;
private int y;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return x == point.x &&
y == point.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(new Point(1,2));
c.add(new Point(2,2));
c.add(new Point(3,2));
c.add(new Point(4,2));
c.add(new Point(5,2));
Point p = new Point(1,2);
c.add(p);
System.out.println(c); //重写equals方法后
//[Point{x=1, y=2}, Point{x=2, y=2}, Point{x=3, y=2}, Point{x=4, y=2}, Point{x=5, y=2}, Point{x=1, y=2}]
Collection c1 = new HashSet();
c1.add(new Point(1,2));
c1.add(new Point(2,2));
c1.add(new Point(3,2));
c1.add(new Point(4,2));
c1.add(new Point(5,2));
System.out.println(c1);
//[Point{x=3, y=2}, Point{x=2, y=2}, Point{x=1, y=2}, Point{x=5, y=2}, Point{x=4, y=2}]
Point p1 = new Point(1,2);
c1.add(p1);
System.out.println("未重写equals方法"+c1);
//未重写equals方法比的是地址,地址不重复[Point{x=2, y=2}, Point{x=5, y=2}, Point{x=4, y=2}, Point{x=1, y=2}, Point{x=1, y=2}, Point{x=3, y=2}]
System.out.println("重写equals方法"+c1);//重写equals方法后,比的是内容,不允许有重复元素
//[Point{x=3, y=2}, Point{x=2, y=2}, Point{x=1, y=2}, Point{x=5, y=2}, Point{x=4, y=2}]
/*
boolean contains(Object o)
判断集合是否包含给定元素
判断依据是看给定元素是否存在与集合元素存在equals比较为true的情况,存在则任务包含
注意:contains也依靠重写equals方法,否则比较的是地址
*/
Point p2 = new Point(1,2);
// c.add(p2);
boolean con = c.contains(p2);
System.out.println(con);//重写为true 不重写equals方法为false
/*
remove方法是从集合中删除给定元素,删除也是删除与给定元素equals比较为true的元素
如果集合中存在多个重复的元素,那么仅删除第一个元素
如果没有重写equals方法,则无法删除数据
*/
c.add(p2);
System.out.println(c);
//[Point{x=1, y=2}, Point{x=2, y=2}, Point{x=3, y=2}, Point{x=4, y=2}, Point{x=5, y=2}, Point{x=1, y=2}, Point{x=1, y=2}]
c.remove(p2);
//[Point{x=2, y=2}, Point{x=3, y=2}, Point{x=4, y=2}, Point{x=5, y=2}, Point{x=1, y=2}, Point{x=1, y=2}]
System.out.println(c);
}
- 集合只能存放引用类型,并且存放的是元素的引用,是地址
public static void main(String[] args) {
Point p = new Point(1,2);
Collection c = new ArrayList();
c.add(p);
System.out.println(p);//Point{x=1, y=2}
System.out.println(c);//[Point{x=1, y=2}]
p.setX(2);//修改的是对象,而集合存的是地址,p指向的对象内容改变了,集合存的是地址,指向的是同一个对象
System.out.println(p);//Point{x=2, y=2}
System.out.println(c);//[Point{x=2, y=2}]
}