• 学习Java的第16天


    学习Java的第16天

    1.Java集合框架的概述

    1. 集合和数组都是对多个数据进行操作的结构,简称Java容器。

      此时的存储主要指的是内存的存储,不涉及到持久化的存储。

    2. 数组存储多个数据的特点:

      • 一旦初始化以后,数组的长度就确定了。
      • 声明类型后,元素的类型也就确定了。
      • 缺点:
        • 不可以修改长度。
        • 数组提供的方法非常有限,对于添加,删除,插入数据等操作十分不便。
        • 获取数组实际元素的个数的需求,数组没有现成的方法可以用。
        • 数组存储数据的特点:是有序的,可重复,对于无序,不可重复的需求,不可满足。
    3. Java集合可分为Collection和map两种体系。

      • collection接口:单例数据,定义了存取一组对象的方法的集合
        • List:子接口:元素有序,可重复的集合。
        • Set:子接口:元素无序,不可重复的集合。
      • Map接口:双列数据,保存具有映射关系的key—value的集合

    2.集合框架

    1. |----collection:单例集合,存储一个一个的对象。

      ​ |-----list:存储有序,可重复的数据。//动态数组

       		|-----实现类:Arraylist Vector LinkList  
      

      ​ |------set:存储无序的,不可重复的数据。//

      ​ |-----实现类hashSet,LinkHashMap,TreeSet

      |-----map:双列集合,用来存取一对的数据。一一对应//y= f(x)

      ​ |-------HashMap,LinkHashMap,tree,Hashtable,propeties

    3.Collection接口中的方法的使用

    注意:在添加对象时,要重写类中的equals方法
    1. size(): 获取元素的个数。

    4.集合元素的遍历操作,使用迭代器Iterator接口

    1. 遍历集合的格式:

         @Test
          public void test1(){
              Collection c1 = new ArrayList();
              c1.add(123);//自动装箱
              c1.add(new String("小米最垃圾"));
              System.out.println(c1);
              Iterator iterator = c1.iterator();
              while (iterator.hasNext()){
                  System.out.println(iterator.next());
              }
          }
      
    2. 内部定义了remove()可以在迭代的时候删除集合中的元素。

      • 不能连续两次调用迭代器中的remove()。

    5.增强for循环

    • 利用迭代器赋值不会改变集合内部元素的值

    6.List接口的概述

    1. List的三个实现类异同:
      1. ArrayList :线程不安全,效率高,底层使用Object[]
      2. LinkList: 底层使用的是双向链表。有利于频繁的遍历。
      3. vector:线程安全,效率低。底层使用的是Object[]
    2. 三个实现类的源码分析
      1. ArrayList:jdk7中底层先造一个10的数组 之后不够了,在按照当前数组长度的1.5倍去扩容,jdk8中先初始化为0,添加时在初始化为10,相比较于之前比较节省内存空间。
      2. LinkList:底层是用双向链表实现的。
      3. Vector:底层也是构造了一个10的数组,当长度不够时,增加长度为当前的2倍。

    7.Set接口

    1. Set存储的无序性和不可重复性

      • 无序性:利用hash值通过算法算出具体位置.
      • 不可重复性:
    2. 添加元素的过程

      • 我们在向HashSet中添加元素a,首先调用a所在类的HashCode()方法,计算出元素的哈希值,此哈希值接着通过某种算法算出在HashSet底层数组中的存放位置
      • 判断此数组的该位置是否有元素存在,没有则直接添加.
      • 如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a和b的hash值,如果hash值不同,元素a添加成功,如果相同就通过Equals()方法比较,如果相同就添加失败。
      • 注意指定位置上的如果存在多个不同hash值的数据,按照链表的形式存储 jdk8是后继存储 jdk7是前驱存储。
    3. LinkHashSet作为HashSet的子类,在添加数据的同时,每个数据还添加了两个指针,记录了前一个数据的地址和后一个数据的地址。

    4. TreeSet的使用:

      • 1.向TreeSet中添加的数据,要求是相同类的对象。
      • 2.并且按照指定方法排序。列如int按照从小到大。
      • 3.在自定义类中可以通过实现Comparable接口,重写compara方法,来进行自然排序,comparaTo():返回值为0,那么相同.

    8.Map接口

    1. Map的实现类
    • HashMap():Map的主要实现类, 线程不安全的,效率高.可以存储null的key和value.
      • 底层:数组+链表+红黑树
    • LinkhashMap:保证在遍历map元素时,可以按照添加的顺序遍历
      • 对于频繁的遍历操作,效率较高.
    • HashTable():线程安全的,效率低.不可以存储null的key和value.
    • TreeMap:可以保证按照添加的key_value对进行排序,实现排序遍历. 底层使用的是红黑树.
      • 添加的key_value必须是同一个类的key,因为要按照key来排序
    • properties:常用来处理配置文件. key_value都是String类型.
    1. Map结构的理解

      • Map中的key,无序的不可重复的,使用set存储所有的key.
      • map中的value:无序的,可重复的,使用Collection 存储所有的Value
      • 一个键值对构成了一个Entry对象.
      • Map中的Entry: 无序的,不可重复的,使用Set存储所有的Entry
    2. HashMap的底层实现原理

    3. TreeMap

      • 可以自定义排序通过实现comparable接口

    9.Collections工具类的使用

    • Collections 是一个操作 Set、List 和 Map 等集合的工具类
    • Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作, 还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
    • Collections 类中提供了多个 synchronizedXxx(list) 方法,将线程不安全的ArrayList和HashMap变成安全的.
  • 相关阅读:
    879. 盈利计划 力扣 动态规划 难
    js 在浏览器中使用 monaco editor
    py 时间处理
    Xpath in JavaScript
    js 拖拽排序
    JavaScript如何获取网页的宽高,以及如何兼容(各种坑详解)
    JavaScript删除对象的某个属性的方法
    CSS渐变知识
    如何选定搭建个人独立博客工具
    Codeforces Round #714 (Div. 2) 题解(A-D)
  • 原文地址:https://www.cnblogs.com/wumingzhibei/p/12598841.html
Copyright © 2020-2023  润新知