45. Collection
因为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的更多相关文章
- 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别
原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...
- Apache Mina实战
Mina介绍 Mina可以用于快速的开发基于网络通信的应用,特别是在开发手机端的游戏应用时,使用的较为普遍.本文简单介绍了一个用Mina搭建的一个简易讨论组,通过该应用可以对Mina的基本用法用途有个 ...
- 架构师系列文:通过Spring Cloud组件Hystrix合并请求
在前文里,我们讲述了通过Hystrix进行容错处理的方式,这里我们将讲述通过Hystrix合并请求的方式 哪怕一个URL请求调用的功能再简单,Web应用服务都至少会开启一个线程来提供服务,换句话说,有 ...
- MongoDb 物理位置应用实现
1代码实现 官方驱动2.7版本 1.1范围查找 /// <summary> /// 半径范围查找位置信息 /// </summary> /// <param name=& ...
- MongoDb C# 驱动操作示例
c#操作mongo数据库 驱动采用http://www.oschina.net/p/mongo-csharp-driver C#驱动的基本数据库连接,增删改查操作 //定义对象 public clas ...
- Python操作MongoDB文档数据库
1.Pymongo 安装 安装pymongo: pip install pymongo PyMongo是驱动程序,使python程序能够使用Mongodb数据库,使用python编写而成: 2.Pym ...
- Java后台面试之java基础
经典类概念性问题 1.java支持的数据类型有哪些?什么是自动拆装箱? 12.Java有哪些特性,举个多态的例子. 14.请列举你所知道的Object类的方法. 15.重载和重写的区别?相同参数不同返 ...
- Hive理论基础
数仓特征:面向主题,集成,非易失的,时变.数据仓库是在数据库已经大量存在的情况下,为了进一步挖掘数据资源.为了决策需要而产生的,不是所谓的"大型数据库". 数据库与数据仓库的区 ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
随机推荐
- iOS音频Error
最近在cocos应用上发现一个比较奇怪的bug,当应用正在调用录音的时候,按下home键回到后台,然后打开一个音乐播放器播放一个音乐,再回到游戏中游戏就会卡死. 之前录音和播放设置是下方: 播放: [ ...
- 【最新】docker 安装elasticsearch + kibana步骤【第二篇_kibana】
本文主要讲解Docker 安装 kibana并设置中文语言 [如果有需要安装elasticsearch 的朋友请移步博主第一篇文章] 话不多说! 第一步:docker 下载kibana docker ...
- 检查目录下 文件的权限-linux shell脚本
#!/bin/bash #History: #2019/07/23 Fsq #This Program will check Permissions on dir PATH=/bin:/sbin ...
- 单实例安装elastic和启动报错解决
下载 先到官网https://www.elastic.co/cn/downloads/past-releases/elasticsearch-5-5-2下载,我安装的是5.5.2的版本,其他版本直接访 ...
- mysql和sql server的按组连接
sqlserver : for xml path mysql :group_contact
- Codeforces Round #568 (Div. 2) G2. Playlist for Polycarp (hard version)
因为不会打公式,随意就先将就一下? #include<cstdio> #include<algorithm> #include<iostream> #include ...
- STL_set
#include <iostream> #include <set> #include <string> #include <cstdio> using ...
- PHP-两数相除
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- 防火墙---CentOS
1.查看防火墙状态 firewall-cmd --state 2.停止防火墙 systemctl stop firewalld.service 3.禁止开机启动防火墙 systemctl disabl ...
- Kafka速览
一.基本结构 三台机器组成的Kafka集群,每台机器启动一个Kafka进程,即Broker 向broker发送消息的客户端是Producer,拉取消息的客户端是Consumer Producer和Co ...