【List全家桶】之ArrayList&&LinkedList&&vector

前置知识泛型

我理解的泛型就比如你平时装米的袋子只能装米,装面的袋子只能装面,现在这个袋子啥都能装。
语法格式;<>
1、泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。
2.、泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。
3.、泛型是一种编译期间的机制,即 MyArrayList 和 MyArrayList 在运行期间是一个类型。
4、泛型是 java 中的一种合法语法,标志就是尖括号 <>
5、<>尖括号里面可以有多个变量,用逗号隔开。

Arraylist

底层数据结构:动态数组(顺序表)
元素类型:Object,即可以存放所有类型
特点:地址连续,一旦数据存储好了,查询操作效率会比较高,因为有下标,但同时也因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。它是线程不安全的

怎样定义Arraylist

1、创建一个无参的ArrayList集合
List<String> list = new ArrayList<>();
2、创建一个初始化长度为100的ArrayList集合
List<String> initlist = new ArrayList<>(100);
3、将其他类型的集合转为ArrayList,有参构造方法
List<String> setList = new ArrayList<>(new HashSet());

ArrayList的常用方法

1、arr.add(object);添加一个元素
2、arr.get(index);取出集合中的元素,在get方法的参数中,写入索引。
3、arr.size();返回集合的长度,即存储元素的个数。
4、arr.set(object);设置一个元素
5、arr.remove();移除一个元素
6、arr.clear():清空掉这个集合

import java.util.List;
import java.util.ArrayList;
public class ArrayList的常用方法展示 {
    public static void main(String[] args) {
        List<String> course=new ArrayList<>();
        course.add("计算机网络");//添加一个元素,add方法展示
        course.add("数据结构");
        course.add("JAVA语言");
        System.out.println(course);

        //get方法展示,在参数中传入索引
        System.out.println(course.get(0));

        //size方法展示
        System.out.println(course.size());

        //set设置方法展示
        course.set(0, "计算机基础");
        System.out.println(course);

        //remove删除方法展示
       course.remove(2);
       System.out.println(course);

        //subList截取部分方法
        List<String> subCourse = course.subList(0,2 );
        System.out.println(subCourse);
    }
}

运行结果
在这里插入图片描述
为什么线程不安全?

LinkedList:

底层数据结构:链表
特点:地址是任意的,插入和删除速度快,访问速度慢。适用于要头尾操作或插入指定位置的场景。也是线程不安全的。


import java.util.List;
import  java.util.LinkedList;
public class LinkedList常用方法展示 {
    public static void main(String[] args) {
        LinkedList<String> course=new LinkedList<>();
        //addFirst头插 addLast尾插 add(index,e)指定插
        course.add("语文");
        course.add("数学");
        course.add("英语");
        System.out.println(course);

        course.addFirst("美术");
        System.out.println(course);

        course.add(2,"网络");//指定位置插
        System.out.println(course);
        
        course.remove(3);//移除指定位置元素
        System.out.println(course);
        
        course.removeFirst();//移除第一个元素
        System.out.println(course);
        
        course.get(0);//获取指定位置元素
        System.out.println(course.get(0));
       
        course.push("first");//等同于addfirst
        System.out.println(course.get(0));
        
        course.poll();//等同于removefirst
        System.out.println(course);
        
        course.peek();//获取第一个元素但不移除
        System.out.println(course.peek());
        
        course.offer("laji");//相当于addlast
        System.out.println(course);
    }
}

在这里插入图片描述
ArrayList和LinkedList
共性:都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同。
区别:List接口的实现方式不同
ArrayList实现了List接口,以数组的方式来实现的,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好。LinkedList是采用链表的方式来实现List接口的,因此在进行insert和remove动作时效率要比ArrayList高。适合用来实现Stack(堆栈)与Queue(队列)。

Vector

与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,是线程安全的。(即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。)

猜你喜欢

转载自blog.csdn.net/chris__x/article/details/106843049