7.集合

1.java中数据存储(内存中)的容器:①数组 ②集合

2.数组在数据存储方面的不足:

        ①数组一旦初始化,其长度就不可变

        ②如何获取真正初始化元素的个数,不方便。没有直接的方法可以使用。

        ③在数组中插入、删除某个元素时,比较繁琐


一.java中的集合框架

java.util.Collection

    其中定义的方法:

     ①add(Object obj) addAll(Collection coll) size() clear() isEmpty()

     ②remove(Object obj) removeAll(Collection coll) retainAll(Collection coll) constains(Object obj)  constainsAll(Collectionc coll) equals(Object obj)

     ③hashCode() toArray() iterator()


            |------List:用于存储有序的、可以重复的数据 ---"动态"数组

                    |------ ArrayList:主要实现类,线程不安全的,效率高,底层使用数组实现。

                    |------ LinkedList:对于频繁的删除和插入操作,效率较高,底层使用链表实现

                    |------ Vector:古老的实现类,线程安全的,效率低,底层使用数组实现。

>要求向List中添加的元素所在的类,必须重写equals()方法。原则:比较两个对象的属性值是否完全相同

>常用方法:添加:add(Object obj) 删除:remove(Object obj) / remove(int index)

                  修改:set(int index,Object obj) 查询:get(int index)

                  插入:add(int index,Object obj) 长度:size()

                  遍历:iterator() / 增强for循环/一般的for循环


|-----Set:用于存储无序的、不可重复的数据---高中讲的"集合"

             |----HashSet:是Set的主要实现类

                         |----LinkedHashSet:是HashSet的子类,对于频繁的遍历操作,建议使用此类。遍历时,可以按照添加元素的顺序实现遍历。

            |----TreeSet:涉及到给Set中添加的元素排序的问题(难点)

                    >要求添加到TreeSet中的元素必须是由同一个类所创建的对象

                    >自然排序:----Comparable接口 (抽象方法:int compareTo(Object obj))

                        1)要求自定义类实现java.util.Comparable接口

                        2)重写接口的compareTo(Object obj)方法,指明按照对象的哪个属性进行排序

                        3)直接向TreeSet中添加自定义类的对象即可

                >定制排序:----Comparator接口(抽象方法:int compare(Object obj1,Object obj2)

                    1)创建一个实现Comparator接口的实现类:MyComparator

                    2)重写其compare(Object o1, Object o2)方法,指明按照对象的哪个属性进行排序

                    3)创建一个实现类的对象,作为实参传递给TreeSet的构造器中: new TreeSet(Comparator com);

                    4)直接向TreeSet中添加compare方法中指明的类的对象即可

                >要求:重写的compareTo()或compare()与hashCode()、equals()要保持一致!

>要求向Set中添加的元素所在的类,必须重写equals()方法和hashCode()。    

    原则:hashCode()方法和equals()方法必须保持一致!

>Set中定义的方法与Collection中的方法是一致的。

>了解:Set中的元素是如何存储的?哈希算法!

        向Set中添加元素a,首先调用a所在类的hashCode()方法,此方法的返回值决定了元素a的存储位置。如果此位置上没有元素,则元素a添加成功。若此位置上已有元素b,那么继续调用a所在类的equals()方法,判断a与b是否相同。若相同,则元素a添加不成功。若equals()方法返回false,则元素a添加成功。


关于Collection的遍历:Iterator接口

        Collection coll = new ArrayList();

        coll.add(。。。);

        Iterator iterator = coll.iterator();

            while(iterator.hasNext()){

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

            }

7.集合_第1张图片
集合遍历

增强for循环:for(要遍历的结构的元素的类型 局部变量:要遍历的结构的引用名)

        for(Object obj : coll){

                System.out.println(obj);

        }

        int[] arr = new int[]{1,2,3,4,5];

         for(int i : arr){

                System.out.println(arr[i]);

            }


java.util.Map:存储的是一对一对的数据:键值对。(key-value)

    特点:Map中的所有的key使用Set存放==>要求key所在的类要重写hashCode()和equals()

            所有的value使用Collection存放==>要求value所在的类要重写equals()

             Map中的一个key-value对构成一个Entry。所有的Map中的Entry,使用Set存放。

             >Map中的key彼此不相同。

            >不同的key可以对应相同的value值

            >Map中的entry也是不相同的。

            >Map中的entry如何存储?根据Map中Entry的key来存储。根据key所在类的hashCode()方法,决定key(或entry)所在的位置,若此位置上没有值,则key(或entry)直接保存。若此位置上有值,则调用key所在类的equals()方法进行判断。若返回true,则将新的value值替换掉旧的value值。若返回false,则两个entry都保存成功。

7.集合_第2张图片
Map存储

|----HashMap:Map主要实现类,线程不安全的,可以存储null的key和null的value

         |---LinkedHashMap:HashMap的子类,可以按照添加的元素的顺序实现遍历

 |----TreeMap:可以按照key指定的属性的指定顺序排序:自然排序或定制排序

 |----Hashtable:Map的古老实现类,现在基本不用了。线程安全的,不可以存储null的key和null的value

         |----Properties:常用来处理属性文件。key和value都是String型

常用的方法:添加/修改: put(Object key,Object value) 删除:remove(Object key) 查询:get(Object key) 长度:size()

  遍历:keySet()  values()  entrySet()


操作集合的工具类:Collections

你可能感兴趣的:(7.集合)