黑马程序员---Collection学习总结

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------


Collection容器学习总结:
 1. Collection是所有容器都会实现的一个根接口,他下面又细分了List,Map,Set三大子接口,Collection实现了数组的所有功能,和数组相比,Collection可以动态的改变
  大小,其操作元素的方式也更灵活,并且,Collection支持泛型


 2.List容器是一个顺序存取容器,arrayList实现了List接口,其内部采用数组的数据结构,数组的初始大小为10,当要存入 的元素数大于数组大小时arrayList会创建一个新的数 组,其大小为原数组的1.5倍,并把原数组中的元素复制到新数组中去。因为arrayList内部采用了数组的数据结构,所以其查询数度快,但插入和删除元素较慢;linkedList也是List的实现类,和arrayList不同,LinkedList采用了链表的数据结构,因链表元素间是逻辑上的顺序排列,所以不必创建数组,没有旧数组向新数组复制元素的操作,其插入和删除操作比arrayList快,但查询数度不比arrayList。

 3.Map容器是映射关系类型的容器,它采用键值对的方式,将键映射到值的对象上,以在元素间建立映射关系,一个映射不能包含重复的键,每个键最多只能映射到一个值,可以通过键集,值集或键值映射关系集的形式查看某个映射的内容。HashMap底层采用Hash码方式存储数据,Hash码存储方式可以提供近乎数组方式的查询速度,其插入和删除操作效率和LinkedList相当,因此它是综合性能最好的一种数据存储结构,因采用Hash码,其中的元素是无序的; Map容器不允许其中有重复的健,其中HashMap根据Hashcode()函数和equals()函数来判断健是否重复,可以重写这两个函数来改变健的重复判断标准;TreeMap底层采用红黑树的存储结构,它根据键的自然顺序对元素进行排序,因此他要求存入其中的健本身具备可比较性,让键实现comparable()接口可以使键具备可比性,键需要实现comparable()接口中的compareTo()函数以定义具体的比较规则。


 4. Set容器不允许有重复元素,判断重复的规则根据是根据存入其中的元素本身的equals()函数来指定的,可以通过重写这个函数来修改判定规则,Set拥有Collection完全一样的方法,Set底层采用了Map的数据结构,只是Set只使用了Map中的键,没有使用它的值;当Set底层采用了TreeMap数据结构即treeSet时,要求元素实现comparable()接口以具备可比性这和treemap一样,当Set底层采用hashMap数据结构时,要求元素重写equals()和Hashcode();除Map接口类型的容器外,其它类型的容器都实现了Collection接口中的共性方法,因此,可以通过Collection接口中定义的共性方法来操作具体的容器类,常用的共性方法是:add(),remove(),contains(),iterator();
常用的Map接口类型的容器的共性方法是:containskey(),containsValue(),entrySet(),keySet(),put(),remove(),values();

 5. 所有的容器都支持泛型,泛型允许抽象的数据类型,即在容器类被实例化之前,可以不必确定容器中可存储的具体对象类型,只在实例化的时候指定就行了,这样可以避免
  为不同的数据类型编写不同的容器,以提高代码的复用性;

  List类的用法示例:
      ArrayList:
      创建:arrayList<String> al=new arrayList<String>();尖括号内为用户想要存入的数据类型,这里假设为String类型
      插入:al.add("arrayListDemo");在列表末尾插入元素
               al.add(2,"indexadd");在列表指定位置插入元素
      修改 :al.set(0,"a new element");第一个参数元素索引,第二个参数新的元素
      删除:al.remove(0);其参数是待删除的元素索引
      查询:al.contains("contain");其参数是被查询的对象
      遍历:方法一:iterator i=al.iterator();//这种迭代器只能正向遍历,功能简单,不能执行插入修改操作
                 while(i.hasNext()){
                    String s=i.next
                    System.out.printlns();
                 }
                 方法二:listIterator li=al.listIterator();//这个迭代器是列表特有的迭代器,他在iterator的基础上,添加了插入和修改的功能,并且可以逆序遍历
                    while(li.hasNext()){
                    String s=li.next();
                    System.out.println(s);
                    }
       通过listIterator进行插入和修改操作和逆序遍历:
             插入操作:li.add("listIterator add");
             修改操作:li.set("listIterator set"); 
             逆序遍历:while(li.hasPrevious()){
                       String s=li.previous();
                       System.out.println(s);
                       }
  linkedList 的用法和arrayList基本相同,只是底层数据结构不同而已,不再举例;


  Map类用法举例:

       TreeMap:
       创建:treeMap<String,String>mtp =new treeMap<String,String>();Map必须以键值对的形式存在,所以初始化的时候要要指定键和值的类型
       插入: mtp.put("zhangshan","30");以键值对的方式插入一个元素,第一个参数为键,第二个参数为值,当待插入的元素中的键在容器中已经存在时,新
       插入的值将覆盖容器中原有的值,并将原有的值作为函数返回值返回给调用者
       修改:修改操作和插入操作方法一样;
       删除:mtp.remove("zhangshan");其参数为待删除元素的键,如果删除成功,返回已删除元素的值,否则返回null
       查询:mtp.get("zhangshan");返回被查询键对应的值
       判断指定键是否存在:mtp.containsKey("zhangshan");
       判断指定值是否存在:mtp.containsValue("30");
       当将用户自定义的数据类型作为键存入treeMap集合时,必须让用户自定义数据类型具备可比性,这可以通过实现comparable()接口并定义里面的compareTo()函数来
       使用户自定义数据类型具备可比性:
         class myclass implements comparable<myclass>{
           public int compareTo(myclass p){
           //这里面写具体的判断逻辑
           } }


           或者给treeMap初始化时传入一个比较器comparator():
           treeMap<myclass,String> tm= new treeMap<myclass,String>(new comparator(myclass){
                                                                                                                   public int compare(myclass p,myclass p1){
                                                                                                                   //判断逻辑代码
                                                                                                                   }}
        经过上面的步骤,就可以将用户自定义数据类型作为键存入treeMap集合了;
       
       hashMap:
       hashMap 的用法基本和treeMap相同,当要将用户自定义数据类型作为hashMap中的键时,要求用户自定义数据类型重写其hashCode()和equals()函数:
       class myhash{
          public int hashCode(){
           //用户自己根据需要决定是否重写这个函数
           }
           public int equals(myhash p){
           //这里定义判断用户自定义数据类型相同的逻辑,必须重写
           } }


        遍历:Map 类的遍历要用到map.entry这个内部类,通过Map的entrySet()函数,这个函数返回map.entry<k,v>的Set集合,再通过entry中的函数,就能遍历
        Map集合了:
        Set<Map.Entry<String,String>> ms=mtp.entrySet();
       iterator<Map.Entry<String,String>> it=ms.iterator():
       Map.Entry<String,String> me=null;
        while(it.hasNext()){
        me=it.next();
        System.out.println(me.getKey()+me.getValues());
         }  


  Set类用法示例:
     treeSet:底层采用treemap数据结构,因此被插入的元素或者要实现comparable接口,或者重写元素本身的equals()函数,以使元素具备可比性,Set中不包含
     重复元素,因此Set中不包含e1.equals(e2)为真 或者e1.compareTo(e2),为真的元素,也可以在实例化时给treeSet传入一个比较器,这和操作treeMap一样;
     因set用法和Collection用法相同,不再举例;
     HashSet:底层采用Hash表数据结构,其保证元素唯一性的依据是元素的HashCode()和equals()函数,可以通过重写这两个函数来定义用户自定义规则;
     其用法和上面的类类似,不再举例。
  
   properties类用法:
   properties类是hashtable的子类,它是一个线程安全的类,用来读取或存储配置信息,和Map其它类不同的是其可以操作流:
   properties p = new properties();
   File f=new File("D:\\my.ini");
   p.load(new fileInputstream(f));//从流中读取数据
   p.store(new fileOutputstream(f));//将数据保存到流中
   p.getProperty(String key)//读取键值用这个函数,也可以用get()推荐用这个
   p.setProperty(String key, String value) //设置键值用这个函数,也可以用put(),推荐这个
   其它操作和Map其它类相似,不再举例

 

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

详细请查看:www.itheima.com
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值