目录
1.ArrayList
- 利用空参创建的集合,在底层创建一个默认长度为0的数组
- 添加第一个元素时,底层会创建一个新的长度为10的数组
- 存满时,会扩容为1.5倍(不断变为1.5倍)
- 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
2.LinkedList
- 底层数据结构是双向链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的
- LinkedList本身多了很多直接操作首尾元素的特有API,addFirst()...
3.泛型
泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查,“看门老大爷”
泛型的格式:<数据类型>
注意:泛型只能支持引用数据类型
如果没有泛型,就可以往集合里添加任意数据类型
ArrayList list = new ArrayList();
list.add(1);
list.add("one");
list.add(new girlFriend());
没有泛型的弊端就是集合会把每个加入的元素转为Object类型,这样的话都不能访问子类的特有功能了,比如上方代码中 list[1].length() 会报错。
泛型的好处是统一数据类型,把运行时期的问题提前到了编译期间,避免强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
扩展点,Java的泛型是伪泛型,因为只是在往集合添加数据时加了一个限制,添加进去后集合仍然会把元素转换为Object类型,使用时再强转为泛型的类型,因为JDK5才有的泛型,只能这么改,不然在此之前的代码都会报错,这也是泛型中不能写基本数据类型的原因,比如int不能转变为Object类型,得是Integer才行。
public class MyArrayList<E> {
private int size;
Object[] obj = new Object[10];
public boolean add(E e) {
obj[size] = e;
size++;
return true;
}
public E get(int index) {
return (E) obj[index];//需要强转为E数据类型
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
public class test {
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<>();
list.add("a");
System.out.println(list.toString());
}
}
//输出为:
//[a, null, null, null, null, null, null, null, null, null]
//实现类给出具体类型
public class MyArrayList implements List<String>{
}
//实现类继承泛型,实例化对象时给出具体类型
public class MyArrayList<E> implements List<E>{
}
此时利用泛型方法有一个小弊端,此时他可以接受任意的数据类型或者只能接收一种数据类型。如果我们想要让泛型限定在某几种对象里面,就可以采用泛型通配符?,问号?表示不确定的类型
public static void test1(ArrayList<?> list) {}
public static void test2(ArrayList<? extends E> list) {}
//可以接收E和E的子类
public static void test3(ArrayList<? super E> list) {}
//可以接收E和E的父类
4.数据结构——二叉树
二叉树的演变如下:
二叉查找树满足小的在左边,大的在右边
平衡二叉树最为重要,任意一个节点的左右子树高度差不超过1,那么计算机是如何保持左右子树变成平衡二叉树的呢?——左旋和右旋
右旋同理
那么什么时候触发左旋什么时候触发右旋呢?当往左子树的左节点添加节点时,一次右旋即可;
5.红黑树
默认颜色:添加节点默认是红色的(效率高)红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的,红黑树增删改查的性能都很好,因为红黑树的旋转操作很少,最多的是修改颜色。