• java基础27 单例集合Collection及其常用方法


    1、集合

         集合是存储对象数据的集合容器

     1.1、集合比数组的优势

        1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据
        2.集合的长度是变化的,数组的长度是固定的

    1.2、数组:存储同一种类型集合的容器
    1.3、 数组的特点
        1.只能存储同一种数据类型
        2.一旦初始化,长度固定
        3.数组中的元素与元素之间的内存地址是连续的

        注意: object类型的数组可以存任意类型的数据

    问题:使用ArrayList无参构造函数创建对象,默认容量是多少?如果长度不够又自增多少?
        答:ArrayList底层是维护一个Object数组实现的,使用无参构造函数时,Object默认容量是10,当长度不够时,自动增长0.5倍

    2、集合体系                   Collection集合详解

    单例集合的体系:

    ---------| collection  单例集合的根接口
    --------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合中的有序不是指自然顺序,而是指添加进去的顺序与出来的顺序是一致的
    ------------------| ArrayList  ArrayList底层维护了一个object数组的实现的。(线程不安全),特点:查询速度快,增删速度慢。有序,可重复
    ------------------| LinkedList  LinkedList底层是使用链表结构实现的,线程不安全,特点:查询速度慢,增删速度快。有序,可重复
    ------------------|
    Vector(了解即可)  底层也是维护一个Object数组的实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低
    --------------| Set  如果实现了set接口的集合类,具备的特点:无序,不可重复     注:集合中的无序不是指自然顺序,而是指添加元素进去的顺序与元素出来的顺序是不一致的
    ------------------| HashSet  底层是用于一个哈希表支持的。线程不安全,特点:存储速度块
    ------------------| TreeSet   底层是使用红黑树(二叉树)数据结构实现的,线程不同步(即线程不安全),不能在多线程中共享,但可以使用synchroinzedMap()方法来实现同步。特点:会对元素进行排序存储(按自然顺序

    双例集合体系:

    ----------| Map  双例集合的根接口。如果是实现了Map接口的集合类,具备的特点:存储的数据都是以键值对形式存在的,键不可重复,值可以重复
    --------------| HashMap  底层是基于哈希表实现的,HashMap允许键和值为null,线程不安全,特点:存储速度块
    --------------| TreeMap  基于红黑数(二叉树)数据结构实现的,线程不同步(即线程不安全),特点:会对元素经行排序存储
    --------------| HashTable(了解即可)  线程安全

    2.1、Collection的一些方法

    /*
     * 增加
     * add(E e) //向本集合中添加元素
     * addAll(Collection<? extends E> c) //向另一个集合中添加指定的集合(里面的所有元素).
     *
     * 删除
     * clear() //删除指定集合
     * remove(Object o) //指定删除的元素
     * removeAll(Collection<?> c) //删除c1,以及c和c1的交集部分.
     * retainAll(Collection<?> c) //保留c1,以及c和c1的交集部分.
     *
     * 查看
     * size() //返回当前集合中元素的个数
     *
     * 判断
     * isEmpty() //判断集合是否为空
     * contains(Object o)  //判断该集合中是否包含该集合指定元素
     * containsAll(Collection<?> c) //判断该集合是否包含指定集合中的所有元素
     *
     * 迭代
     * toArray() //返回一个包含此集合中所有元素的数组    相当于把集合转换成数组的形式
     * iterator() //返回此集合中的元素的迭代器
     * */

    2.2、实例

    增、删、查 方法

     1 package com.zn.collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 
     6 /**
     7  * @author DSHORE / 2018-5-15
     8  *
     9  */
    10 public class Demo1 {
    11     public static void main(String[] args) {
    12         Collection<String> c=new ArrayList<String>();//父类的引用类型指向子类的对象
    13         c.add("张三");
    14         c.add("李四");
    15         c.add("王五");
    16         System.out.println(c);//返回值:[张三, 李四, 王五]
    17         
    18         //添加        创建集合
    19         Collection<String> c2=new ArrayList<String>();
    20         c2.add("张三");
    21         c2.add("狗蛋");
    22         c2.add("狗娃");
    23         c.addAll(c2);
    24         System.out.println(c);//返回值:[张三, 李四, 王五, 张三, 狗蛋, 狗娃]
    25             
    26         //删除
    27         //c.clear();
    28         //System.out.println(c);//返回值:[]   集合中没有元素,已被删除
    29         //c.remove("狗蛋");
    30         //System.out.println(c);//返回值:[张三, 李四, 王五, 张三, 狗娃]
    31         //c.removeAll(c2);//删除c2集合,以及c集合与c2集合的交集部分
    32         //System.out.println(c);//返回值:[李四, 王五]
    33         c.retainAll(c2);//保留c2集合,以及c集合与c2集合的交集部分
    34         System.out.println(c);//返回值:[张三, 张三, 狗蛋, 狗娃]
    35 
    36         //查看
    37         System.out.println("查看集合的元素个数:"+c.size());//返回值:查看集合的元素个数:6
    38     }
    39 }

    判断方法

     1 package com.zn.collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 
     6 /**
     7  * @author DSHORE / 2018-5-15
     8  *
     9  */
    10 /*
    11  * isEmpty() //判断集合是否为空
    12  * contains(Object o)  //判断该集合中是否包含该集合指定元素
    13  * containsAll(Collection<?> c) //判断该集合是否包含指定集合中的所有元素
    14  * */
    15 class Person{
    16     String name;
    17     int id;
    18     public Person(String name, int id) {
    19         super();
    20         this.name = name;
    21         this.id = id;
    22     }
    23     @Override
    24     public String toString() {
    25         return "Person [name=" + name + ", id=" + id + "]";
    26     }
    27     
    28     @Override
    29     public boolean equals(Object obj) {
    30         Person p=(Person)obj;
    31         return this.id==p.id;
    32     }
    33 }
    34 public class Demo2 {
    35     public static void main(String[] args) {
    36         Collection<String> c=new ArrayList<String>();//父类的引用类型指向子类的对象
    37         c.add("张三");
    38         c.add("李四");
    39         c.add("王五");
    40         System.out.println("判断集合是否为空:"+c.isEmpty());//返回值:false
    41         System.out.println("判断该集合是否包含指定元素:"+c.contains("孙尚香"));//返回值:false
    42         System.out.println("判断该集合是否包含指定元素:"+c.contains("王五"));//返回值:true
    43     
    44         //集合中添加自定义元素
    45         Collection c1=new ArrayList();//父类的引用类型指向子类的对象
    46         //下面添加的都是对象
    47         c1.add(new Person("狗娃", 1)); 
    48         c1.add(new Person("狗剩", 2));
    49         c1.add(new Person("狗蛋", 3));
    50         
    51         Collection c2=new ArrayList();
    52         c2.add(new Person("狗娃", 1));
    53         c2.add(new Person("狗剩", 2));
    54         c2.add(new Person("孙尚香", 3));
    55         
    56         System.out.println("c1集合中元素包含c2集合中的元素吗? "+c1.containsAll(c2));//返回值:true  说明:这里是根据id判断的,由上面的equals()方法可以看出。
    57     }
    58 }

    迭代方法

    toArray()
     1 package com.zn.collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 /**
     7  * @author DSHORE / 2018-5-15
     8  * 
     9  * toArray:返回一个包含此集合中所有元素的数组    相当于把集合转换成数组的形式
    10  * 
    11  * List 如果实现了list接口的集合类,具备的特点:有序,可重复
    12  * set 如果实现了set接口的集合类,局部特点:无序,不可重复
    13  */
    14 class Persons {
    15     String name;
    16     public Persons(String name) {
    17         super();
    18         this.name = name;
    19     }
    20     @Override
    21     public String toString() {
    22         return "Person [name=" + name + "]";
    23     }
    24 }
    25 public class Demo4 {
    26     public static void main(String[] args) {
    27         List<Object> list=new ArrayList<Object>();
    28         list.add(new Persons("张三"));
    29         list.add(new Persons("李四"));
    30         list.add(new Persons("王五"));//可重复
    31         list.add(new Persons("王五"));
    32         //方式1:报错
    33         Person[] persons = (Person[]) list.toArray();
    34         for (int i = 0; i < persons.length; i++) {
    35             System.out.println(persons[i]);//报异常:Exception in thread "main" java.lang.ClassCastException
    36         }
    37         //方式1
    38         Object[] object = list.toArray(); //toArray把集合中的元素存储到一个Object类型的数组中,并返回
    39         for (int i = 0; i < object.length; i++) {
    40             System.out.println(object[i]);
    41             /*运行结果:
    42              * Person [name=张三]
    43              * Person [name=李四]
    44              * Person [name=王五]
    45              * Person [name=王五]
    46              **/
    47         }
    48         //方式2
    49         //Person[] person = new Person[];
    50         Persons[] person = (Persons[])list.toArray(new Persons[5]);//toArray:返回一个包含此集合中所有元素的数组    相当于把数组转换成集合的形式
    51         System.out.println(list);//返回值:[Person [name=张三], Person [name=李四], Person [name=王五], Person [name=王五]]
    52 
    53         System.out.println(person);//返回值:[Lcom.zn.collection.Persons;@544a5ab2      内存地址
    54         for(int i = 0; i < person.length; i++){//遍历出 数组里面的具体数据
    55             System.out.println(person[i]);
    56             /*运行结果:  解析:该数组长度为5;数据只有4条,故最后一条数据为null
    57               Person [name=张三]
    58               Person [name=李四]
    59               Person [name=王五]
    60               Person [name=王五]
    61               null
    62              */
    63         }
    64     }
    65 }
    iterator()
     1 package com.zn.collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 /**
     6  * @author DSHORE / 2018-5-15
     7  *
     8  * iterator() //返回此集合中的元素的迭代器
     9  */
    10 //需求:编写一个函数清除集合中的重复元素.如果书号是一样的视为重复元素
    11 class Book{
    12     int id;
    13     String name;
    14     public Book(int id, String name) {
    15         super();
    16         this.id = id;
    17         this.name = name;
    18     }
    19     @Override
    20     public String toString() {
    21         return "Book [id=" + id + ", name=" + name + "]";
    22     }
    23     @Override
    24     public boolean equals(Object obj) {
    25             Book book=(Book)obj;
    26         return this.id==book.id;//根据id判断是否相等
    27     }
    28 }
    29 public class Demo3 {
    30     public static void main(String[] args) {
    31         ArrayList list=new ArrayList();
    32         list.add(new Book(110, "java编程思想"));
    33         list.add(new Book(220,"java核心技术"));
    34         list.add(new Book(330,"深入javaweb"));
    35         list.add(new Book(110,"java神书"));
    36         System.out.println(list);
    37         ArrayList al=clearRepeat(list);
    38         System.out.println("新集合中的元素是:"+al);    
    39     }
    40     public static ArrayList clearRepeat(ArrayList list){
    41         //创建一个新的集合
    42         ArrayList newList=new ArrayList();
    43         //获取迭代器
    44         Iterator it=list.iterator();
    45         while(it.hasNext()){//遍历 (遍历就集合中的元素)   it.hasNext():判断是否还有元素可以迭代,有则返回true
    46             Book book=(Book) it.next();//从旧集合中获取的元素   it.next():下一个元素
    47             if(!newList.contains(book)){//判断newList集合是否包含list集合中的元素。  有两个id是110的,故 新集合中会过滤掉一条110的数据   
    48                 //如果新集合中没有包含该书籍,那么就存储到新集合中
    49                 newList.add(book);
    50             }
    51         }
    52         return newList;    
    53     }
    54 }

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:http://www.cnblogs.com/dshore123/p/9026087.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    .NET探索模型路由约定实现伪静态
    .NET中使用DebuggerDisplay轻松定制调试
    .NET探索平台条件编译
    Spring Boot+Logback输出日志到指定路径
    SAPD:FSAF升级版,合理的损失值加权以及金字塔特征选择 | ECCV 2020
    FSAF:嵌入anchor-free分支来指导acnhor-based算法训练 | CVPR2019
    RepPointsV2:更多的监督任务,更强的性能 | NIPS 2020
    RepPoints:微软巧用变形卷积生成点集进行目标检测,创意满满 | ICCV 2019
    CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020
    SaccadeNet:使用角点特征进行two-stage预测框精调 | CVPR 2020
  • 原文地址:https://www.cnblogs.com/dshore123/p/9026087.html
Copyright © 2020-2023  润新知