黑马程序员-java学习日记之集合

来源:互联网 发布:大数据要学哪些内容 编辑:程序博客网 时间:2024/04/29 02:30

-------android培训java培训、期待与您交流! ----------

集合:

为什么要出现集合呢?

我们都知道数据多了,用数组存储,或是封装成对象,那么对象多了就需要用集合存储。

那么数组和集合都是容器,有什么不同呢?

1)数组长度是定的,集合长度是可变的

2)数组中只能存储基本数据类型,集合中存储的是对象

集合的特点:

1)用于存储对象的容器

2)集合的长度是可变的

3)集合中不可以存储基本数据类型

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

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

集合中存储的是对象吗?答案是否定的,集合和数组一样,里面都存储的是对象的地址值。集合中存储的都是对象的引用。

Iterator:迭代器由来:每个容器多有自己的取出方式,因为取出的动作只有集合自己最清楚,那么就把取出的方式定

义在集合内部类,但是每个容器的数据结构不同,所以取出的动作细节也不一样,但是共性内容都是判断和取出,那

么可以将共性内容进行抽取。那么这些内部类否符合一个规则,该规则就是Iterator,通过对外提供的方法获取iterator();降低了容器和数据耦合性。。。(比如游戏厅里的夹娃娃机,有的是三个爪,有的是四个爪,但是他们都一个共性都是定一在箱子内部的,都可以夹娃娃,只对外提供一个操纵杆,我们只需要操作杆子就可以了,里面的东西我们不需要的了解)

注意:当我们在使用迭代器操作集合中的元素时,不可以通过集合对象的方法操作集合中的元素,因为会发生

ConcurrentModificationException(并发修改错误)所以,在迭代时,只能使用迭代器中方法操作元素,可是Iterator中的方法是有限的,只能对元素进行判断,取出和删除的操作。如果想要对元素进行如添加,修改等,就需要其子接口,ListIterator接口来完成。

Collection:

  |--List:元素是有序的(存入和取出的顺序),可以重复,因为该集合体系都有索引。

 |--ArrayList:底层使用的是数组结构,线程不同步,效率高   特点:查询速度快,但是增删速度慢,50%延长

 |--LinkedList:底层是链表结构,线程不同步(使用频率不高) 特点:查询速度慢,但是增删速度快。

                        特有方法:

                                      jdk1.6后取代的方法

                                        addFirst()------->offerFirst()    

                                        addLast()-------->offerLast()

                                         getFirst()------->peekFirst()

                                          getLast()-------->peekLast()  [获取但不删除,如果集合中没有元素,

                                                   会出现 NoSuchElementException异常]-->jdk1.6后,返回null

                                    removeFirst() -------->pollFirst()

                                     removeLast()-------->pollLast()

                                                       [获取但是元素被删除,如果集合中没有元素,

                                                  会出现 NoSuchElementException异常]-->jdk1.6后,返回null

 |--Vector:底层是数组结构,线程同步(被ArrayList替代),效率低

                枚举:就是vector特有的取出方式,和迭代器很象,但是由于名称和方法名过长,所以被迭代器去代了。

               可变长度数组:不断new数组完成的,就是将原有数组中的元素Copy到新数组中。

                List集合中的特有方法:凡是可以操作脚标的都是该体系的特有方法。

                  添加:add(index ,element);

                            addAll(index,collection);

                 删除:remove(index);

                    修改:set(index,elment);

                获取:get(index);

                          subList(from,to);

                         listIterator();

                        Lsit集合中判断元素是否唯一使用的是equals()方法。

                开发时怎么选择合适的集合使用:

                    1,如果你取到的元素很多,元素当中涉及到频繁的增删操作,使用LinkedList集合

                    2,如果同时涉及增删和查询时,可以使用ArrayList也可以使用LinkedList,

                          建议使用ArrayList,因为更多的时候我们查询的情况更常见。


    |--Set:元素是无序的(存储和取出的顺序不一定一致),元素不可以重复。 

           |--HashSet:底层数据结构是哈希表。 HashSet是如何保证元素的唯一性呢

                 通过元素的两个方法,hashCode和equals方法来完成,如果元 素hashCode相同,

                 还会判断对象的equal是否为ture,如果元素         hashCode值相同,则不会调用equals.

                 实际开发时,描述事物只要往集合中存储,一般都要覆写hashCode和 equals方法

                我们在存人对象时,hashCode方法中可以将年龄乘以一个值,可以义提高比较效率

         |--TreeSet:底层数据结构是二叉树。

                              特点:可以对Set集合中的元素进行自然排序。

                                     排序的第一种方式:让元素自具备比较性,让对象实现·     

                                            Comparable接口,覆写ComparaTo方法。

                                   排序的第二种方式:当元素自身不具备比较性,或是具备的比较性不是所需要的,

                                                                  那么就让集合自身具备比较性,在集合初始化时就有了比较器

Map集合

 Map集合特点:该集合中存储都是键值对(也成为双列集合),一对一对 的往里存,必须保证键的唯一性。(可以

对集合中的键值进行排序)  其实Set底层就是使用了Map集合。

    Map

               |--Hashtable:底层是哈希表数据结构,不可以存储null键,    null值,线程同步,

               |--HashMap:底层是哈希表数据结构,可以存储null键,null 值,线程不同步,

                |--TreeMap:底层是二叉树数据结构,不可以存储null键,null值,线程不同步,

                                    可以用于给Map集合中的键进行排序。
    注意:Map集合中,添加元素时,如果键一样时,后面的键所对应的值会 覆盖原有的值。

                  Map集合取出元素的两种方式:原理:将Map集合转换成Set集合,然后通过迭代器进行取出

                 1,Set<k>keyset:将Map集合中的所有的键存储到Set集合中,因为Set集合具备迭代器,

                         所以可以迭代的方式取出所有的键,然后通过键获取其对应的值

                  2, Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系取出存入到Set集合中,

                       而这个关系的数据类型就是Map.Entry;


/**


 * Map.Entry<>由来,entry也是一个接口,它是Map集合中的一个内部接口


 *


 * @author jinxiao


 *


 */


interface Map {


    public static interface Entry {


       public abstract Object getKey();


 


       public abstract Object getValue();


    }


}


 


class HashMap implements Map {


    class Test implements Entry {


       public Object getKey() {


 


           return null;


       }


 


       public Object getValue() {


 


           return null;


       }


    }


}


 


Collections集合工具类


    在这里只写几个常用方法:


    List<T> asList(T...a) : 将数组转换成集合;


    好处:可以使用集合的思想和方法来操作数组中的元素。


 


    和Collection的区别:(重点)


       1)Collection接口是单列集合的顶层接口,里面提供了集合类的共性操作方法,比如增删改查,


 


Collections:是单列集合的工具类,里面的方法要知道几个,折半查找,反转,将数组转换成集合,


   


    注意:将数组变成集合后,不可以使用集合中的增删方法,因为数组的长度是固定的。如果你增删会发生UnsupportedOperationException(不支持该操作)异常。


   


    如果数组中的元素都是对象,那么变成集合时,数组中的元素直接转换成集合中的元素。


    如果该数组中的元素是基本数据类型,那么会将该数组作为集合中的元素存在。


 


    <T>T[] toArray() : 将集合变数组;


    好处:可以限定对元素的操作,不需要进行增删了。


 


    那么指定类型的数组到底要定义多长呢?


    当指定类型的数组长度小于了集合的长度,那么该该方法内部会创建一个新的数组。


    当指定类型的数组长度大于了集合的长度,就不会创建新数组,而是使用传递进来的数组。


    所以创建一个刚刚好好的数组最优。


 


    高级for循环


 


    格式 for(类型 变量名 :被遍历的集合(Collection)或数组){}


   


    和迭代器的区别:


    1,高级for对集合进行遍历,只能获取集合中的元素,但不能对集合进行操作。


    2,迭代器处理遍历集合,还可以对集合中的元素进行remove操作,如果是ListIterator,还可以在遍历过程中对集合中的元素进增删的操作。


 


    传统for和高级for的区别:高级for必须有被遍历的目标。


 


    建议在遍历数组的时候,还是希望使用传统for,因为传统for遍历过程中可以对脚标进行操作。


 


    Map集合可以使用高级for吗?


       不可以直接使用,需要将Map集合转换成Set集合后,然后使用。



 


    修改:set(index,elment);


 


    获取:get(index);


       subList(from,to);


       listIterator();


 


    Lsit集合中判断元素是否唯一使用的是equals()方法。


   


    开发时怎么选择合适的集合使用:


    1,如果你取到的元素很多,元素当中涉及到频繁的增删操作,使用LinkedList集合


    2,如果同时涉及增删和查询时,可以使用ArrayList也可以使用LinkedList,建议使用ArrayList,因为更多的时候我们查询的情况更常见。


      


    |--Set:元素是无序的(存储和取出的顺序不一定一致),元素不可以重复。

            |--HashSet:底层数据结构是哈希表。

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

                    通过元素的两个方法,hashCode和equals方法来完成,如果元素hashCode相同,

                   还会判断对象的equal是否 为ture,如果元素hashCode值相同,则不会调用equals.实际开发时,

                  描述事物只要往集合中存储,一般都要覆写hashCode和 equals方法。

                  我们在存人对象时,hashCode方法中可以将年龄乘以一个值,可以义提    高比较效率。

         |--TreeSet:底层数据结构是二叉树。

             特点:可以对Set集合中的元素进行自然排序。

            排序的第一种方式:让元素自具备比较性,让对象实现·      Comparable接口,覆写ComparaTo方法。

            排序的第二种方式:当元素自身不具备比较性,或是具备的比较性不是所需要的,

                                           那么就让集合自身具备比较性,在集合初始化时就有了比较器

Map集合

    Map集合特点:该集合中存储都是键值对(也成为双列集合),一对一对 的往里存,必须保证键的唯一性。(可以

对集合中的键值进行排序)其实Set底层就是使用了Map集合。


    Map

       |--Hashtable:底层是哈希表数据结构,不可以存储null键,    null值,线程同步,

       |--HashMap:底层是哈希表数据结构,可以存储null键,null    值,线程不同步,

       |--TreeMap:底层是二叉树数据结构,不可以存储null键,null      值,线程不同步,可以用于给Map集合中的键进行排序。

    注意:Map集合中,添加元素时,如果键一样时,后面的键所对应的值会 覆盖原有的值。

  Map集合取出元素的两种方式:‘

  原理:将Map集合转换成Set集合,然后通过迭代器进行取出

    1,Set<k>keyset:将Map集合中的所有的键存储到Set集合中,因为Set集      合具备迭代器,所以可以迭代的方式

取出所有的键,然后通过键获取其对应的值。

  2, Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系取出存入到     Set集合中,而这个关系的数据类型就是

Map.Entry;


/**

 * Map.Entry<>由来,entry也是一个接口,它是Map集合中的一个内部接口
*/
interface Map {

    public static interface Entry {

       public abstract Object getKey();

       public abstract Object getValue();

    }

}

class HashMap implements Map {

    class Test implements Entry {

       public Object getKey() {

           return null;

       }

       public Object getValue() {

           return null;

       }

    }

}
  Collections集合工具类

  在这里只写几个常用方法:

List<T> asList(T...a) : 将数组转换成集合;

  好处:可以使用集合的思想和方法来操作数组中的元素。

和Collection的区别:(重点)

   1)Collection接口是单列集合的顶层接口,里面提供了集合类的共性操作方法,比如增删改查,

Collections:是单列集合的工具类,里面的方法要知道几个,折半查找,反转,将数组转换成集合,

 注意:将数组变成集合后,不可以使用集合中的增删方法,因为数组的长度是固定的。如果你增删会发生

UnsupportedOperationException(不支持该操作)异常。

  如果数组中的元素都是对象,那么变成集合时,数组中的元素直接转换成集合中的元素。

如果该数组中的元素是基本数据类型,那么会将该数组作为集合中的元素存在。

    <T>T[] toArray() : 将集合变数组;

好处:可以限定对元素的操作,不需要进行增删了。

 那么指定类型的数组到底要定义多长呢?

当指定类型的数组长度小于了集合的长度,那么该该方法内部会创建一个新的数组。

当指定类型的数组长度大于了集合的长度,就不会创建新数组,而是使用传递进来的数组。

所以创建一个刚刚好好的数组最优。

 高级for循环

      格式 for(类型 变量名 :被遍历的集合(Collection)或数组){}

 和迭代器的区别:

 1,高级for对集合进行遍历,只能获取集合中的元素,但不能对集合进行操作。

2,迭代器处理遍历集合,还可以对集合中的元素进行remove操作,如果是ListIterator,还可以在遍历过程中对集合

中的元素进增删的操作。

传统for和高级for的区别:高级for必须有被遍历的目标。

建议在遍历数组的时候,还是希望使用传统for,因为传统for遍历过程中可以对脚标进行操作。  Map集合可以使用高级for吗?  不可以直接使用,需要将Map集合转换成Set集合后,然后使用。

原创粉丝点击