因为Collection是接口我们不能直接实例化,所以我们下面的例子都是采用多态实例化实现类ArrayList类

1. Collection中常用方法

添加:
    add()     添加一个元素到集合中
    addAll()   把一个集合中的所有元素添加到指定的集合中(指定集合为调用此方法,参数为要被添加的集合)
 
 
删除:
    clear()     删除集合中的所有元素
    remove()     删除集合中指定元素
    removeAll()   删除2个集合中的交集
    retainAll()   保留2个集合中的交集,其它删除
    
判断:
    contains()    查看集合中是否存在此元素,如果有返回true否者返回false
    containsAll()  查看一个集合中是否存在指定集合的所有元素,有返回true否false(指定集合为调用此方法,参数为要被添加的集合)
    isEmpty()    查看元素是否为空,是true否false

查看:
    size()     查看集合中元素的长度(注意:并不是集合容器的长度)

迭代器:
    toArray()    返回一个object数组,数组里面包含集合的所有元素

    iterator()    下一章迭代器会讲

 

2.下面是一些不好理解的方法实例代码

allAll   添加一个元素到集合中

public static void main(String[] args) {
//创建两个个Collection实体类的对象
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
//往集合中添加元素
list1.add("张三");
list1.add("李四");
list1.add("王五");
list2.add("张三");
list2.add("狗娃");
list2.add("狗蛋");
System.out.println(list1);
System.out.println(list2);
//addAll()把list2中的所有元素添加到list1中
list1.addAll(list2);
System.out.println(list1); }

removeAll()   删除2个集合中的交集

public static void main(String[] args) {
//创建两个个Collection实体类的对象
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
//往集合中添加元素
list1.add("张三");
list1.add("李四");
list1.add("王五");
list2.add("张三");
list2.add("狗娃");
list2.add("狗蛋");
System.out.println(list1);
System.out.println(list2);
//removeAll()删除2个集合中的交集
list1.removeAll(list2);
System.out.println(list1);
}

retainAll()   保留2个集合中的交集,其它删除

public static void main(String[] args) {
//创建两个个Collection实体类的对象
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
//往集合中添加元素
list1.add("张三");
list1.add("李四");
list1.add("王五");
list2.add("张三");
list2.add("狗娃");
list2.add("狗蛋");
System.out.println(list1);
System.out.println(list2);
//removeAll()删除2个集合中的交集
list1.retainAll(list2);
System.out.println(list1);
}

containsAll()  查看一个集合中是否存在指定集合的所有元素,有返回true否false(指定集合为调用此方法,参数为要被添加的集合)

public static void main(String[] args) {
//创建两个个Collection实体类的对象
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
//往集合中添加元素
list1.add("张三");
list1.add("李四");
list1.add("王五");
list2.add("张三");
list2.add("狗娃");
list2.add("狗蛋");
System.out.println(list1);
System.out.println(list2);
//removeAll()删除2个集合中的交集
System.out.println(list1.containsAll(list2));
}

contains()    查看集合中是否存在此元素,如果有返回true否者返回false

上面我们都是添加的是字符串,现在我们来添加一个对象

需求:身份证例子(在现实生活中,只要我们的身份证id一样,那么不管名字是否一样,那都是一个人)

class People{
int id;
String name; public People(int id , String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "{身份证:"+id+" 姓名:"+name+"}";
}
} public class Demo1 { public static void main(String[] args) {
//创建两个个Collection实体类的对象
Collection list1 = new ArrayList();
list1.add(new People(1001,"张三"));
list1.add(new People(1002,"李四"));
list1.add(new People(1003,"王五"));
System.out.println(list1);//打印集合中的元素
//查询是否存在存在身份证为1001的人
System.out.println(list1.contains(new People(1001,"张三")));
}
}

这时我们是不是感到很奇怪,明明存在我要查找的人啊!为什么返回false呢?

我们来看看contains方法的源代码:

这个是ArrayList类中的contains方法源代码

可以看出这个是调用了ArrayList类的indexOf方法,接受的参数是我们Object类型的数据(多态)

public boolean contains(Object o) {
return indexOf(o) >= 0;
}

这个是indexOf方法的源代码

我们发现这个是调用了equals方法进行比较的,而我们根本没有重写Object的equals方法,所以调用的是Object的equals方法比较的是内存地址,我们的参数相当于又重新创建了一个对象,所以返回false

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的equals方法

最终代码如下:

class People{
int id;
String name; public People(int id , String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "{身份证:"+id+" 姓名:"+name+"}";
}
@Override
public boolean equals(Object obj) {
//因为是多态,所以这里我们要强转
People p = (People)obj;
if(p.id == this.id) {
return true;
}else {
return false;
} }
} public class Demo1 { public static void main(String[] args) {
//创建两个个Collection实体类的对象
Collection list1 = new ArrayList();
list1.add(new People(1001,"张三"));
list1.add(new People(1002,"李四"));
list1.add(new People(1003,"王五"));
System.out.println(list1);//打印集合中的元素
//查询是否存在存在身份证为1001的人
System.out.println(list1.contains(new People(1001,"老刘")));
}
}

toArray()   返回一个object数组,数组里面包含集合的所有元素

public static void main(String[] args) {
Collection list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
System.out.println(list);
Object[] arr = list.toArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

45. Collection的更多相关文章

  1. 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

    原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...

  2. Apache Mina实战

    Mina介绍 Mina可以用于快速的开发基于网络通信的应用,特别是在开发手机端的游戏应用时,使用的较为普遍.本文简单介绍了一个用Mina搭建的一个简易讨论组,通过该应用可以对Mina的基本用法用途有个 ...

  3. 架构师系列文:通过Spring Cloud组件Hystrix合并请求

    在前文里,我们讲述了通过Hystrix进行容错处理的方式,这里我们将讲述通过Hystrix合并请求的方式 哪怕一个URL请求调用的功能再简单,Web应用服务都至少会开启一个线程来提供服务,换句话说,有 ...

  4. MongoDb 物理位置应用实现

    1代码实现 官方驱动2.7版本 1.1范围查找 /// <summary> /// 半径范围查找位置信息 /// </summary> /// <param name=& ...

  5. MongoDb C# 驱动操作示例

    c#操作mongo数据库 驱动采用http://www.oschina.net/p/mongo-csharp-driver C#驱动的基本数据库连接,增删改查操作 //定义对象 public clas ...

  6. Python操作MongoDB文档数据库

    1.Pymongo 安装 安装pymongo: pip install pymongo PyMongo是驱动程序,使python程序能够使用Mongodb数据库,使用python编写而成: 2.Pym ...

  7. Java后台面试之java基础

    经典类概念性问题 1.java支持的数据类型有哪些?什么是自动拆装箱? 12.Java有哪些特性,举个多态的例子. 14.请列举你所知道的Object类的方法. 15.重载和重写的区别?相同参数不同返 ...

  8. Hive理论基础

    数仓特征:面向主题,集成,非易失的,时变.数据仓库是在数据库已经大量存在的情况下,为了进一步挖掘数据资源.为了决策需要而产生的,不是所谓的"大型数据库".   数据库与数据仓库的区 ...

  9. MongoDB学习笔记:Python 操作MongoDB

    MongoDB学习笔记:Python 操作MongoDB   Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...

随机推荐

  1. 【教程】CentOS 7安装 最新版本Docker

    博主最近需要安装Docker,步骤如下: Docker安装官方地址:https://docs.docker.com/install/linux/docker-ce/centos/ 以下命令都是在roo ...

  2. 转。Nas配置。想找原版没找到,全是转载的,也没注出处,无语。

    随着家用宽带的不断提速和高清电影的普及外带单反的家庭占有率越来越搞,仅靠台式机里那几块硬盘越来越不够用了. 简单的计算了一下,家里的台式机上2T的容量(1T+640G+320G)已经接近于80%满,外 ...

  3. 使用Maven进行依赖管理和项目构建

    什么是Maven 1 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包. 2 项目的构建:内置很多的插件与 ...

  4. 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest E:Black or White

    这道题可以比较容易看出是线性DP.设dp[i]代表把前i个格子刷成目标状态的最小步数. 写出状态转移方程 dp[i]=min( dp[j]+calc(j+1,i) ) (i-j<=k) calc ...

  5. Codeforces 351C Jeff and Brackets 矩阵优化DP

    题意:你要在纸上画一个长度为n * m的括号序列,第i个位置画左括号的花费是a[i % n], 画右括号的花费是b[i % n],问画完这个括号序列的最小花费.n <= 20, m <= ...

  6. CF734E Anton and Tree

    \(\mathtt{CF734E}\) \(\mathcal{Description}\) 给一棵\(n(n\leq200000)\)个节点的树,每个点为黑色或白色,一次操作可以使一个相同颜色的连通块 ...

  7. 1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写

    总结: 1. 在继承上, new/override没区别 2. 在多态上,new不支持多态,override支持 在C#中改变类中相同名称的方法的实现过程中有三种方式:重载.重写和覆盖. 重载:指具有 ...

  8. java静态代理及动态代理(学习示例)

    1.接口 public interface Channel { void send(); } 2.实现类(可以为各种不同实现) public class ChannelImpl implements ...

  9. Cross platform

    值得学习的C/C++语言开源项目 (1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html ...

  10. SQL 更新

    SQL UPDATE 语句(更新表中的记录) UPDATE 语句用于更新表中的现有记录. SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录. SQL UPDATE 语法 UPDA ...