• 集合类(框架)


    ————集合框架

      为什么会出现那么多的容器呢?

     因为每一个容器对数据的存储方式不同。这个存储方式称之为: 数据结构。

      共性方法:  1、add方法的参数类型是Object。以便于接收任意类型的对象。

            2、集合中存储的都是对象的引用。

      基本操作:

      ArrrayList a1 = new ArrayList();

        1、添加元素

          a1.add(Object obj);

        2、打印原集合

          System.out.println(a1);

        3、删除元素

          a1.remover(元素);

          a1.clear();  清空集合

        4、判断元素

          a1.contains(需要判断的元素);  判断是否存在某元素?

          a1.isEmpoty();  判断集合是否为空?

        5、获取个数 。集合的长度

          a1.size();

        6、取两个集合中相同的部分

          a1.retainAll(a2);  取交集 ,a1 中只会保留和a2 中相同的元素。

      迭代器:  (就是集合的取出元素的方式)

        Iterator it  =  a1.iterator();  //获取迭代器,用于取出集合中的元素。

        for(Iterator it  = a1.iterator(); it.hasNext() ; ) {

          System.out.println(it.next());

        }

      把取出方式定义在集合的内部,就可以直接访问集合内容的元素。

     即取出方式就被定义为了内部类。 它们都有共性的内容:判断和取出。就可以抽取 到Iterator。   ———如果集合实现了Iterator这个规则,就可以通过一个对外的方法 iterator();来获取集合的取出对象了。

      

    Collection 

       |——List: 元素是有序的,元素可以重复,因为该集合体系有索引。

          |---ArrayList : (线程不同步) 底层的数据结构使用的是数组结构; 特点:查询速度很快、但是增删很慢。

          |---LinkedList :  底层使用的链表数据结构 ; 

          |---Vector : (线程同步) 底层是数组数据结构。 被ArrayList替代了。

      List集合判断元素是否相同,依据的是元素的equals方法。    

       |——Set:  元素是无序的, 元素不可以重复。

          |--- HashSet :  底层数据结构是哈希表。线程是同步的

          |---TreeSet  :   可以对Set集合中的元素进行排序

                   底层数据结构是二叉树

                   保证元素唯一性的依据: CompareTo 方法 return 0。

      Set集合的功能和Collection 是一致的。

    ————List :

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

    增:

      add (index , element );

      addAll (index , Collection);

    删:

      remove(index);

    改:

      set(index, element);

    查:

      get(index);

      subList(form , to);  获取子链表

      listIterator();  //在迭代过程中,准备添加或者删除元素。

    List集合特有的迭代器。 ListIterator 是Iterator 的子接口。

      在迭代时,不可以通过集合对象的方法操作集合中的元素;  因为会发生ConcurrentModificationException 异常。

      所以,在迭代器时,只能用迭代器的获取操作元素,可是Iterator 方法有限,只能对元素进行判断、取出、删除的操作;如果想要对其进行其他 如 添加、修改等操作,就需要使用其子接口,ListIterator  。

      ----该接口只能通过List 集合的ListIterator 方法获取。

      枚举就是Vector特有的取出方式。  发现枚举和迭代器很像, 其实枚举和迭代是一样的。  (--其实迭代器取代了枚举。)

       

    LinkedList :特有的方法: 

        addFirst();  addLast();  把一个元素添加到**;

       getFirst();  getLast();   获取元素,但是不删除元素。

      removeFirst();  removeLast();  获取元素,但是元素被删除。 如果集合中没有元素,会出现NoSuchElementException 

      JDK 1.6 出现了替代方法

      

       offerFirst();  offerLast();  把一个元素添加到**;

       peekFirst();  peekLast();   获取元素,但是不删除元素。如果集合中没有元素,会返回null。

       pollFirst();  pollLast();  获取元素,但是元素被删除。如果集合中没有元素,会返回null。

      使用LinkedList 模拟一个堆栈或者队列数据结构;

    堆栈: 先进后出,如同一个杯子;

    队列:先进先出  First in First out FIFO    如同一个水管。

      在迭代时 next调用一次, 就要hasNext判断一次;

      

    —————Set:

        HashSet 是如何保证元素唯一性的呢?

      是通过元素的两个方法,hashCode 和equals来完成的。

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

        如果元素的HashCode值不同,才会调用equals方法。、

      一般 某个对象要存储到集合中存的话,一般都有复写 hashCode 和equals方法。

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

    TreeSet:

    ---排序时,当主要条件相同时,一定要判断次要条件。

      TreeSet排序的第一种方式:

          让元素自身具备比较性。元素需要实现Comparable 接口,覆盖CompareTo 方法,这种方式也叫元素的自然排序或者称为默认排序。

      TreeSet的第二种排序方式:

          当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。 在集合初始化时,就有了比较方式。

       ----当元素自身不具备比较性,或者具备的比较性不是所需要的。这时就需要让容器自身具备比较性。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

         当两种排序都存在时,以比较器为主。

        定义一个类,实现Comparator接口,覆盖Compare方法。

    Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。

      附加练习:  每一个学生都有对应的归属地。   学生属性: 姓名、年龄;注意: 姓名和年龄相同的视为同一个学生。保证学生的唯一性。

      分析: 1、描述学生; 2、 定义一个Map容器,将学生作为键,地址作为值。存入。  3、获取map集合中的元素。

     1 Class Student implements Comparable<Student>
     2 {
     3    private String name ;
     4    private int age;
     5    Student(String name, int age) {
     6     this.name  = name;
     7     this.age  = age;
     8    }  
     9     public int compareTo(Student s) {
    10       int num = new Integer(this.age).compareTo(new Integer(s.age));
    11       if(num ==0)
    12          return this.name.compareTo(s.name);
    13    }
    14     public int hashCode() {
    15        return name.hashCode() + age*34;
    16     }
    17     public boolean equals (Object obj) {
    18         if(!(obj  instanceof Student ))  {
    19                throw new ClassCastException("类型不匹配");
    20          }
    21         Student s = (Student) obj;
    22         return this.name.equals(s.name) && this.age == s.age;
    23     }
    24     public String getName() {
    25            return name;
    26     }
    27     public int getAge() {
    28         return age;
    29     }
    30 }                           

      一个以学生姓名排序的 比较器:

    1 class stuNameComparator implements Comparator<Student> {
      public int compare(Student s1, Student s2) {
        int num = s1.getName().compareTo(s2.getName());
        if(num == 0)
         return new Integer(s2.getAge()).compareTo(new Integer(s2.getAge()));    return num;
      }
    }

    map集合练习2: 

      “sdfkhfhfsklefs” 获取该字符串中的字母出现的次数。

      希望打印的结果: a(2) c(4) d(3).....

      可以发现字母与次数之间都有映射关系。

          ----当数据之间存在这映射关系时,就要先想到 map 集合。

      思路: 1、将字符串转换成字符数组,因为要对每一个字母进行操作。 2、定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。  3、遍历字符数组 : 将每一个字母作为键去查map集合。 如果返回null ,将该字母和1 存入到map集合中去; 如果返回不是null ,说明该祖母在map集合中已经存在并有对应的次数。  那么久获取该次数并进行自增,,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来键对应的值。   4、 将map集合中的数据变为指定的字符串形式返回。

  • 相关阅读:
    【项目管理】WBS工作分解结构
    【代理篇】内网穿透利器——Termite
    【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞
    【代理篇】内网穿透利器——EarthWorm
    【漏洞复现】Apache Solr远程代码执行(CVE-2019-0193)
    【漏洞复现】Apache Solr via Velocity template远程代码执行
    【漏洞复现】PHPStudy后门
    记一次织梦cms渗透测试
    Mybatis源码手记-从缓存体系看责任链派发模式与循环依赖企业级实践
    Dubbo源码手记-服务注册
  • 原文地址:https://www.cnblogs.com/jesonjason/p/5102566.html
Copyright © 2020-2023  润新知