【==】对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址
【equals】: 【object】中默认也是采用==比较,通常会重写
如果没有做特殊处理 【==】与 【equals】是区别不大的
像【String】重写了 【equals】 所以【String】【equals】 比较的是两个字符串的内容
【ArrayList】底层使用的是 【动态数组】,在内存中是连续的内存存储 适合下标访问 【get(0) 随机访问】
因为底层使用的是数组,所以有长度与扩容机制,
【扩容机制】:因为数组长度固定,超出长度时需要新建数组
原理就是: 新建一个new数组,然后将old数组数据拷贝到new数组
并且如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素)
但是 如果使用尾部插入 并且 指定初始大小 那么性能能够比LinkedList 更高(需要创建大量的node对象)
【LinkedList】底层使用的是【链表】在内存中是分散存储 就是【node】节点存储 适合插入 删除等写操作
缺点:遍历需要使用迭代器 iterator遍历,其他的性能会非常差(比如for 因为遍历时 get(i) 下标访问不友好 会一个个遍历) 非常不好用
而且 indexof 也会导致整个遍历
所以个人更喜欢 ArrayList
【LinkedList】额外实现了 【Deque】接口,说明【LinkedList】是一个双端队列,可以在头部和尾部新增
【ArrayList】底层数组 【LinkedList】底层链表 所以有一个最基本的区别 数组 查询快 增删改 写操作慢 链表 就相反 查询慢 增删改快
【ArrayList】 add(); 都是加在尾部的,但是【ArrayList】可能需要考虑扩容的性能
但是如果都指定 index add,那么【ArrayList】扩容以外还需要移动
而【LinkedList】需要遍历 如果下标很大 那么会更慢