ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

集合和泛型

2021-12-01 17:03:17  阅读:155  来源: 互联网

标签:map ArrayList Collection 集合 add 泛型 new


集合框架

1 为什么需要集合框架

数组只能存储固定的数量,相对简单。

在运行时才能知道对象的类型或数量而且需要把这些对象存在某种容器中。

2 概念

集合框架是为表示和操作“多个对象”而规定的一种统一的标准体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法

接口:即表示集合的抽象数据类型。

实现:也就是集合框架接口的具体实现。

算法:在一个实现了某个集合框架中的接口的对象完成某种有用的计算的方法

注意:集合只能存放对象

3 集合框架体系结构

3.1 顶级接口Collection

Collection接口可重复

3.2 List接口

存放的元素有序且允许有重复的集合接口

API文档查看常用方法

3.3 Set接口

存放的元素无序且不允许有重复的集合接口

API文档查看常用方法

4 List集合的遍历输出(ArrayList为例)

4.1 普通for循环

     List list=new ArrayList();
    list.add("Hello");
    list.add("World");
    list.add("HAHAHAHA");
for(int I = 0;I < list.size(); i++){
System.out.println(list.get(i));
}

 

4.2 增强for循环

     List list=new ArrayList();
    list.add("Hello");
    list.add("World");
    list.add("HAHAHAHA");
for(Object obj : list){
        System.out.println(obj);
    }

 

4.3 迭代器

        List list=new ArrayList();
       list.add("Hello");
       list.add("World");
       list.add("HAHAHAHA");
       Iterator iterator = list.iterator();
       while (iterator.hasNext()){
           System.out.println(iterator.next());
      }

5 Set集合的遍历输出(HashSet为例)

5.1 增强for循环

        Set set = new HashSet();
       set.add("hello");
       set.add("world");
       set.add("hhh");
       for (Object o : set){
           System.out.println(o);
      }

5.2 迭代器

        Set set = new HashSet();
       set.add("hello");
       set.add("world");
       set.add("hhh");
       Iterator iterator = set.iterator();
       while (iterator.hasNext()){
           System.out.println(iterator.next());
      }

6 Map顶级接口

键值对

6.1 HashMap实现类

基于哈希表的Map接口的实现。允许使用null键和null值。

6.2 HashTable实现类

此类实现一个哈希表,该哈希表将键映射到相应的值。

7.3 TreeMap实现类

基于红黑树(Red-Black tree)的 NavigableMap实现。

7 Map集合的遍历输出(HashMap为例)

7.1 增强for循环

        Map map = new HashMap();
       map.put("1","11");
       map.put("2","22");
       map.put("3","33");
       Set set = map.keySet();
       for (Object obj : set){
           Object values = map.get(obj);
           System.out.println(values);
      }

7.2 迭代器

        Map map = new HashMap();
       map.put("1","11");
       map.put("2","22");
       map.put("3","33");
       Set set = map.keySet();
       Iterator iterator = set.iterator();
       while (iterator.hasNext()){
           Object keys = iterator.next();
           Object values = map.get(keys);
           System.out.println(values);
      }

8 集合类Collections

API文档常用方法: sort,max,min,addAll

9 常见面试题

9.1 常用集合存储元素的特点

ArrayList和LinkedList:有序,可重复,可为空,线程不安全

Vector:有序,可重复,可为空,线程安全

HashSet:无序,不可重复,可为空,线程不安全

HashMap:无序,(键)不可重复,可为空,线程不安全

HashTable:无序,不可重复,不可为空,线程安全

TreeMap:有序,不可重复,不可为空,线程不安全

9.2 ArrayList和LinkedList的区别和联系

ArrayList数组线性表:

特点:类似数组的形式进行存储,因此它的随机访问速度极快

缺点:不适于频繁进行插入和删除操作,因为每次插入和删除都需要移动数组中的元素

LinkedList链式线性表:

特点:适合于在链表中间需要频繁进行插入和删除操作

缺点:随机访问速度较慢,查找一个元素需要从头开始一个一个找,即查找速度较慢

10 扩展:HashTable的特殊两种遍历方法

        Hashtable map = new Hashtable();
       map.put("1","11");
       map.put("2","22");
       map.put("3","33");
       Enumeration keys = map.keys();
       while (keys.hasMoreElements()){
           Object key = keys.nextElement();
           String values = (String) map.get(key);
           System.out.println(values);
      }
        Hashtable map = new Hashtable();
       map.put("1","11");
       map.put("2","22");
       map.put("3","33");
       Enumeration values = map.elements();
       while (values.hasMoreElements()){
           String str = (String) values.nextElement();
           System.out.println(str);
      }

11 扩展:lambda表达式

JDK8的一个重要特性,它使用一个清晰简洁的表达式表示一个接口,同时简化了对数组、集合的遍历、过滤和提取操作。

11.1 格式

参数列表 -> 表达式主体

参数列表:向表达式传递接口方法需要得参数

->:箭头/箭牌,指定参数的指向

表达式主体:接口中抽象方法的实现(一条语句时可以省略大括号)

11.2 数组遍历

        Integer [] i ={1,3,2,5,4};
       Arrays.asList(i).forEach(arr -> System.out.println(arr));

11.3 单列集合遍历

        ArrayList arrayList = new ArrayList();
       arrayList.add(1);
       arrayList.add(3);
       arrayList.add(5);
       arrayList.add(2);
       arrayList.add(4);
       arrayList.forEach(arr -> System.out.println(arr));

11.4 双列集合遍历

        HashMap hashMap = new HashMap();
       hashMap.put(1,2);
       hashMap.put(2,3);
       hashMap.put(3,4);
       hashMap.forEach((key,value) -> System.out.println(key+" "+value));

泛型

1 为什么需要泛型

为了解决程序中的警告与数据类型不同的问题

2什么是泛型

参数化类型

3 使用泛型的好处

  1. 确定集合中的数据类型(在数据类型对象存储不一样时,把运行时异常转移到编译时异常)

  2. 避免了强转的麻烦

4泛型的分类(不能是基本数据类型)

  1. 泛型接口

    接口、实现类都是泛型类型

    接口为泛型,实现类不是泛型

  2. 泛型类

  3. 泛型方法

  4. 泛型数组

  5. 通配符(?)

            // 如果要明确写出泛型时,前后必须一致
    Collection <Object> c1 = new ArrayList<Object>();
    // Collection <Object> c2 = new ArrayList<Animal>(); // 报错
    // Collection <Object> c3 = new ArrayList<Dog>(); // 报错
    // Collection <Object> c4 = new ArrayList<Cat>(); // 报错

    // ?(通配符) 表示任意的类型都可以
    // Collection <?> c5 = new ArrayList<Object>();
    // Collection <?> c6 = new ArrayList<Animal>();
    // Collection <?> c7 = new ArrayList<Dog>();
    // Collection <?> c8 = new ArrayList<Cat>();

    // ? extends E :向下限定,E只能是E本身及其子类
    // Collection <? extends Animal> c9 = new ArrayList<Object>(); // 报错
    // Collection <? extends Animal> c10 = new ArrayList<Animal>();
    // Collection <? extends Animal> c11 = new ArrayList<Dog>();
    // Collection <? extends Animal> c12 = new ArrayList<Cat>();

    // ? super E:向上限定,E只能是E本身或者其父类
    Collection <? super Animal> c13 = new ArrayList<Object>();
    Collection <? super Animal> c14 = new ArrayList<Animal>();
    // Collection <? super Animal> c15 = new ArrayList<Dog>(); // 报错
    // Collection <? super Animal> c16 = new ArrayList<Cat>(); // 报错

     

5 泛型类型参数命名

  1. E:元素

  2. T:类型,第一通用型参数

  3. K:键

  4. V:值

  5. N:数字

  6. S:类型,第二通用型参数

  7. U:类型,第二通用型参数

  8. V:类型,第二通用型参数

6 小结

  1. 泛型不能使用基本数据类型

  2. 泛型不能使用实例

  3. 使用泛型时,类型参数不能为静态的(静态变量在对象之间共享,编译器无法确定要使用的类型)

  4. 不能使用instanceof运算符

  5. 泛型不能重载和捕捉异常

  6.  

标签:map,ArrayList,Collection,集合,add,泛型,new
来源: https://www.cnblogs.com/yb6yb6yb6/p/15629777.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有