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


目录
相关文章
|
10天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
1天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
16 1
|
11天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
21 2
|
10天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
15天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
11天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
27 1
|
17天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
15天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
15天前
|
Java 开发者
|
15天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
12 0
下一篇
无影云桌面