集合

一、集合的框架

 |-------Collection接口:单列集合,用来存储一个一个的对象

       |-------List接口:存储有序的、可重复的数据

    |----------ArrayList、LinkedList、Vector

  |-------Set接口:存储无序的、不可重复的数据  --->高中讲的“集合”

        |---------------HashSet、LinkedHashSet、TreeSet

 

 

|--------Map接口:双列集合,用来存储一对(key---value)一对的数据    --->高中函数:y = f(x)

                  |------HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

 

 

二、Collection接口中的常用方法

见Api中的Collection接口

1.boolean  contains(Object obj) :判断当前集合中是否包含obj

这个方法底层是   obj.equals(集合中的每一个对象) ,与集合中的对象一个一个的equals。

因此,我们要求 加入集合中的对象 所在的类 需要去重写equals方法,这样在调用contains()等方法时,比较的才是内容。

 

2.boolean   containsAll(Collection c) :判断形参 c 中的所有元素 是否都存在与当前集合中

 

3.boolean   remove(Object obj):从当前集合中删除obj这个元素,删除成功返回true,失败返回false

 

4.boolean  removeAll(Collection c) :从当前集合中删除  集合c中 的元素(删除交集),并且会改变当前集合

 

5.boolean retainAll(Collection c):获取当前集合与集合c 的交集,并且会改变当前集合

 

6.boolean  equals(Object obj):要想返回true,需要当前集合与形参集合的元素都要相同。

 

与元素的顺序有没有关系 需要看这个集合是什么类型的

 

7.Object[ ]   toArray():把当前集合转换成威 Object类型的数组 (集合------>数组)

 

8.(数组------->集合) 用Arrays类中的静态方法 asList()即可

Arrays.asList(把数组放进来) ,返回List类型

特别注意:Arrays.asList(new int[ ]{123, 456}),返回的集合只有一个元素,这个元素是 int[ ]类型的 。

因为它把 new int[ ]{123, 456} 当成一个引用类型的元素了。

若想变成两个元素(123,456),则需要 Arrays.asList(new Integer[ ]{123, 456})或者  Arrays.asList(123, 456)

 

三、Iterator迭代器接口

  

Collection coll = new ArrayList();
coll.add("AA");
coll.add("BB");
coll.add("CC");

//怎么去遍历这个coll集合呢?

 

方式一:

Iterator iterator = coll.iterator();//先获取Iterator迭代器的对象

//hasNext():判断是否还有下一个元素
while(iterator.hasNext()){

//next():①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());

}

 

注意点:1.Iterator可以删除集合的元素,但是是遍历过程中通过迭代器对象的remove方
                   法,不是集合对象的remove方法。
               2.如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,
                  再调用remove都会报IllegalStateException。

 

 

 方式二:增强for循环

//for(集合元素的类型 局部变量 :集合对象)
//内部仍然调用了迭代器
for
(Object obj : coll){ sout(obj);
}

 

四丶Collection子接口之一:List接口

1.结构

 |-------Collection接口:单列集合,用来存储一个一个的对象

       |-------List接口:存储有序的、可重复的数据       --------> 代替原来的数组

    |----------ArrayList   : 主要实现类、线程不安全、底层使用Object[ ] 数组存储

               |---------LinkedList  :底层是双向链表存储

               |---------Vector     :古老实现类、线程安全、底层使用Object[ ] 数组存储 、用的不多

 

2.ArrayList的源码分析

 

 

 

 

 

 

3.LinkedList的源码分析

 

4.List接口的常用方法

 

 

  

 

 

 五、Collection子接口之二:Set接口

1.Set接口的框架:

|-------Collection接口:单列集合,用来存储一个一个的对象

    |-------Set接口:存储无序的、不可重复的数据  --->高中讲的“集合”

        |---------------HashSet:作为Set接口的主要实现类、线程不安全、可以存储null值

          |---------------LinkedHashSet:HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历

        |---------------TreeSet:可以按照添加对象的指定属性,进行排序

 

 

无序性:数据存放无序、数据在数组中是根据数据的哈希值来存放的,类似于哈希表

不可重复性:以HashSet为例,添加数据时,①首先计算hashcode,②根据散列函数计算数据在数组中的存放位置,③若这个位置上没有元素,就添加成功,④若这个位置上有数据,则需要比较这个位置上  链表上的元素的hashcode,若hashcode不相同,就是不同的元素,就添加成功。⑤若hashcode相同,则比较equals方法,若返回false,则是不同的元素,就添加成功

⑥如果比较equals方法时返回true,就是相同的数据,就添加失败!从而保证了不可重复性。

要求: 向HashSet添加的数据所在的类要重写equals和hashcode

 

 

 

 

2.LinkedHashSet

 

在频繁的遍历时,效率要与HashSet

 

 

 

3.TreeSet

 

向TreeSet中添加的数据,必须是同一个类的对象

 

两种排序方式:自然排序和定制排序

 

 

 

六、Map接口

1.Map接口的框架

 

 

 

2.Map中key-value的理解

 

 

 

 3.jdk7及以前

 

 

4.jdk8后

 

 

 

 

5.Map接口中的常用方法

 

 

6.Properties类

 

 

 

 

 七、Collections工具类的使用

看api文档

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-04-25 10:08  陈浩威  阅读(61)  评论(0)    收藏  举报