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(重写)是发生在类间,必须有继承,方法名相同、参数名相同、顺序、类型必须相同,返回值也相同(抛出异常可以相同,如果不同的话,子类抛出的异常一定是小于或等于父类的异常等级)
原文地址:https://www.cnblogs.com/cckong/p/14433644.html