java笔记一

对象的容器,定义了对多个对象进行操作的常用方法,可实现数组的功能

集合在java.util包中

 

 

 

Java的集合类主要有两个接口派生而出:Collection和Map。Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

  • Collection是集合List、Set、Queue 的最基本的接口

  • Iterator:迭代器,可以通过迭代器遍历集合中的数据

  • Map:是映射表的基础接口

 

和数组的区别:

  1. 数组的长度固定,集合长度不固定

  2. 数组可以存储基本类型和引用类型,集合只能存放引用类型

    3迭代器:专门用来遍历集合的一种方式

-- hasNext()有下一个元素吗?如果有则返回true,否则false

--next();获取下一个元素

--remove();删除元素

 

 

2|0ArrayList【重点】

  • 数组结构实现,查询快、增删慢

  • JDK1.2版本,运行效率快、线程不安全

    源码分析: 默认容量:DEFAULT_CAPACITY=10

    注意:如果没有向集合中添加任何元素,容量是0

    存放元素的数组 elementDate

    实际元素个数 size

    扩容为原来的1.5倍

    add()添加元素

    public boolean add(E e) {
     
       ensureCapacityInternal(size + 1);  // Increments modCount!!
       elementData[size++] = e;
       return true;
    }


    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        //如果这里存放元素的数组=这个空的数组
           if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
               //这里由于DEFAULT_CAPACITY的值10大于minCapacity的值所以minCapacity为10
               return Math.max(DEFAULT_CAPACITY, minCapacity);
          }
           return minCapacity;
      }

       private void ensureCapacityInternal(int minCapacity) {
           ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
      }



       private void ensureExplicitCapacity(int minCapacity) {
           modCount++;

           // overflow-conscious code
           //如果10-0>0那么使用grow方法
           if (minCapacity - elementData.length > 0)
               grow(minCapacity);
      }



    private void grow(int minCapacity) {
           // overflow-conscious code
        //创建一个新的变量,把elementData.length的长度赋值给它
           int oldCapacity = elementData.length;
        //创建一给new的变量,把上面的变量加上本身右移一位   0>>1还是0
           int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果new的变量减去minCapacity<0,那么new的变量就为10
           if (newCapacity - minCapacity < 0)
               newCapacity = minCapacity;
        //这里的MAX_ARRAY_SIZE是非常大的值,所以不实现
           if (newCapacity - MAX_ARRAY_SIZE > 0)
               newCapacity = hugeCapacity(minCapacity);
           // minCapacity is usually close to size, so this is a win:
        //把newCapacity此时的值赋值给elementData,此时存放元素的个数就为10,数组扩容为10
           elementData = Arrays.copyOf(elementData, newCapacity);
      }
    
    

     

    Vector

  • 数组结构实现,查询快、增删慢

  • JDK1.0版本运行效率慢、线程安全

 

LinkedList

  • 链表结构实现,增删慢,查询慢

源码分析:

1.LinkedList

transient int size = 0;
//size集合大小

transient Node<E> first;
//first 指向第一个元素
transient Node<E> last;
//last指向最后一个元素

2.add方法

 

3|0Collection体系集合

  • List接口

    特点:有序,有下标,元素可重复

    它的类有

    1. ArrayList 【重点】

      1. LinkedList

  • Set接口方法全部继承collection

    无序、无下标、元素不能重复

    它的类有:

    1. HashSet【重点】

      • 基于HashCode计算元素存放位置

      • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入

    2. TreeSet--->SortedSet这个是用来排序的

      • 基于排列顺序实现元素不重复

      • 实现了SortedSet

      • 元素对象的类型必须实现Comparable接口,

      • 通过CompareTo方法确定是否为重复元素

 

Map集合

特点:用于存储任意键值对 -------- 存储一对数据

键:无序、无下标、不允许重复(唯一)

值:无序、无下标、允许重复

方法

  • V put(K key,V value)//将对象 存放到集合中,关联键值。key重复则覆盖原值

 

HashMap集合【重点】

  • 线程不安全,运行效率快;允许使用null作为key或是value

总结

  1. HashMap刚创建时,table是null,为了节省空间当添加第一个元素时,table的容量调整为64

  2. 当元素的个数大于阈值(16*0.75=12)时,会进行扩容,扩容后的大小为原来的2倍。目的是减少调整元素的个数

  3. jdk1.8中 当每个链表长度大于8,并且数组元素个数大于64时,会调整为红黑树,目的:提高执行效率

  4. jdk1.8 当链表长度小于6时,调整成链表

  5. jdk1.8以前 。链表是头插入,jdk1.8以后链表是尾插入

3|1Collection父接口

特点:代表任意类型的对象,无序、无下标、不能重复。

方法:

  • boolean add(Object obj)//添加一个对象

  • boolean addAll(Collection c)//将一个集合中所有对象添加到此集合中

  • void clear()//清空此集合中的所有对象

  • boolean contains(Object o)//检查此集合中是否含有o对象

  • boolean equals(Object o)//比较此集合是否与指定对象相等

  • boolean isEmpty()//判断此集合是否为空

  • boolean remove (Object o)//在此集合中移除o对象

  • int size() //返回此集合中的元素个数

  • Object[] toArray() //将此集合转换为 数组

 

 

3|2泛型

泛型的本质是参数化类型,把类型作为参数来传递

 

常见的形式有泛型类、泛型接口、泛型方法

 

语法

posted @ 2022-09-06 19:03  云散轻尘  阅读(26)  评论(0)    收藏  举报