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 ...
随机推荐
- 发现最新版百度Android 定位SDK v6.1.3 网络定位bug
对于百度地图已经实在忍无可忍了,实验室两年以前的一个项目用到了百度地图,以前师兄毕业了,我来维护这个破项目,百度地图推出新版本出来后,老版本的api不能用了,不能做到向下兼容吗?换掉少量的api也就算 ...
- 【记录】Http 状态码整理
Http状态码: 1XX:信息,服务器收到请求,需要请求者继续执行操作 2XX:成功,操作被成功接收并处理 3XX:重定向,需要进一步的操作以完成请求 4XX:客户端错误,请求包含语法错误或无法完成请 ...
- (转)Http和Https的区别
1.什么是Http Http中文叫做超文本传输协议, 它完成客户端到服务端等一系列运作流程 1.1 与http关系密切的协议: IP, TCP和DNS 负责传输的IP协议 IP协议数据网络层, IP协 ...
- 前端学习(十二)js数据类型(笔记)
选项卡: for循环 for(初始值,条件,自增){} for(var i=0; i<9;i++){} 几个按钮对应相同个内容!!! -------------------- ...
- 【JavaWeb项目】一个众筹网站的开发(八)后台页面详细设置
一.user.jsp改造 删除引入菜单 抽取导航栏 nav-bar.jsp,删除引入导航栏 删除引入main.jsp的到好烂 数据库里添加url 报错,url不对 没有/ url正确 action=& ...
- vs code的简单插件
Auto Close Tag VSCode Color Info Mithril Emmet support for VS Code Open HTML in Default Browser open ...
- vue中使用v-if判断数组长度是出现length报错
在vue中使用v-if判断数组的长度时出现报错 <el-collapse-item :key="index" v-if="data.childrens.length ...
- JAVA中 成员变量和和实例变量区别
java语言支持的变量类型 类变量:独立于方法之外的变量,用 static 修饰. 局部变量:类的方法中的变量. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. publi ...
- tp5使用jwt生成token,做api的用户认证
首先 composer 安装 firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...
- MySql命令行无法显示中文
好烦遇到了,遇到MySql命令行无法显示中文问题????? show variables like 'char%';//显示字符集 set names utf8;//设置字符集 describer t ...