java 集合.Collection接口详解

简介: java 集合.Collection接口详解

集合.Collection接口详解


一、常用方法


  • boolean add(E e)
  • 确保此集合包含指定的元素(可选操作)
  • int size()
    返回此集合中的元素数。
  • void clear()
    从此集合中删除所有元素(可选操作)。
  • Object[ ] toArray()
    返回一个包含此集合中所有元素的数组。
  • boolean isEmpty()
    如果此集合不包含元素,则返回 true 。


import java.util.ArrayList;
import java.util.Collection;
class Customer{
  String name;
  int age;
  Customer(String name,int age){
    this.age = age;
    this.name = name;
  }
  public String toString(){
    return "Customer[name="+name+"age="+age+"]";
  }
}
public class CollectionTest01 {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //1.创建集合
    //Collection c = new Collection();  写法错误,接口不能new,需借助实现类
    Collection c = new ArrayList(); //利用多态
    //2.添加元素
    c.add(1); //自动装箱
    c.add(new Integer(100));
    Object o = new Object();
    c.add(o); //Collection集合只能单个存储元素
    Customer cust = new Customer("张三",20);
    c.add(cust);
    //3.将集合转换成Object类型数组
    Object[] objs = c.toArray();
    //遍历该数组
    for(int i=0;i<objs.length;i++){
      System.out.println(objs[i]);
    }
    //4.获取元素的个数
    System.out.println(c.size()); //4
    System.out.println(c.isEmpty()); //false
    //5.清空元素
    c.clear();
    System.out.println(c.size()); //0
    System.out.println(c.isEmpty()); //true
  }
}


  • Iterator iterator()


返回此集合中的元素的迭代器


通过迭代器中方法完成集合的迭代(遍历)。


在之前的这张图中左上角部分描述过迭代器

20200324211336823.png


注意:这种方式是所有的集合通用的便利方式。


import java.util.*;
public class CollectionTest02 {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //创建集合对象
    Collection<Comparable> c = new LinkedList<Comparable>();
    //添加元素
    c.add(10);
    c.add(3.14);
    c.add(true);
    //迭代
    //1.获取迭代对象
    Iterator<Comparable> it = c.iterator();
    System.out.println(it); //java.util.AbstractList$Itr是ArrayList集合所依赖的迭代器
                            //java.util.LinkedList$ListItr是LinkedList集合所依赖的迭代器
                            //Itr 、ListItr是内部类
    //迭代器是面向接口编程,it是引用,保存了内存地址,指向堆中的"迭代器对象"
    //2.遍历集合调用Collection内部方法
    while(it.hasNext()){
      Object element = it.next();
      System.out.println(element);
    }
    /*
    boolean b = it.hasNext(); 判断是否有更多的元素
    Object element = it.next(); 将迭代器下移一位,并且取出指向的元素
    原则:it.next()之前必须先调用it.hasNext()方法,防止出现空指针异常
    */
    /*for(Iterator<Comparable> it1 = c.iterator();it.hasNext();){
      Object element1 = it.next();
      System.out.println(element1);
    }
    */
  }
}


  • boolean contains(Object o)
    如果此集合包含指定的元素,则返回 true 。
  • boolean remove(Object o)
    从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
  • 存储在集合中的元素应该去重写equals方法


import java.util.*;
public class CollectionTest03 {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //创建集合
    Collection c = new ArrayList();
    //创建Integer类型的对象
    Integer i1 = new Integer(10);
    //添加对象
    c.add(i1);
    //判断集合中是否包含对象i1
    System.out.println(c.contains(i1)); //true
    //再创建一个Integer对象
    Integer i2 = new Integer(10);
    //删除
    c.remove(i2);
    System.out.println(c.size()); //0
    //判断集合中是否包含对象i2
    System.out.println(c.contains(i2)); //true
    //这就涉及到之前学的整型常量池,所以i1就是i2
    //并且contains方法底层调用的是equals方法
    //创建Manager对象
    Manager m1 = new Manager(100,"张三");
    //添加对象
    c.add(m1);
    //判断集合中是否存在对象m1
    System.out.println(c.contains(m1)); //true
    //再添加一个Manager对象
    Manager m2 = new Manager(100,"张三");
    //判断集合中是否存在对象m2
    System.out.println(c.contains(m2)); 
    //删除
    c.remove(m2);
    System.out.println(c.size()); //0
    //重写equals方法之前  
    //System.out.println(c.contains(m2)); false
    //重写equals方法之后  
      //System.out.println(c.contains(m2)); true
  }
}
class Manager{
  int no;
  String name;
  Manager(int no,String name){
    this.no = no;
    this.name = name;
  }
  //重写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.equals(this.name)){
        return true;
      }
    }
    return false;
  }
}


二、深入remove方法


1. 1.迭代器的remove方法
2. 2.集合本身的remove方法


import java.util.*;
public class CollectionTest04 {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //创建一个集合
    Collection c = new ArrayList();
    //添加元素
    c.add(1);
    c.add(2);
    c.add(3);
    //获取迭代器遍历
        Iterator it = c.iterator();
        while(it.hasNext()){
          //推荐使用迭代器自身的remove方法
          it.next();
          //删除
          it.remove();
          /*
             //使用集合本身的remove方法删除
             Object element = it.next();
             //删除
             c.remove(element);
             这种方式需要在每一次删除后重新获取新的迭代器
             */
        }
        System.out.println(c.size()); //0
  }
}


三、Collection与Collections的比较


java.util.Collections; 集合工具类

java.util.Collection; 集合接口

1.Collections 是集合工具类,用来对集合进行操作。部分方法如下


-public static <T> boolean addAll(Collection<T>c,T...elements)//往集合中添加一些元素
-public static void shuffle(List<?> list) //打乱集合顺序
-public static <T> void sort(List<T> list) //对集合进行排序,默认为升序


注意:


  • sort使用前提:被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
  • sort使用范围


20200404164841925.png


  • 适用于List,若为其他类型,需要将其强制类型转换


2.Comparable接口的排序规则:


// 自己(this)-参数:升序
public static <T>void sort(List<T> list, Comparator<? super T>):
//将集合中元素按照指定规则排序


3.Comparator和Comparable的区别


Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
Comparator:相当于找一个第三方的裁判,比较两个
Comparator定义排序规则: o1-o2 升序,反之降序


import java.util.*;
public class CollectionsTest01 {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //使用Collections工具完成集合的排序
    List l = new ArrayList();
    //添加元素
    l.add(10);
    l.add(60);
    l.add(20);
    l.add(40);
    l.add(30);
    //遍历
    for(int i = 0; i < l.size(); i++){
      System.out.println(l.get(i));
    }
    System.out.println("=================");
    //完成集合的排序
    Collections.sort(l);
    //遍历
    for (int i = 0; i < l.size(); i++) {
      System.out.println(l.get(i));
    }
    System.out.println("=================");
    //给定一个set集合
    Set s = new HashSet();
    //添加元素
    s.add(15);
    s.add(35);
    s.add(55);
    s.add(25);
    s.add(45);
    /*
    Collections.sort(s);
    Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  The method sort(List<T>) in the type Collections is not applicable for the arguments (Set)
    */
    //进行强制类型转换
    List lists = new ArrayList(s);
    Collections.sort(lists);
    //遍历
    Iterator it = lists.iterator();
    while(it.hasNext()){
      System.out.println(it.next());
    }
    System.out.println("=================");
    //将ArrayList集合转化成线程安全的
    List mylist = new ArrayList();
    Collections.synchronizedList(mylist);
  }
}

20200404164032112.png


目录
相关文章
|
4天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
23 3
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
91 38
|
14天前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
19天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
46 6
|
21天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
37 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
43 4
|
2月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
27 2
|
2月前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
103 3
|
2月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
119 1