• Java集合框架


    1. 集合

    1.1 什么是集合

      面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式(容器)
    Java中集合也是类,真正用来存储东西的是某种集合类的实例对象

      Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*
      Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)

    1.2 集合和数组的区别

    集合

      1.长度是可变的

      2.只能用于存储对象的引用

      3.对象可以是不同类型

    数组

      1.长度是固定的

      2.可以存储基本数据类型

      3.也可以存储对象的应用

      4.必须是相同类型

    2. Collection接口

    2.1 Collection说明

      Collection 层次结构中的根接口
      Collection 表示一组对象,这些对象也称为 Collection 的元素。
      一些 Collection 允许有重复的元素,而另一些则不允许。

      Collection接口有两个子接口

      List接口:可存放重复元素,元素存取是“有序”的。

      Set接口:不可以存放重复元素,通常元素存取是“无序”的,也有一些实现类元素是“有序”的。

      (ps:“有序”,“无序”指的是存放元素时是否会记住元素存放的顺序,并非对元素进行“排序”)

     2.2 Collection接口方法

       添加:

      boolean add(Object e)
      boolean addAll(Collection c)

      删除:
      boolean remove(Object o)
      boolean removeAll(Collection c)

      查询:
      int size()

      判断:
      boolean isEmpty()
      boolean contains(Object obj)
      boolean containsAll(Collection c)

      返回包含此 collection 中所有元素的数组。

      Object toArray()

    2.3 迭代器

      迭代操作
      Iterator iterator()

      说明:
      1.迭代器不保证取出元素的顺序和存入的顺序一致,“有序”是靠集合实例本身保证的。
      2.迭代器本身是一个接口,该方法返回的是一个迭代器实例对象,通常使用的是接口多态使用迭代器
      3.迭代器中常用的两个方法是:
      boolean hasNext():判断是否有下一个元素
      Object next():取出下一个元素

    Collection c = new ArrayList();    //创建集合对象
    Iterator it = c.iterator();    //获取此集合的迭代器
    while(it.haxNext()){        //遍历这个集合
        Object o = it.next();
    }

    3. List说明

    3.1 List接口中常用类

    ArrayList:  线程不安全,查询速度快,底层用的是数组,增删慢

    LinkedList:  线程不安全,链表结构,增删速度快,查询慢

    Vector:   线程安全,但速度慢,已被ArrayList替代

    3.2 List接口特有的方法

    方法 说明
    void add(int index, Object element) 在列表的指定位置插入指定元素。
    Object get(int index) 返回列表中指定位置的元素。
    Object set(int index, Object element) 

    用指定元素替换列表中指定位置的元素。

    3.3 增强for循环

    说明:增强for循环是迭代器的一种简化方式

    格式:

      for(Object  obj  :  c){
      //do something with obj
      }

      Object   元素类型

      obj         迭代变量名

      c            集合名

    3.4 List接口遍历的方式

    1. 迭代器遍历
    2. 增强for循环
    3. 普通for循环配合使用get方法

    3.5 迭代器Iterator

      迭代是取出集合中元素的一种方式
      因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器
      两种用法:(常用第二种)

      第一种

    for(Iterator iter = iterator();iter.hasNext();){
        System.out.println(iter.next());
    }

      第二种

    Iterator iter = l.iterator();
    while(iter.hasNext()){
        System.out.println(iter.next());
    }

      迭代器在Collcection接口中是通用的。
      迭代器的next方法返回值类型是Object,所以要记得类型转换。

    4. Array List

    4.1 ArrayList概念&去重

      通过数组来实现,擅长读操作,有容量概念,扩容发展50%。

       ArrayList对自定义类对象去重思路:

      思路一:  新建一个集合,判断新集合中是否存在(contains)旧集合中的元素,不存在则添加(add)

      思路二:  使用双重for循环, 从前往后和从后往前两种方式进行比较。

    4.2 并发修改异常

      在使用迭代器和增强for循环遍历ArrayList的时候,使用集合本身的方法修改了集合,将导致并发修改异常:ConcurrentModificationException(两个不要交叉使用)

      foreach本质上:是使用了迭代器

      正确做法:

    1. 使用迭代器遍历,使用迭代器删除(修改)元素
    2. 使用集合本身遍历且非foreach,使用集合本身方法删除(修改)元素

    5. LinkedList

      内部通过链表实现,擅长写操作,通过指针引用实现,检索的对象时从两头检索,看索引位于哪个半段范围中。内部存放了首尾两个节点,元素通过node连接在一起。Node由item 、 prev、 next构成,检索最坏情况不会超过半数。

    集合 说明/实现 结构 线程安全 特有方法
    List 有序,可重复 判断是否存在的标准是判断equals是否相等。同时支持null。
      ArrayList 底层通过数组实现,擅长读,容量概念,默认10超过则扩容(通过拷贝,扩容一半) 不安全 add()
      LinkedList 底层通过链表实现,擅长写,通过指针引用实现。 不安全 addFirst()/addLast()/remove()
      Vector 可以看作线程安全版的ArrayList 安全  
     
    Set 无序,不重复      
      HashSet 线程不安全,存取速度快 不安全

    重写hashCode()原则:让所有的成员变量都参与计算
    重写equals方法的原则:让所有的成员变量都参与比较

      LinkedHashSet 在HashSet基础上增加了链表:记录元素的顺序,无特殊方法    
      TreeSet      
     
    Map Key-Value, Key有Set特点     put()
      Hashtable 线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。 安全  
      HashMap

    数组+链表实现,线程不安全,速度快,允许存放null键,null值

    HashMap的底层实现是散列表,因此它内部存储的元素是无序的

    不安全  
      TreeMap

    TreeMap的底层实现是红黑树,所以它内部的元素的有序的,可以自动排序。

    排序的依据是自然序或者是创建TreeMap时所提供的比较器(Comparator)对象。

    根据使用的构造方法决定是使用元素本身可比性,还是使用集合的可比性

    不安全  
    且将新火试新茶,诗酒趁年华。
  • 相关阅读:
    UE4 ios环境搭建备忘
    我所理解的打击感 逐帧分析过几十款游戏的开发者经验分享
    可重入锁和不可重入锁
    Java中JDK和JRE的区别是什么?它们的作用分别是什么?
    Java开发岗位面试题
    详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
    docker:轻量级图形页面管理工具Portainer
    Docker整合dockerfly实现UI界面管理(单机版)
    docker for mac的JSON配置文件中的hosts项修改后无法生效
    Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本
  • 原文地址:https://www.cnblogs.com/share23/p/9575279.html
Copyright © 2020-2023  润新知