三、集合和泛型

第三节:集合和泛型

1.Collection接口是集合类的根接口,没有实现类。但是Set和List继承了Collection.
    Set是元素唯一,无序的集合
    List是元素不唯一,排列有序的集合
 
2.Map是java.util包的另一个接口,和Collection接口没有关系,相互独立,但都属于结合类的一部分。Map包括key-value对,key和value都是引用类型。
   key不可重复,value可重复。同一个Map对象的任何两个key通过equals方法比较结果总是返回false。
 
3.Iterator,所有的集合都实现了Iterator接口,用户遍历集合元素的接口,包含三种方法:
    hasNext():是否还有下一个元素;
    next():返回下一个元素;
    remove():移除当前元素
 
4.区别:
 
---|Collection: 单列集合
                    ---|List: 有存储顺序, 可重复
                                        ---|ArrayList:  数组实现, 查找快, 增删慢由于是数组实现, 在增和删的时候会牵扯到数组
                                            增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快
                                        ---|LinkedList: 链表实现, 增删快, 查找慢由于链表实现, 增加时只要让前一个元素记住自
                                                                己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素。
                                                                这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低
                                        ---|Vector:  和ArrayList原理相同, 但线程安全, 效率略低和ArrayList实现方式相同, 
                                                           但考虑了线程安全问题, 所以效率略低
                    ---|Set: 无存储顺序, 不可重复
                                        ---|HashSet:线程不安全,存取速度快。底层是以哈希表实现的。
                                        ---|TreeSet:红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。
                                        ---|LinkedHashSet:会保存插入的顺序。
---| Map: 键值对
                    ---|HashMap:底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,和equals方法。
                                        ---|LinkedHashMap:该子类基于哈希表又融入了链表。可以Map集合进行增删提高效率。
                    ---|TreeMap:底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator 进行比较排序。return 0,来判断键的唯一性。
                    ---|HashTable
                   
 
5:Collection接口的共性方法
增加:
       1:add()   将指定对象存储到容器中
                       add 方法的参数类型是Object 便于接收任意对象
       2:addAll() 将指定集合中的元素添加到调用该方法和集合中
删除:
       3:remove() 将指定的对象从集合中删除
       4:removeAll() 将指定集合中的元素删除
修改
       5:clear() 清空集合中的所有元素
判断
       6:isEmpty() 判断集合是否为空
       7:contains() 判断集合何中是否包含指定对象
            
       8:containsAll() 判断集合中是否包含指定集合
                            使用equals()判断两个对象是否相等  
获取:   9:int size()    返回集合容器的大小
转成数组10: toArray()   集合转换数组
 
*************:
ArrayList 和 LinkedList的存储查找的优缺点:
1、ArrayList 是采用动态数组来存储元素的,它允许直接用下标号来直接查找对应的元素。但是,但是插入元素要涉及数组元素移动及内存的操作。总结:查找速度快,插入操作慢。
2、LinkedList 是采用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快
问题:有一批数据要存储,要求存储这批数据不能出现重复数据,ArrayList、LinkedList都没法满足需求。解决办法:使用 set集合。
 
迭代器遍历集合:
迭代器遍历注意:

 

泛型

 
1.泛型: 就是将类型当作变量处理。规范泛型的定义一般是一个大写的任意字母。
2.函数上的泛型定义:
      当函数中使用了一个不明确的数据类型,那么在函数上就可以进行泛型的定义。
 
 public <泛型的声明> 返回值类型  函数名( 泛型 变量名  ){
  
  }
3.类上的泛型声明
      
    修饰符 class 类名<泛型>{
 
      }
4.类型变量扮演的角色就如同一个参数,它提供编译器进行类型检查的条件。
5:类泛型 细节
        创建对象的时候要指定泛型的具体类型
        创建对象时可以不指定泛型的具体类型(和创建集合对象一眼)。默认是Object,例如我们使用集合存储元素的时候没有使用泛型就是那么参数的类型就是Object
        类上面声明的泛型只能应用于非静态成员函数,如果静态函数需要使用泛型,那么
            需要在函数上独立声明。
        如果建立对象后指定了泛型的具体类型,那么该对象操作方法时,这些方法只能操作一种数据类型。
        所以既可以在类上的泛型声明,也可以在同时在该类的方法中声明泛型。
 
6.泛型上限: 表示参数化的类型可能是所指定类型,或者是其子类。
 
 
7.泛型下限:泛型下限:使用的泛型只能是本类及其父类类型上应用的时候,就必须使用泛型的
 
8.java中的泛型,只在编译阶段有效
        泛型类型在逻辑上可看成多个不同类型,但是在几时运行间断都是相同基本类型。
 
注意事项:
    
 
细节:
细节一: 声明好泛型类型之后,集合中只能存放特定类型元素
细节二: 泛型类型必须是引用类型
细节三: 使用泛型后取出元素不需要类型转换.
 
 
 
posted @ 2018-09-06 13:38  z西梅  阅读(165)  评论(0编辑  收藏  举报