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 ...
随机推荐
- 总结下awk基本用法
命令格式: awk '{commands} [{other commands}]' awk 'condition{commands} [{other commands}]' 如:awk '$4==&q ...
- python字典拼接方法
python的dict拼接有多种方法,其中一种很好用而且速度非常快: x = {**a, **b} 效果等价于: x = a.copy() x.update(b) 注意update()是没有返回值的 ...
- Metrics介绍和Spring的集成(转)
转自:http://blog.csdn.net/smallnest/article/details/38491507 http://colobu.com/2014/08/08/Metrics-and- ...
- KindEditor在eclipse里的配置方法
KindEditor介绍: kindEditor是一款国产富文本编辑器,类似fckeditor和目前比较流行的百度Ueditor.其产品官方网站为http://kindeditor.net/ Kind ...
- kNN算法和决策树
的整数. 下面看书上给出的实例: from numpy import * import operator def createdataset(): group=array([[1.0,1.1],[1. ...
- vue static和assets的区别
static和assets的区别,原理就在于webpack是如何处理静态资源的 assets 1)在vue组件中,所有模板和css都会被vue-html-loader和css-loader解析,并查找 ...
- 排序算法(一) 插入排序及Java实现
代码实现: public void insertionSort(List<T> list, Comparator<T> comparator) { for (int i=1; ...
- CSS:CSS 图片廊
ylbtech-CSS:CSS 图片廊 1.返回顶部 1. CSS 图片廊 以下是使用CSS创建图片廊: 图片廊 以下是使用 CSS 创建图片廊: 实例 <div class="res ...
- CSS:CSS Positioning(定位)
ylbtech-CSS:CSS Positioning(定位) 1.返回顶部 1. CSS Positioning(定位) position 属性指定了元素的定位类型. position 属性的四个值 ...
- nginx填坑补充(nginx根据上下文跳转ip或者域名)
今天有一个需求,要根据上下文调到不同的ip或域名地址,使用上下文做域名跳转的时候,proxy_pass域名后面一定要带‘/’否则会把nginx的上下文自动带入,这样就行. location ^~ /d ...