(十)Java集合进阶2

目录

1.ArrayList

2.LinkedList

3.泛型

4.数据结构——二叉树

5.红黑树


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.红黑树

默认颜色:添加节点默认是红色的(效率高)红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的,红黑树增删改查的性能都很好,因为红黑树的旋转操作很少,最多的是修改颜色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值