Collection集合:
简单理解就是数组和相关的算法
Collection是一个接口,定义了集合相关的操作方法,其有两个子接口:List和Set.
List:存放可重复集,队列
Set::数学集合,存放不可重复集,不需要有序
集合中存储的都是引用类型数组,并且集合只保存每个元素对应的引用,而非将元素对象本身存入集合。
add方法:
Collection定义了一个add方法用于向集合中添加新元素。该方法会将给定的元素添加进集合,若添加成功则返回true,否则返回false。
public void testAdd() {
Collection<String> c=new ArrayList<String>();
System.out.println(c);//[]
c.add("a");
c.add("b");
c.add("c");
System.out.println(c);//[a, b, c]
}
public void testRef() {
Cell c1=new Cell(3,4);
Cell c2=new Cell(5,6);
Collection<Cell> cells=new ArrayList<Cell>();//创建一个空集合(创建一个空数组)
//<Cell>泛型,约定集合(数组)中只能存放Cell
//将元素添加到集合中,将引用c1添加到集合中
cells.add(c1);
cells.add(c2);
//集合中有2个元素,本质上持有的是引用
System.out.println(cells);//[(3,4), (5,6)]
c1.row++;
System.out.println(cells);//[(4,4), (5,6)]
}
class Cell{
int row,col;
public Cell(int row,int col) {
this.row=row;
this.col=col;
}
public String toString() {
return "("+row+","+col+")";
}
// public boolean equals(Object obj) {
// if(obj==null) {return false;}
// if(this==obj) {return true;}
// if(obj instanceof Cell) {
// Cell o=(Cell)obj;
// return row==o.row&&col==o.col;
// }
// return false;
// }
}
contains方法:就相当于数学中的属于运算
该方法用于判断给定元素是否被包含在集合中,若包含在集合中则返回true,否则返回false。
这里需要注意的是,集合在判断元素是否被包含在集合中是根据元素的equals()方法进行比较后的结果。
public void testContains() {
Collection<String> cards=new ArrayList<String>();
System.out.println(cards);//[]
cards.add("梅花3");
cards.add("红桃6");
cards.add("黑桃2");
cards.add("大王");
System.out.println(cards);//[梅花3, 红桃6, 黑桃2, 大王]
//有”大王“吗?就是在全部集合元素中查询是否包含(contains)”大王“这个对象
boolean found=cards.contains("大王");
System.out.println(found);//true
boolean found1=cards.contains("小王");
System.out.println(found1);//false
}
public void testContains2() {
Collection<Cell> cells=new ArrayList<Cell>();
cells.add(new Cell(0,4));
cells.add(new Cell(0,3));
cells.add(new Cell(0,5));
cells.add(new Cell(1,4));
Cell cell=new Cell(1,4);
System.out.println(cells);//[(0,4), (0,3), (0,5), (1,4)]
System.out.println(cell);//(1,4)
//contains会调用每个对象的equals方法比较是否相等
System.out.println(cells.contains(cell));//true,因为Cell类重写了equals方法,所以会是true
//如果Cell类没有重写equals方法,就相当于==,
//比较的是cells.add(new Cell(1,4));和Cell cell=new Cell(1,4);所引用的地址是否相等,此时结果就是false
}
isEmpty函数:
booleanisEmpty():用于判断当前集合是否为空集,是空集返回结果为true,否则返回结果为false。
size函数:
intsize():用于返回当前集合中元素的个数。
clear函数:
voidclear():用于清空当前集合。
public void testSizeAndClearAndIsempty() {
Collection<String> c=new HashSet<String>();//HashSet是一个set集合,不能有重复元素
System.out.println(c.isEmpty());//空集合,所以结果是true
c.add("C");
c.add("java");
c.add("php");
c.add("C#");
c.add("php");//重复添加了,但是set是没有重复元素的,所以只能添加到集合中一个
System.out.println("isEmpty:"+c.isEmpty()+",size:"+c.size());//isEmpty:false,size:4
c.clear();
System.out.println("isEmpty:"+c.isEmpty()+",size:"+c.size());//isEmpty:true,size:0
}
addAll函数:相当于并集,是两个集合的关系
该方法需要我们传入一个集合,并将该集合中的所有元素添加到当前集合中。
containsAll:相当于包含,是两个集合的关系
该方法用于判断当前集合是否包含给定集合中的所有元素,若包含则返回true。
public void testaddAllAndcontainsAll() {
Collection<String> c1=new ArrayList<String>();//list是有序的,可以重复
c1.add("桃子");
c1.add("苹果");
Collection<String> c2=new HashSet<String>();//set集是无序的,元素不可以重复
c2.add("香蕉");
c2.add("甜瓜");
System.out.println(c1);//[桃子, 苹果]
System.out.println(c2);//[香蕉, 甜瓜]
c2.addAll(c1);//将c1合并到c2中
System.out.println(c2);//[桃子, 香蕉, 苹果, 甜瓜]
Collection<String> c3=new ArrayList<String>();
c3.add("桃子");
c3.add("香蕉");
System.out.println(c3);//[桃子, 香蕉]
System.out.println(c2.containsAll(c3));//判断c2是否包含c3中的所有元素,true
System.out.println(c1.containsAll(c3));//判断c1是否包含c3中的所有元素,flase
}
retainAll函数:
该方法返回两个集合的交集。
removeAll函数:
该方法返回两个集合的差集。
public void testretainsAllAndremoveAll() {
Collection<String> c1=new ArrayList<String>();//list是有序的,可以重复
c1.add("桃子");
c1.add("苹果");
Collection<String> c2=new HashSet<String>();//set集是无序的,元素不可以重复
c2.add("香蕉");
c2.add("甜瓜");
System.out.println(c1);//[桃子, 苹果]
System.out.println(c2);//[香蕉, 甜瓜]
c2.addAll(c1);//将c1合并到c2中
System.out.println(c2);//[桃子, 香蕉, 苹果, 甜瓜]
Collection<String> c3=new ArrayList<String>();
c3.add("桃子");
c3.add("香蕉");
System.out.println(c3);//[桃子, 香蕉]
c3.retainAll(c2);//在c3中保留c2和c3中的公共部分,交集
System.out.println(c3);//[桃子, 香蕉]
c2.removeAll(c3);//在c2中扣除c3中的元素,差集
System.out.println(c2);//[苹果, 甜瓜]
}
Iterator迭代器:
利用迭代器可以将集合中的每一个元素逐一处理。Iterator接口一般都是用“内部类”实现的。
迭代器中的两个函数:游标的初始位置是第一个元素之前
hasNext():检查当前游标是否有下一个引用
next():移动游标,返回引用
两个函数要一起使用,模式化的写法。
Iterator<String> it=c.iterator();//迭代器
while(it.hasNext()){//检查游标是否有下一个引用
String str=it.next();//移动游标取出下一个
}
public void testHasNextAndNext() {
Collection<String> c=new HashSet<String>();
c.add("java");
c.add("cpp");
c.add("php");
c.add("c#");
Iterator<String> it=c.iterator();//迭代器
while(it.hasNext()) {//检查游标是否有下一个引用
String str=it.next();//移动游标取出下一个
System.out.println(str);
}
}
remove删除集合中的元素:
当迭代时,修改了(删除或者添加)集合的内容,集合将出现并发修改异常。在使用迭代器遍历集合时,不能通过集合的remove方法删除集合中的元素,否则会抛出异常。可以通过使用迭代器自身提供的remove方法来删除通过next()迭代出来的元素。i.remove();//安全的删除正在迭代的对象。这里需要注意的是,在调用remove()方法前必须通过迭代器的next()方法迭代过元素,那么删除的就是这个元素。并且不能再次调用remove方法,除非再次调用next()后方可再次使用。
public void testIterator() {
Collection<String> c=new ArrayList<String>();
c.add("好蛋");
c.add("坏蛋");
c.add("鸡蛋");
c.add("鸭蛋");
Iterator<String> i=c.iterator();
while(i.hasNext()) {//检查游标是否有下一个
//egg代表集合中每一个元素
String egg=i.next();
System.out.println(egg);
if(egg.equals("坏蛋")) {
//c.remove(egg);//会出现并发修改异常
i.remove();//安全的删除正在迭代的对象
}
}
System.out.println(c);//[好蛋, 鸡蛋, 鸭蛋],删除了坏蛋
}
增强型for循环:
Java5.0之后推出了一个新的特性,增强for循环,也成为新循环。该循环不同于传统循环的工作,其只用于遍历集合或数组,并且不能删除元素。
for(元素类型 e : 集合或数组){
循环体
}
新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式,所以新循环本质上是迭代器。
public void testFor() {
Collection<String> c=new HashSet<String>();
c.add("C");
c.add("java");
c.add("php");
for(String str : c) {
System.out.print(str.toUpperCase()+" ");//C JAVA PHP
}
}