zoukankan      html  css  js  c++  java
  • java笔记集合的引入<一>

    1.1. 什么是集合

    存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式。

    集合的出现就是为了持有对象集合中可以存储任意类型的对象, 而且长度可变在程序中有可能无法预先知道需要多少个对象, 那么用数组来装对象的话, 长度不好定义, 而集合解决了这样的问题

    1.2. 集合和数组的区别

    数组和集合类都是容器

    A:数组的特点

    数组长度是固定的数组中可以存储基本数据类型。

    B:集合类的特点

    用于存储对象,长度是可变的,可以存储不同类型的对象。

    1.3. 集合的分类

    集合做什么

    1:将对象添加到集合

    2:从集合中删除对象

    3: 从集合中查找一个对象

    4:从集合中修改一个对象就是增删改查

    注意:集合和数组中存放的都是对象的引用而非对象本身

    Java工程师对不同的容器进行了定义,虽然容器不同,但是还是有一些共性可以抽取最后抽取了一个顶层接口,那么就形成了一个集合框架。如何学习呢?当然是从顶层学起,顶层里边具有最共性,最基本的行为。具体的使用,就要选择具体的容器了。为什么? 因为不断向上抽取的东西有可能是不能创建对象的.抽象的可能性很大,并且子类对象的方法更多一些. 所以是看顶层,创建底层。那么集合的顶层是什么呢 叫做Collection

    集合框架体系

                               单列集合

     

                          双列集合

    ---|Collection: 单列集合
            ---|List: 有存储顺序, 可重复
                     ---|ArrayList:   数组实现, 查找快, 增删慢
                                        由于是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快
    
                     ---|LinkedList:  链表实现, 增删快, 查找慢
                                        由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效
                         率较高但查询时需要一个一个的遍历, 所以效率较低
    
                     ---|Vector:      和ArrayList原理相同, 但线程安全, 效率略低
                                        和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低
    
            ---|Set: 无存储顺序, 不可重复
                    ---|HashSet
                    ---|TreeSet
                    ---|LinkedHashSet
    ---| Map: 键值对
            ---|HashMap
            ---|TreeMap
            ---|HashTable
            ---|LinkedHashMap

    为什么出现这么多集合容器,因为每一个容器对数据的存储方式不同,这种存储方式称之为数据结构(data structure 

    注意 集合和数组中存放的都是对象的引用。

    1.4. 什么时候该使用什么样的集合

    Collection

    我们需要保存若干个对象的时候使用集合。

    List

    如果我们需要保留存储顺序, 并且保留重复元素, 使用List.

    如果查询较多, 那么使用ArrayList

    如果存取较多, 那么使用LinkedList

    如果需要线程安全, 那么使用Vector

    Set

    如果我们不需要保留存储顺序, 并且需要去掉重复元素, 使用Set.

    如果我们需要将元素排序, 那么使用TreeSet

    如果我们不需要排序, 使用HashSet, HashSet比

    TreeSet效率高.

    如果我们需要保留存储顺序, 又要过滤重复元素, 那么使用LinkedHashSet

    2. 集合类(Collection)

    Collection接口有两个子接口:

    List(链表|线性表)

    Set()

    特点:

    Collection中描述的是集合共有的功能(CRUD)

    List可存放重复元素,元素存取是有序的

    Set不可以存放重复元素,元素存取是无序的

    java.util.Collection

    ---| Collection 描述所有接口的共性

    ----| List接口 可以有重复元素的集合

    ----| Set  接口 不可以有重复元素的集合

    2:学习集合对象

    学习Collection中的共性方法,多个容器在不断向上抽取就出现了该体系。发现Collection接口中具有所有容器都具备的共性方法。查阅API时,就可以直接看该接口中的方法。并创建其子类对象对集合进行基本应用。当要使用集合对象中特有的方法,在查看子类具体内容。

    查看api 文档Collection在在java.util 中(注意是大写Collection

    注意在现阶段遇到的 E T 之类的类型,需要暂时理解为object  因为涉及到了泛型.

    3:创建集合对象,使用Collection中的List的具体实现类ArrayList

    1Collection coll=new Arraylist();

    4. Collection接口的共性方法

    此处我们用它的实现类进行演示:

    增加:

    add() 将指定对象存储到容器中 add 方法的参数类型是Object 便于接收任意对象

    addAll() 将指定集合中的元素添加到调用该方法和集合中

    import java.util.ArrayList;
    import java.util.Collection;
    
    public class collection {
    
        public static void main(String[] args) {
                Collection c=new ArrayList();
                c.add("华山");
                c.add("泰山");
           System.out.println("成功添加嵩山了吗?"+c.add("嵩山")); Collection c2=new ArrayList(); c2.add("泰山"); c2.add("武当山"); c.addAll(c2);//将c2的元素添加到c集合中。 System.out.println("c集合的元素为:"+c);
           System.out.println("元素的个数:"+c.size()); } }

    成功添加嵩山了吗?true

    输出结果:c集合的元素为:[华山, 泰山, 嵩山, 泰山, 武当山]

    元素的个数:5

    删除:

    remove() 将指定的对象从集合中删除

    removeAll() 指定集合中的元素删除

    import java.util.ArrayList;
    import java.util.Collection;
    
    public class Demo02 {
            public static void main(String[] args) {
                Collection c1=new ArrayList() ;
                c1.add("北京");
                c1.add("上海");
                c1.add("广州");
                c1.add("东莞");
            System.out.println("删除成功吗?"+c1.remove("东莞")); System.out.println("使用remove方法后输出c1:"+c1); Collection c2=new ArrayList() ; c2.add("深圳"); c2.add("珠海"); c2.add("广州"); //c1.removeAll(c2);//删除c1中与c2交集的元素,2个元素都有广州。 c1.retainAll(c2);//保留c1集合中与c2交集的元素,其余的全部删除。 System.out.println("使用retainAll方法后输出c1:"+c1);

            c1.clear();
            System.out.println("clear方法输出:"+c1);

    
            }
    }

    输出结果:

    删除成功吗?true
    使用remove方法后输出c1:[北京, 上海, 广州]
    使用retainAll方法后输出c1:[广州]

    clear方法输出:[]

    判断

    isEmpty() 判断集合是否为空

    contains() 判断集合何是否包含指定对象  

    containsAll() 判断集合中是否包含指定集合, 使用equals()判断两个对象是否相等  

     

    package cn.collection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    class Person{
        String name;
        int id;
        public Person(int id,String name) {
            this.id=id;
            this.name=name;
        }
        @Override
        public String toString() {
            return "["+this.id+this.name+"]";
        }
        @Override
        public boolean equals(Object obj) {
            Person p = (Person)obj;
            return this.id == p.id ;
        }
        
    }
    public class Demo03 {
            public static void main(String[] args) {
                Collection c=new ArrayList();
                c.add("华山");
                c.add("泰山");
                System.out.println("是否为空集合:"+c.isEmpty());
                //添加自定义的对象    
                Collection c2=new ArrayList();
                //现实生活中只要身份证标号一样。就代表同一个人。
                c2.add(new Person(110,"狗娃"));
                c2.add(new Person(120,"狗剩"));
                c2.add(new Person(119,"铁蛋"));
                Collection c3=new ArrayList();
                //现实生活中只要身份证标号一样。就代表同一个人。
                c3.add(new Person(110,"狗娃"));
                c3.add(new Person(120,"狗剩"));
                ;
                System.out.println("c2集合有包含c3集合中的所有元素吗??  "+c2.containsAll(c3));
                boolean flag=c2.contains(new Person(110,"狗剩"));
                System.out.println("判断集合中是否含有指定元素:"+flag);
                //此处集合的contains方法内部依赖于equal方法进行比较,默认比较对象的内存地址,
                //我们需要重写equal方法。            
                System.out.println(c2);
            }
    }

    输出结果:

    是否为空集合:false
    c2集合有包含c3集合中的所有元素吗?? true
    判断集合中是否含有指定元素:true
    [[110狗娃], [120狗剩], [119铁蛋]]

    转成数组

    toArray()   集合转换数组

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    
    public class Demo04 {
    
        public static void main(String[] args) {
            Collection c1=new ArrayList() ;
            c1.add("北京");
            c1.add("上海");
            c1.add("广州");
            Object [] arr=    c1.toArray();//将集合中的元素存储到一个object数组中返回
            System.out.println("数组的元素为:"+Arrays.toString(arr));
    
        }
    
    }

    输出结果:

    数组的元素为:[北京, 上海, 广州]

  • 相关阅读:
    HDU 2767 Proving Equivalences(强连通缩点)
    HDU 3836 Equivalent Sets(强连通缩点)
    POJ 2762 Going from u to v or from v to u?(强连通+缩点+拓扑排序)
    织梦dedecms中自定义表单必填项的设置方法
    dedecms中调用隐藏栏目的方法
    去掉dedecms友情链接中的LI标签的方法
    Mysql修改端口号 织梦DedeCMS设置教程
    织梦DedeCMS文章标题自动增加长尾关键词的方法
    DEDECMS短标题标签调用与字数修改的方法
    dedecms批量替换文章中超链接的方法
  • 原文地址:https://www.cnblogs.com/AllenRandolph/p/6940230.html
Copyright © 2011-2022 走看看