集合类(框架)

————集合框架

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

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

  共性方法:  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集合中的数据变为指定的字符串形式返回。

原文地址:https://www.cnblogs.com/jesonjason/p/5102566.html