学习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变成安全的.
posted @ 2020-03-30 15:23  无名之辈c  阅读(122)  评论(0编辑  收藏  举报