Collection集合

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 
		}
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值