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(重写)是发生在类间,必须有继承,方法名相同、参数名相同、顺序、类型必须相同,返回值也相同(抛出异常可以相同,如果不同的话,子类抛出的异常一定是小于或等于父类的异常等级)