Collection中的contains()方法和remove()方法。

boolean contains(Object o);该方法是用来判断集合中是否包含某个元素,若包含,返回true,不包含返回false。结合以下代码来看。

import java.util.*;
public class CollectionTest03{
public static void main(String[] args){
   Collection c=new ArrayList();
   Integer i1=new Integer(10);
   c.add(i1);    //true
   System.out.println(c.contains(i1));
   Integer i2=new Integer(10);
   //contains()方法底层调用的是equals()方法
   c.contains(i2);    //true
   System.out.println(c.contains(i1));    Manager m1=new Manager(100,"张三");
   c.add(m1);
   System.out.println(c.contains(m1));   //true
   Manager m2=new Manager(100,"张三");
   System.out.println(c.contains(m2));   //false
} /* 底层源码
public boolean contains(Object i2) {
       return indexOf(i2) >= 0;   //indexOf(i2) >= 0; 结果为true or false,即 return true(or false)
    }
public int indexOf(Object i2) {
   if (i2 == null) {
   //i2为空值时与ArrayList中的元素进行比较
       for (int i = 0; i < size; i++)
           if (elementData[i]==null)
               return i;    //此时i>=0
   } else {   
     //i2不为空值时与ArrayList中的元素进行比较
       for (int i = 0; i < size; i++)
           if (o.equals(elementData[i]))
               return i;    //i>=0
          }
   return -1;  

*/
}
class Manager{
 int no;
 String name;
 Manager(int no,String name){
   this.no=no;
   this.name=name;
 }
}

运行后输出:

true
true
true
false

上述代码中,

1.创建集合对象c,之后Integer i1=new Integer(10);new出一个Integer类型的对象,使用c.add(i1);将i1添加到集合c中,最后使用c.contains(i1);判断集合c中是否包含i1并将结果打印。

2.Integer i2=new Integer(10);再new出一个Integer类型的对象i2,并且和i1相同,System.out.println(c.contains(i2));判断集合c是否包含i2并将结果打印,注意,这里没有第一步中的c.add()方法,但结果依旧输出true。这是因为contains()方法底层调用的了equals()方法。这里我们打开jdk的帮助文档来看底层的源码。

public boolean contains(Object i2) {
       return indexOf(i2) >= 0;   //indexOf(i2) >= 0; 结果为true or false,即 return true(or false)
    }
public int indexOf(Object i2) {
   if (i2 == null) {
   //i2为空值时与ArrayList中的元素进行比较
       for (int i = 0; i < size; i++)
           if (elementData[i]==null)
               return i;    //此时i>=0
   } else {   
     //i2不为空值时与ArrayList中的元素进行比较
       for (int i = 0; i < size; i++)
           if (i2.equals(elementData[i]))
               return i;    //i>=0
          }
   return -1;  
}

从底层源码中可以看出,contains()方法中调用了indexOf()方法,

public boolean contains(Object i2) {

return indexOf(i2) >= 0;

}

indexOf(i2) >= 0; i>=0时,结果为true,否则为false,即 return true(or false)

接下来具体看看indexOf()方法,i2可能为空值,也可能不为空,当i2为空值时,与Arraylist中的元素进行比较,使用for循环对ArrayList中的元素进行遍历,若elementData[i]==null,即在ArrayList中找到了与i2一样都为null的元素,则返回此时ArrayList中的索引,我们知道索引都是>=0的,即contains()方法中return true.当i2不为空值时,仍然使用for循环进行遍历ArrayList()中的元素,如果发现i2与ArrayList中的某个元素相等,则返回ArrayList中该元素的索引下标,同理,contains()方法中return true。如果这两种情况都不满足,也就意味着i2与ArrayList中的元素都不相等,这时return -1,contains()方法中return false。

3.接下来我们自定义一个Manager的类,Manager m1=new Manager(100,"张三");创建一Manager类型的的对象m1,c.add(m1);将m1添加到ArrayList中,使用contains()方法判断集合c中是否包含m1;接着Manager m2=new Manager(100,"张三");new出一个对象m2,添加到集合c中,使用contains()方法进行判断时输出false,这时因为m1和m2都是new出来的对象,它们的内存地址不相同,Manager类中没有重写equals()方法,所以进行判断时比较的还是内存地址,返回结果为false。

4.如果要在Manager类中比较内容而不是内存地址,我们可以这样重写Manager中的equals()方法。

public boolean equals(Object o){
 if (this == o) return true;
   if (o instanceof Manager){
   Manager m = (Manager)o;
   if(m.no==this.no && m.name==this.name){
     return true;
   }
 }
   return false;  
 }

这里要注意:存储在集合中的元素应该重写equals()方法。重写Manager中的equals()方法后System.out.println(c.contains(m2));打印出结果为true。

接下来看remove()方法。

boolean remove(Object o);  删除集合中某个元素

看以下代码:

import java.util.*;
public class CollectionTest04{
 public static void main(String[] args){
   Collection c=new ArrayList();
   Integer i1=new Integer(10);
   c.add(i1);
   System.out.println(c.size());  //1
   Integer i2=new Integer (10);
   c.remove(i2);
   System.out.println(c.size());  //0
   Manager m1=new Manager(100,"张三");
   c.add(m1);
   Manager m2=new Manager(100,"张三");
   c.remove(m2);
   System.out.println(c.size());   //0
   }
}
class Manager{
 int no;
 String name;
 Manager(int no,String name){
   this.no=no;
   this.name=name;
 }
 public boolean equals(Object o){
 if (this == o) return true;
   if (o instanceof Manager){
   Manager m = (Manager)o;
   if(m.no==this.no && m.name==this.name){
     return true;
   }
 }
   return false;  
 }
}

理解了contains()方法中讲的知识点,remove()中的应该很容易就能判断出该输出什么,这里就不详细地再进行讲解了。不过提醒一点,如果数据在[-128~127]之间,Java中引入了一个“整型常量池”,在方法区中。该整型常量池只存储-128~127之间的数据。Integer i5=127;这个程序不会在堆中创建对象,会直接在整型常量池中拿。这是之前讲的内容,忘记了的翻到之前的《Java 包装类详解》再复习一遍。

深入remove()方法。

import java.util.*;
public class CollectionTest05{
 public static void main(String[] args){
 Collection c=new ArrayList();
 c.add(1);
 c.add(2);
 c.add(3);
 Iterator it=c.iterator();
 while (it.hasNext()){
   it.next();
   it.remove();  //通过迭代器的remove()方法删除元素
 }
 System.out.println(c.size());  //0
 }
}

以上程序为使用迭代器的remove()方法删除,当使用集合的remove()方法删除时,如下:

import java.util.*;
public class CollectionTest05{
 public static void main(String[] args){
 Collection c=new ArrayList();
 c.add(1);
 c.add(2);
 c.add(3);
 Iterator it=c.iterator();
 while (it.hasNext()){
   Object element=it.next();
   c.remove(element);  //使用集合的remove()方法删除
 }
 System.out.println(c.size());
 }
}

编译通过,运行后报错:

Exception in thread "main" java.util.ConcurrentModificationException
 at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
 at java.util.ArrayList$Itr.next(Unknown Source)
 at CollectionTest05.main(CollectionTest05.java:25)

这是因为使用集合Collection的remove()方法进行删除时,c.remove(element);也就是删除一个元素之后,这个集合已经变了,再进行删除元素的动作时,必须重新获取改变之后的集合的迭代器,否则运行后报异常。所以推荐使用迭代器的remove()方法进行元素的删除。

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

Java 集合类常用方法的更多相关文章

  1. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

  2. java集合类学习心得

    java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...

  3. 针对Java集合类的小总结

    Java集合类包位于java.util下,有很多常用的数据结构:数组.链表.队列.栈.哈希表等等.了解不同的集合类的特性在开发过程中是比较重要的,感谢@兰亭风雨的专栏分析,这里我也根据自己的理解做轻度 ...

  4. Java集合类--温习笔记

    最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...

  5. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  6. 摘抄转载前辈们的Java集合类总结

    本文摘自 Blue Sky:http://www.cnblogs.com/hubcarl JAVA 集合类介绍和使用 类关系示意图Iterable(接口) │ └--Collection (接口) ├ ...

  7. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  8. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...

  9. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

随机推荐

  1. php 中将完整的年月日时分秒的时间转换成 年月日的形式

    strtotime() 函数将任何英文文本的日期或时间描述解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数), 将完整的时间格式转换成时间撮的形式,再去进 ...

  2. Mysql创建、删除用户[转]

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  3. GitHub访问下载太慢解决办法

    原因 为什么慢?github的CDN被某墙屏了. 解决方法 绕过dns解析,在本地直接绑定host,该方法也可加速其他因为CDN被屏蔽导致访问慢的网站. 实现 在本地host文件中添加映射,步骤如下: ...

  4. [SCOI2018]游泳池(计算几何+分数规划+最大权闭合子图)

    题目链接 https://www.luogu.org/problemnew/show/U56187 注:题面参考了网上的其他博客,并非原题题面,因此数据范围可能有误.数据为原创数据. 题解 其实就是许 ...

  5. vue-lazyload图片懒加载的简单使用

    一.vue lazyload插件: 插件地址:https://github.com/hilongjw/vue-lazyload demo:http://hilongjw.github.io/vue-l ...

  6. python 3 map函数用法

    公式 f是定义的函数,l是你的list,所有功能都在f函数里完成, map(f,l) 有些网址爬虫出来的链接是一部分,省略了前端通用的,这时我们需要补充进去, 这时就用到了map函数,批量补充网址, ...

  7. 关于锚点定位,ul设置fixed后,div被覆盖一部分的问题

    例如: 问题: 刚开始的时候 .ul是正常显示的,当页面的滚动条滚动到一定的高度是 ,ul就被设置为 position:fixed:那么 点击 li相对应div就会被 固定定位的ul覆盖住一部分. 解 ...

  8. iview 怎样屏蔽掉账户框自动显示账户名和密码(root,***)

    用iview框架做出的登录页面,账户名和密码显示框,会自动有占位信息(root,****) 后来解决问题发现,只要在真正的输入框下面添加这样的一行隐藏的代码,占位信息会自动填充到隐藏的input框内, ...

  9. gVim安装vim-template插件后提示Undefined variable vim_template_subtype/Press ENTER or type command to continue

    Win7 64位 gVim:version 8.1.1234 vim-template:github链接 安装方式: 直接下载master的zip压缩包,解压后放入本地gVim安装目录的plugin, ...

  10. vue 2.0创建新项目

    参考链接  https://segmentfault.com/a/1190000011275993 背景在安装完node的基础上,机器什么都没安装参考上述链接 一.下载vue $ cnpm insta ...