• Java之Collection以及List实现类(ArrayListLinkedListVector)


    1.集合和数组的区别

    int[]  和  ArrayList 一个是int类型的数组(array) 一个是实现了collection集合接口的动态数组。

    (1)数组大小固定,集合大小不固定。

    (2)数组可以存储8大基本类型和引用类型(string、对象等),集合只能储存引用类型(对于基础类型有自动装箱拆箱)

    下图没用使用泛型 所以arrayList是默认的object类型的,所以才会都能传

    2.

     3.collection接口的方法

     

    4.集合的迭代器Iterator

    专门对于集合Colleciton遍历使用的工具。

     使用迭代器进行遍历

     

     当在迭代器迭代过程中 是不可以进行集合本身的remove方法的,

    需要使用迭代器的删除方法。不然会报并发修改异常。

     

    5.List接口

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

     (1)list的添加可以按照默认添加 也可以添加下标进行添加

     (2)同理 remove也有两种方式

     (3)ListIterator 对于list的迭代器

     可以按照前面所说的正向输出。

    也可以反向输出。

    反向输出的原理是:利用listItarator的previous方法进行向前遍历+声明时放进去list长度

    看了源码之后才明白 里面加上参数 表示迭代器从那个下标开始。从长度开始也就是最后了呗。

    返回某一元素的下标 indexOf。没有的话报-1

    在我们添加数据的时候

     我们可以添加元素为int类型的数字 是因为自动装箱

    但是remove时候需要注意 如果remove(3)的意思是删除第三下标的元素 并不是删除元素3

    可以使用下面方法 第二个显式被遗弃了

    6.list实现类

    7.对于两个对象是否相等(逻辑上相等 比如刘德华就是刘德华)

    我们需要在类里面 重写equlas方法

    8.<<1 >>1的概念

    左移<< 1位 :相当于乘2.例子:10的二进制数位1010 左移一位是 10100 相当于将每一位向前提了一位 10=8*1+4*0+2*1+1*0。左移后=2*(8*1+4*0+2*1+1*0)

    右移>>1位 :相当于除2.同理。

    9.ArrayList源码分析

    推荐博客;https://www.cnblogs.com/zhangyinhua/p/7687377.html

    首先来看属性值

    public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    {
        // 版本号
        private static final long serialVersionUID = 8683452581122892189L;
        // 缺省容量
        private static final int DEFAULT_CAPACITY = 10;
        // 空对象数组
        private static final Object[] EMPTY_ELEMENTDATA = {};
        // 缺省空对象数组
        private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
        // 元素数组
        transient Object[] elementData;
        // 实际元素大小,默认为0
        private int size;
        // 最大数组容量
        private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    }

    构造方法

    public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }
    public ArrayList(int initialCapacity) {
            if (initialCapacity > 0) {
                this.elementData = new Object[initialCapacity];
            } else if (initialCapacity == 0) {
                this.elementData = EMPTY_ELEMENTDATA;
            } else {
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            }
        }

     add方法

    add方法源码。调用下面的方法,目的是对于elementData元素数组进行需要时的扩容。

    当第一次调用add方法,到这一个步时size是0。传进来的参数是minCapacity=size+1。所以是1

    经过这个方法,minCapacity变为10,就是那个default默认大小值10.(所以ArrayList不存在1~9的大小)

     

    调用这个方法 传参是10.

    modCount是对于ArrayList结构体的改动(增删查等等)

     

    进行数组的新长度的增长。因为oldCaoacity是0所以newCaoacity是0.

    被第一个if语句赋值为10;

    新建乐意大小为10 的数组。

    10.vector的使用

    Enumration枚举类 进行遍历。

    11.LinkedList的使用(和arraylist差不多)

    底层:双向链表、不需要连续空间

    可以使用collection的迭代器 

    也可以使用功能更加强大的列表迭代器。

    12.transient关键字

    不会被序列化(静态变量也不会被序列化)

    13.LinkedList源码分析

     属性

    链表结点

     add方法

    将原本的链表最后一个结点作为新节点的前结点,然后将last结点转换为新节点

     

    14.泛型(注意是1.5开始的)

    15.泛型类

    注意:

    (1)泛型的类型只能是引用类型(不能是基本数据类型)

    (2)泛型类的实现类如果声明的类型不同 不能相互复制

    (3)泛型类可以声明多个类型<T,E,K> 或者一个

    来看一个例子。下面有个ClassGeneric的泛型类 里面有个泛型的属性

    public class generic {
        public static void main(String[] args) {
            ClassGeneric<String> classGeneric=new ClassGeneric<>();
            classGeneric.setT("hello generic");
            System.out.println(classGeneric.getT());
        }
    }
    class ClassGeneric<T>{
        T t;
    
        public T getT() {
            return t;
        }
    
        public void setT(T t) {
            this.t = t;
        }
    }

    16.泛型接口

    (1)第一种实现:在写实现类时声明 实现的接口的类型

    如下 实现的是String的接口 。重写方法里面也变成了String类型

    interface InterGeneric<T>{
        T print(T t);
    }
    class InterGenericImpl implements InterGeneric<String>{
        @Override
        public String print(String s) {
            return null;
        }
    }

    (2)第二种实现:将实现类同样变为泛型类

    实现类里面是 泛型的方法

    interface InterGeneric<T>{
        T print(T t);
    }
    class InterGenericImpl<T> implements InterGeneric<T>{
        @Override
        public T print(T t) {
            return null;
        }
    }

    17.泛型方法

    (1)在方法上声明<T> 声明位泛型方法 传参是泛型

    (2)在方法上声明<T> 返回类型也为T 作为泛型返回

    public <T> void show(T t){
            System.out.println(t);
        }
        public <T> T show2(T t){
            System.out.println(t);
            return t;
        }

    18.泛型集合

     这里面的后面的<>不需要写指定类型 叫类型推断。是1.7推出的新功能。

    19.

    • overload(重载)是发生在类内,名称必须相同,参数不一样,返回值没有区分性
    • override(重写)是发生在类间,必须有继承,方法名相同、参数名相同、顺序、类型必须相同,返回值也相同(抛出异常可以相同,如果不同的话,子类抛出的异常一定是小于或等于父类的异常等级)
  • 相关阅读:
    Linux system basic 2 + add kernel for Jupyter
    Linux package installation: deb and rpm
    classification tips 01: npy file
    how to activate XMind8 to pro version.
    Linux system 初步
    try_except_finally
    Postgresql Json Sql
    python package install error and little code bugs
    小程序用户操作事件
    套数据操作步骤
  • 原文地址:https://www.cnblogs.com/cckong/p/14433644.html
Copyright © 2020-2023  润新知