zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    January 25th, 2018 Week 04th Thursday
    January 24th, 2018 Week 04th Wednesday
    January 23rd, 2018 Week 04th Tuesday
    January 22nd, 2018 Week 04th Monday
    January 21st, 2018 Week 3rd Sunday
    January 20th, 2018 Week 3rd Saturday
    January 19th, 2018 Week 3rd Friday
    January 18th, 2018 Week 03rd Thursday
    January 17th, 2018 Week 03rd Wednesday
    January 16th, 2018 Week 03rd Tuesday
  • 原文地址:https://www.cnblogs.com/dshore123/p/9026087.html
Copyright © 2011-2022 走看看