zoukankan      html  css  js  c++  java
  • 集合类学习笔记

    一、概念

    集合是存储对象的一种方式。集合中都是存放着地址,方便引用。JDK 1.2版本的时候就有了

    二、集合和数组的区别

    集合是可变长度,数组是固定长度。

    数组可以存储基本数据类型,集合只能存储对象,集合可以存储不同类型的对象。

    Collection

    1.List:元素是有序的,可以重复,有索引

    2.Set:元素是无序的,不可以重复,使用hash值排列

     image

    三、CURD

    boolean add(E e);

    boolean addAll(Collection<? extends E> c);

    void clear();  清空容器

    boolean remove(Object o);

    boolean removeAll(Collection<?> c);

    boolean contains(Object o);

    四、迭代器

    用于取出集合内元素的方式:

    ArrayList al = new ArrayList();
    Iterator it = al.iterator();//迭代器
    it.next();//返回值
    it.hasNext()//boolean的类型

    每个容器都有存和取,每个容器的数据结构不同,存取方式可能也不同。

            取出方式定义在集合的内部,取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。

            每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容,就是判断和取出。这样,可以将这些共性抽取。

    image

    如何获取集合的取出对象呢?

    通过对外提供的方法,即 iterator();

    -------------------------------

    五、Set

    public interface Set extends Collection

    Set元素是无序的,存入和取出的顺序不一定一致,元素不可以重复,Set集合的功能和Collection一致。

    1.HashSet底层数据结构是哈希表。线程是非同步的。

    hashCode() 和equals()

    如果元素的hashcode相同,才会判断equals是否为true

    如果元素的hashcode不同,则不会调用equals

    注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals。

    HashSet:

    Demo@c17164

    Demo@1fb8ee3

    ToString(): getClass().getName() + ‘@’ + Integer.toHexString(hashCode());

             

    2.TreeSet

    可以对Set集合中的元素进行排序。线程是非同步的。

    TreeSet里面的对象必须具备比较性。

    底层数据结构是二叉树;

    保证元素唯一性的依据:

    compareTo方法,return0

    TreeSet排序第一种方式:

    元素需要实现Comparable接口,覆盖compareTo方法。

    元素自然顺序排列

    class Student implements Comparable{

            public int compareTo(Object obj){

                    if(!(obj instanceof Student)){

                         throw new RuntimeException(“不是学生对象”);

                   }

                   Student s  = (Student)obj;

                   if(this.age > s.age)

                              return 1;

                   if(this.age=s.age)

                              return 0;

                   return –1;

            }

    }

    TreeSet只看comparTo结果

             

            TreeSet的第二种排序方式:

             当元素自身不具备比较性时候,或者具备的比较性不是需要的,这个时候就需要让集合自身具备比较性。

             在集合一出始化时,就有了比较方式。

           compare方法

       覆盖Comparator的compare方法

      new Integer(s1.getAge()).compareTo(new Integer(s2.getName()));

    六、List

    List特有方法,凡事可以操作角标的方法都是该体系特有的方法。

    增:add(index,element);

            addAll(index, Collection);

    删:remove(index);

    改:set(index,element);

    查:get(index)

            subList(from, to);

            listIterator();

    for(int x = 0; x<al.size();x++){

         sysout();

    }

              while(it.hasNext()){

            sysout();

    }

    List集合特有的迭代器

    ListIterator it = new al.listIterator();

    hasNext = true

    hasPrevious = false

    ListIterator 可以在遍历的时候进行增删改查。

    --------------------------

    常见子类

    1.ArrayList:底层的数据结构使用的是数组结构(JDK1.2)

    特点:查询速度快

    缺点:增加、删除稍慢(元素越多越明显)

    2.LinkedList:底层的数据结构使用的是链表

    特点:插入、删除数据块

    缺点:查询速度慢

    LinkedList link = new LinkedList();

    link.add();

    LinkedList特有方法:

    addFirst();

    addLast();

    getFirst();

    getLast();

    获取元素,但不删除元素,

    如果集合中没有元素,会出现NoSuchElementException;

    removeFirst();

    removeLast();

    获取元素,但元素被删除,

    如果集合中没有元素,会出现NoSuchElementException;

    在JDK1.6出现了

    offerFirst();

    offerLast();

    peekFirst();

    peekLast();

    获取元素,但元素不被删除,

    如果集合中没有元素,会返回null

    pollFirst();

    pollLast();

    获取元素,但元素被删除,

    如果集合中没有元素,会返回null

    while(!link.isEmpty()){

        sop(link.removeFirst());

    }

    使用equals比较对象是否相同

    public boolean equals(Object obj){

            if(!(obj instanceof Person)){

                    return false;

            }

            Person p = (Person)obj;

            return this.name.equals(p.name) && this.age == p.age;

    }

    3.Vector:底层是数组数据结构(JDK1.0)

    Vector和ArrayList功能一样。Vector是同步的,ArrayList线程不同步。

    尽量用ArrayList而不用Vector

    -------------------

    Enumeration枚举(JDK1.0)

    Enumeration en = v.elements();

    while(en.hasMoreElements()){

            sysout(en.nextElement());

    }

    因为枚举的名称及方法的名称过长,所以被迭代器取代了。

  • 相关阅读:
    俞敏洪谈大学爱情:终于在清华说实话了
    人的有两面性
    冯亚丽,打造1500亿帝国的奇女子
    做企业就要有精气神
    当心!“饭桌教育”祸害你的孩子
    为何企业宁可高薪招人,也不给老员工加薪?
    住的离公司有多远,成长就有多难
    物理像素,逻辑像素,解决1px的问题
    移动端布局 + iscroll + 滚动事件
    移动端布局 + iscroll.js
  • 原文地址:https://www.cnblogs.com/yhws/p/3856561.html
Copyright © 2011-2022 走看看