zoukankan      html  css  js  c++  java
  • 集合框架和泛型

      使用的原因:

    1.数组长度是固定的,但需要的长度不固定的时候       2.如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象

    集合是接口,所以下面有实现类

                     List-- 具体类  ->ArrayList   LinkedList

    Collection----接口-->Set-  具体类   ->HashSet    TreeSet

    Collection接口存储一组不唯一、无序的对象(可以重复的对象,不会排序)

      boolean add(Object o),int size(),boolean contains(Object  o),boolean  remove  (Object  o),clear(),isEmpty(),iterator(),toArray()是Collection接口的方法,所以在List和Set中是通用的。

    List 接口存储一组不唯一、有序(插入顺序)的对象(可以重复的对象,因为有序,所以可以通过下标找对象)

      ArrayList:实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高,删除、插入会影响后面全部的元素,所以删除和插入元素不建议使用此                              集合

           注意:1、ArrayList中的 get (int  index)是获取集合中的下标对象,需要将对象转换成所需的对象,记得一定要转化类型。

              2、除了可以使用for去循环遍历元素,也可以使用foreach去遍历,但是接收的是Object类型,记得一定要转化类型

      LinkedList:采用链表存储方式。插入、删除元素时效率比较高,因为在上一个元素中有下一个元素的地址,空间不连续,插入、删除元素只影响邻近的两位元素,所以效率高

      ArrayList和LinkedList的异同:

                  相同点:都是以List的父接口

                  不同点:使用的场景不同,ArrayList适合遍历元素,LinkedList适合添加、删除元素

    Set 接口存储一组唯一、无序的对象(对象不重复,没有排序,因为Set中存入对象是存放对象的引用(地址))

      Set接口在添加对象的时候,会先判断此对象是否已经存在了(采用Object类的equals()方法比较两个对象是否是相等,也就是去比较两个内存地址是否相等 )

      注意:如果添加到Set中的是new  String ,值是相同的的,但也是添加了一个,是因为String类重写了Object类中的equals()方法,是对字符串的对比,不是地址的对比,所以只能添加一个。(只有String类的对象比较特殊)

    比如:

      Set set=new HashSet();

      String s1=new String ("java");

      String s2=s1;

      String s3=new String("java");

      set.add(s1);

      set.add(s2);

      set.add(s3);

      set.size();                 长度为1

    Set接口不存在get()方法,因为它是无序的,可以使用:

    1.增强型for

    2.使用迭代器Iterator实现遍历:获取Iterator---使用Collection接口的iterator()方法,所有的集合都有iterator()方法

    Iterator的方法:boolean  hasNext();判断是否存在另一个可访问的元素

           Object  next();返回要访问的下一个元素

    步骤:1.获得迭代器,通过集合的iterator()方法去获得,返回的类型是Iterator类型

       2.通过Iterator类型对象的hasNext()方法去判断集合是否有值,然后通过Iterator类型对象的next()方法得到元素,记得要转换类型。

    比如:

    NewsList newsList=new NewsList("xiao","刘诗诗和吴厅隆出现机场",1);
    NewsList newsList1=new NewsList("xiao","刘诗诗和吴厅隆出现机场",1);
      Set set=new HashSet();
      set.add(newsList);
      set.add(newsList1);
      Iterator iter=set.iterator();
      while(iter.hasNext()){
       NewsList news=(NewsList)iter.next();
       System.out.println(news.getName());
      }

    Map---  具体类-->HashMap   TreeMap(Map不是Collection下的接口,它跟List   Set没有关系)

    Map 接口存储一组键值对象,提供Key到Value的映射(键Key是唯一的、无序的,值Value可以是重复的),一 一对应的就可以使用此接口

     遍历Map的方法:

    1:
      Map map=new HashMap();
      map.put("cn", "中国");
      map.put("jp","日本");
      map.put("usa", "美国");
      
      //分别为获取Map中的键和值
      //方法一:先获取到每个key,然后根据每个key拿到相应的value
      Set keys=map.keySet();
      for(Object obj:keys){
       String key=(String)key;
       String value=(String)map.get(key);
       System.out.println(key+"-"+value);
      }

    2:

    //方法二:使用Iterator迭代器拿到每个key
      Iterator ite=keys.iterator();
      while(ite.hasNext()){
       String key=(String)ite.next();
       String value=(String)map.get(key);
       System.out.println(key+"-"+value);
      }

    3:

    //(2)先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值
      Set s=map.entrySet();//Map中所有键值对的集合
      for(Object obj:s){
       Map.Entry mm=(Map.Entry)obj;//Map中的每一个键值对(Map.Entry)
       Object key=mm.getKey();//取出每个键值对中的键
       Object value=mm.getValue();//取出每个键值对中的值
       System.out.println(key+"-"+value);
      }

    算法类:Collections,提供了对集合进行排序。遍历等多种算法实现

     实现一个类的对象之间的比较大小,该类在实现Comparable接口,重写compareTo()方法

     集合中不可以存放基本数据类型,就算放了基本数据类型,Java虚拟机会将它装箱成Object类型

    泛型:因为上述的集合没有规定类型,所以如果放入的类型不同,那么就会存在数据的混乱,所以才会有泛型的出现,去规定类型,保证类型转换的安全和稳定性

    语法如下:

    类1或者接口<类型参数>  对象= new  类1<类型实参>();

  • 相关阅读:
    iOS真机调试配置
    C语言-09-文件操作
    C语言-08-预处理器
    UILabel和NSAttributedString那些事
    验证码倒计时按钮
    验证码/密码按位分割输入框
    CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
    UISearchBar改变搜索框的高度
    二维码名片的生成与读取
    设计模式-02-单例
  • 原文地址:https://www.cnblogs.com/shmilynanmei/p/8849903.html
Copyright © 2011-2022 走看看