JAVA学习总结(3)

ArrayList 和 LinkedList

ArrayList<>


ArrayList 在数组的基础上实现了自动扩容
ArrayList<> arralist = new ArrayList<>();
List<String> arralist = new ArrayList<>();
arralist.add()      添加元素
arralist.add(0,"呆子");       向指定位置添加元素
arralist.set(1,"八戒")     替换指定位置元素 
arralist.remove(int)      删除指定位置元素
arralist.IndexOF(int)/arralist.lastIndexOF(int)     正向/反向查找元素位置

import java.util.ArrayList;
public class ArraListDemo {
    ArrayList<String> al = new ArrayList<>();
        al.add("大王");   //添加元素
        al.add("二弟");
        al.add(0,"呆子");    //向指定位置添加元素
        al.set(1,"八戒");      //替换指定位置元素
        al.add("妖怪");
        al.set(2,"白骨精");
        al.remove(0);       //删除指定位置元素
        System.out.println(al);
        System.out.println(al.lastIndexOf("呆子"));         //正向/反向查找元素位置
//        System.out.println(al3);
    }
}


时间复杂度
1)通过下标(也就是 get(int index))访问一个元素的时间复杂度为 O(1),因为是直达的,无论数据增大多少倍,耗时都不变。
2)默认添加一个元素(调用 add() 方法时)的时间复杂度为 O(1),因为是直接添加到数组末尾的,但需要考虑到数组扩容时消耗的时间。
3)删除一个元素(调用 remove(Object) 方法时)的时间复杂度为 O(n),因为要遍历列表,数据量增大几倍,耗时也增大几倍;如果是通过下标删除元素时,要考虑到数组的移动和复制所消耗的时间。
4)查找一个未排序的列表时间复杂度为 O(n)(调用 indexOf() 或者 lastIndexOf() 方法时),因为要遍历列表;查找排序过的列表时间复杂度为 O(log n),因为可以使用二分查找法,当数据增大 n 倍时,耗时增大 logn 倍(这里的 log 是以 2 为底的,每找一次排除一半的可能)

LinkedList<>


链表

第一层叫做“单向链表”,我只有一个后指针,指向下一个数据;
第二层叫做“双向链表”,我有两个指针,后指针指向下一个数据,前指针指向上一个数据。
第三层叫做“二叉树”,把后指针去掉,换成左右指针。


LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("20时王");
linkedList.add(0,"《一号老爷子》");
linkedList.set(10,"《暗日重生》");
linkedList.remove():删除第一个节点
linkedList.remove(int):删除指定位置的节点
linkedList.remove(Object):删除指定元素的节点
linkedList.removeFirst():删除第一个节点
linkedList.removeLast():删除最后一个节点
linkedList.IndexOF(Object):查找某个元素所在的位置
linkedList.get(int):获取这个位置的元素

import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("1空我");
        linkedList.add("2亚极陀");
        linkedList.add("3龙骑");
        linkedList.add("4剑");
        linkedList.add("5555");
        linkedList.add("6响鬼");
        linkedList.add("7甲斗");
        linkedList.add("8电王");
        linkedList.add("9月骑");
        linkedList.add("10帝骑");
        linkedList.add("20时王");
        linkedList.add(0,"《一号老爷子》");
        linkedList.set(10,"《暗日重生》");
//        linkedList.remove(0);
//        linkedList.indexOf("空我");
        System.out.println(linkedList);
        System.out.println(linkedList.indexOf("8电王"));

    }
}

 ArrayList 和 LinkedList两者区别

  • ArrayList 基于动态数组实现,LinkedList 基于双向链表实现;
  • ArrayList 支持随机访问,LinkedList 不支持;
  • LinkedList 在任意位置添加删除元素更快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harden·Jr.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值