前置知识泛型
我理解的泛型就比如你平时装米的袋子只能装米,装面的袋子只能装面,现在这个袋子啥都能装。
语法格式;<>
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慢。)